自家製クオンツ

ソフトウェア技術を使って金融や投資の考察をしています。

株主優待イベント投資 2022/05結果

 

株主優待イベント投資」を実践しましたので、その2022年5月優待分の結果を報告します。

 

私が実践した株主優待イベント投資手法は、羽根英樹さんの「イベントドリブントレード入門」に記載されていた方法を参考にしています。

 

yooce.hatenablog.com

 

違いを挙げると、私の場合は、株主優待権利付き最終日までの値動きの検証において、TOPIXとの乖離を見るようにしています。つまり、インデックス(TOPIX)よりも株価上昇が期待できそうな銘柄に投資するということですね。

 

それに加えて、以下の3点をクリアする銘柄に投資しました。

 

 

これらの条件は、「株主優待の権利を巡る需給の歪みがある」ということを確認できるものと考えています。

 

私が開発する「MagicalNuts」でこれらの確認を行っていまして、例えば、3月末が権利確定日のシダックス(4837)でいうと、下図は権利付き最終日前後の値動きをグラフ化したものです。ここから、権利付き最終日に向けた緩やかな株価上昇と権利落ち日の急落を確認できます。

 

f:id:yooce:20210328092735p:plain

 

また、下図は過去10年間の平均値動きの推移です。ここから、権利付き最終日に向けた値動き以外は、目立った値動きが無いことがわかります。

 

f:id:yooce:20210328093654p:plain

 

検証の結果、シダックスは権利付き最終日の60日前に買って5日前に売れば、ほぼ間違いなく(検証で100%の勝率)8.81%の利益、年率換算で40.06%のリターンが期待できることがわかっています。

 

f:id:yooce:20210328094620p:plain

 

今回はこのような3銘柄を選び、そのパフォーマンス結果は下表のようになりました。

 

 

同期間のTOPIX騰落率-3.42%に対して、4.05%とアウトパフォームしました。

株主優待イベント投資 2022/04結果

 

株主優待イベント投資」を実践しましたので、その2022年4月優待分の結果を報告します。

 

私が実践した株主優待イベント投資手法は、羽根英樹さんの「イベントドリブントレード入門」に記載されていた方法を参考にしています。

 

yooce.hatenablog.com

 

違いを挙げると、私の場合は、株主優待権利付き最終日までの値動きの検証において、TOPIXとの乖離を見るようにしています。つまり、インデックス(TOPIX)よりも株価上昇が期待できそうな銘柄に投資するということですね。

 

それに加えて、以下の3点をクリアする銘柄に投資しました。

 

 

これらの条件は、「株主優待の権利を巡る需給の歪みがある」ということを確認できるものと考えています。

 

私が開発する「MagicalNuts」でこれらの確認を行っていまして、例えば、3月末が権利確定日のシダックス(4837)でいうと、下図は権利付き最終日前後の値動きをグラフ化したものです。ここから、権利付き最終日に向けた緩やかな株価上昇と権利落ち日の急落を確認できます。

 

f:id:yooce:20210328092735p:plain

 

また、下図は過去10年間の平均値動きの推移です。ここから、権利付き最終日に向けた値動き以外は、目立った値動きが無いことがわかります。

 

f:id:yooce:20210328093654p:plain

 

検証の結果、シダックスは権利付き最終日の60日前に買って5日前に売れば、ほぼ間違いなく(検証で100%の勝率)8.81%の利益、年率換算で40.06%のリターンが期待できることがわかっています。

 

f:id:yooce:20210328094620p:plain

 

今回はこのような4銘柄を選び、そのパフォーマンス結果は下表のようになりました。

 

 

同期間のTOPIX騰落率-2.05%に対して、3.46%とアウトパフォームしました。あまり儲かっている感じはしませんが、指数と比べるとまだマシと言ったところでしょうか。

 

株主優待イベント投資 2022/03結果

f:id:yooce:20220405204754p:plain

 

株主優待イベント投資」を実践しましたので、その2022年3月優待分の結果を報告します。

 

私が実践した株主優待イベント投資手法は、羽根英樹さんの「イベントドリブントレード入門」に記載されていた方法を参考にしています。

 

yooce.hatenablog.com

 

違いを挙げると、私の場合は、株主優待権利付き最終日までの値動きの検証において、TOPIXとの乖離を見るようにしています。つまり、インデックス(TOPIX)よりも株価上昇が期待できそうな銘柄に投資するということですね。

 

それに加えて、以下の3点をクリアする銘柄に投資しました。

 

 

これらの条件は、「株主優待の権利を巡る需給の歪みがある」ということを確認できるものと考えています。

 

私が開発する「MagicalNuts」でこれらの確認を行っていまして、例えば、3月末が権利確定日のシダックス(4837)でいうと、下図は権利付き最終日前後の値動きをグラフ化したものです。ここから、権利付き最終日に向けた緩やかな株価上昇と権利落ち日の急落を確認できます。

 

f:id:yooce:20210328092735p:plain

 

また、下図は過去10年間の平均値動きの推移です。ここから、権利付き最終日に向けた値動き以外は、目立った値動きが無いことがわかります。

 

f:id:yooce:20210328093654p:plain

 

検証の結果、シダックスは権利付き最終日の60日前に買って5日前に売れば、ほぼ間違いなく(検証で100%の勝率)8.81%の利益、年率換算で40.06%のリターンが期待できることがわかっています。

 

f:id:yooce:20210328094620p:plain

 

今回はこのような10銘柄を選び、そのパフォーマンス結果は下表のようになりました。

 

f:id:yooce:20220405204909p:plain

 

同期間のTOPIX騰落率-3.17%に対して、-1.79%とアウトパフォームしましたがマイナスです。上で例にも挙げているシダックス(4837)で、2ヶ月連続のやらかしをしました。ホント、気をつけないといけません…。

 

とはいえ、体感より軽傷で済んだ印象です。

 

f:id:yooce:20220405205446p:plain

 

これはTOPIXの株価チャートですが、今回の銘柄はだいたい昨年12月頃に仕込んでいて、年明けの1月、2月は下降トレンドの一方、3月中旬からの巻き上げに救われた感じです。

 

MagicalNutsを使った暗号資産(仮想通貨)bot

f:id:yooce:20220309161512j:plain

先日の記事で、MagicalNutsが日中足に対応したと書きました。

yooce.hatenablog.com

日中足に対応して何がしたかったかと言うと、暗号資産(仮想通貨)botです。参入時期としては、3周遅れくらいな気はしますが…。

暗号資産botPythonで実装するのが一般的です。暗号資産取引所(特にCEX)は、板情報や注文、ポジションを取得できるAPIを提供しています。Web APIなのでどの言語でもコールできるのですが、Pythonによる実装が充実している印象です。例えば、複数の取引所のAPIコールをラップしたCCXTがあります。

github.com

最近では、まちゅけんさんによるpybottersもあります。

github.com

CCXTは広く使われ、実績のあるライブラリですし、pybottersは取引所が用意しているWebSocketによるリアルタイム通信に対応しているところが魅力です。(CCXTも対応しているが有料。)

C#による投資検証ライブラリ」と銘打つからには、MagicalNutsも取引所のAPIやWebSocketに対応すべきなのでしょうが、私は取引所とのやり取りの部分は実績のあるPythonのライブラリを使うことにしました。

一方で、売買戦略の実装はMagicalNutsを使うことにしました。自分で言うのもなんですが、MagicalNutsの売買戦略の書き心地は結構気に入っているんですよね。これをASP.NET Coreでホスティングし、同じマシン内でC#をサーバー、Pythonをクライアントとして連携させます。実際の挙動は次のとおりです。

  1. CCXTまたはpybottersでロウソク足や板情報を取引所から取得
  2. 取引所から取得したデータをMagicalNuts.BackTest.BackTestStatusに合わせてシリアライズ
  3. PythonからASP.NET CoreにJSONを送信
  4. ASP.NET Coreで受信したJSONをBackTestStatusにデシリアライズ
  5. BackTestStatusと売買戦略を使って注文情報を生成
  6. 注文情報をシリアライズしてPythonに返信
  7. Pythonで受信した注文情報をCCXTやpybottersで取引所に送信

今回、MagicalNuts.Sample.CryptoBotSampleというサンプルを用意し、GitHubにプッシュしました。

github.com

C#サーバーの方は、ASP.NET CoreらしくDI(Dependency Injection)を使っています。まず、売買戦略を提供するIStrategyProviderを定義します。

public interface IStrategyProvider
{
    IStrategy Strategy { get; }
}

売買戦略のインターフェースMagicalNuts.BackTest.IStrategyを持っているだけです。続いて、IStrategyProviderを実装します。売買戦略クラスを切り替えられるようにジェネリッククラスとしています。

public class StrategyProvider<T> : IStrategyProvider where T : class, IStrategy, new()
{
    private T _Strategy = null;
    public IStrategy Strategy => _Strategy;

    public StrategyProvider()
    {
        _Strategy = new T();
        _Strategy.SetUpAsync().ConfigureAwait(false);
    }
}

これを、ASP.NET CoreにDIします。

builder.Services.AddSingleton<IStrategyProvider, StrategyProvider<DonchianChannelBreakOut>>();

ここでは、MagicalNuts.Sample.BackTestSampleで実装したDonchianChannelBreakOutをほぼそのまま使っています。実際、namespace以外変えていません。バックテスト時のロジックをそのまま使えるというのがこの方法の最大のメリットです。

最後にコントローラーを用意します。

[ApiController]
[Route("[controller]")]
public class StrategyController : Microsoft.AspNetCore.Mvc.Controller
{
    [HttpPost]
    public ActionResult Post([FromServices] IStrategyProvider strategyProvider, [FromBody] string data)
    {
        BackTestStatus state = Utf8Json.JsonSerializer.Deserialize<BackTestStatus>(data);
        strategyProvider.Strategy.GetOrders(state, state.Orders);
        return Ok(state.Orders);
    }
}

DIからIStrategyProviderを受け取り、MagicalNuts.BackTest.BackTestStatusをクライアントからJSONで受け取ってデシリアライズします。これらを売買戦略に渡して注文を作り、それをステータスコードとともにシリアライズしてクライアントに返します。

Pythonクライアントの方は、pybottersの作者まちゅけんさんがDiscordで展開しておられたBybitのサンプルbotをベースにしています。DataStoreに溜めたロウソク足をMagicalNuts.Primitive.Candleに沿ってシリアライズするのと、C#サーバーに送信するデータをMagicalNuts.BackTest.BackTestStatusに沿ってシリアライズするところが主な変更箇所です。詳細はコードをご覧いただくのが良いと思います。

1点気を付けるところとして、このサンプルに動かすには、pybotters v0.10.0時点ではpybottesのbybit.pyのinitializeで、

elif resp.url.path == "/v2/public/kline/list":

となっているところを、

elif resp.url.path == "/public/linear/kline":

のように修正する必要があります。(まちゅけんさんも把握しておられるのですぐ直るものと思います。)

私はこの仕組みで実際に暗号資産botを運用しています。繰り返しますが、この方法はバックテストで良好な結果が得られた売買戦略をそのまま実践に流用できることが最大のメリットです。一方、PythonクライアントとC#サーバー間でシリアライズ、デシリアライズを挟みますので、特に高頻度取引のようにアジリティが求められるケースでは、このあたりのオーバーヘッドを嫌って、Pythonで完結させる方が望ましいという考えもあるかと思います。

MagicalNutsが日中足に対応しました

f:id:yooce:20220309104750j:plain

MagicalNutsはこれまで、最短の足を日足としていましたが、日中足に対応しました。できることが増えるパッケージは、MagicalNuts.UI.TradingChartとMagicalNuts.BackTestです。

MagicalNuts.Primitiveに足種を表すPeriodInfoを用意しました。

/// <summary>
/// 期間単位
/// </summary>
public enum PeriodUnit
{
    Second = 0, Minute, Hour, Day, Week, Month, Year
}

/// <summary>
/// 期間情報
/// </summary>
public struct PeriodInfo
{
    /// <summary>
    /// 期間単位
    /// </summary>
    public PeriodUnit Unit { get; set; }

    /// <summary>
    /// 期間
    /// </summary>
    public int Period { get; set; }

    /// <summary>
    /// PeriodInfo構造体の新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="unit">期間単位</param>
    /// <param name="period">期間</param>
    public PeriodInfo(PeriodUnit unit, int period)
    {
        Unit = unit;
        Period = period;
    }
}

足の単位と期間を表すもので、例えば「15分足」なら次のようにします。

var pi = new PeriodInfo(PeriodUnit.Minute, 15);

MagicalNuts.UI.TradingChartパッケージによるチャート表示では、TradingChart.SetDailyCandles()が非推奨となり、代わりにTradingChart.SetBaseCandles()を使用します。

Candle[] candles = ...

TradingChart chart = new TradingChart();

...

chart.SetUp();
chart.SetBaseCandles(null, candles, 2, PeriodUnit.Minute, 1);

この例では、分足のロウソク足を用意し、それをSetBaseCandles()で渡しています。

f:id:yooce:20220309131800p:plain

また、足種の変更では、TradingChart.CandlePeriodが非推奨となり、代わりにTradingChart.PeriodInfoを設定します。

chart.PeriodInfo = new PeriodInfo(PeriodUnit.Hour, 1);

この例では時間足に変更しています。もちろん、用意したロウソク足の足種より短い期間の足種を表示することはできません。

MagicalNuts.BackTestパッケージによるバックテストでは、これまで日中足以外のバックテストができなかったのですが、バックテストの設定を表すMagicalNuts.BackTest.Argumentsを次のように作れば、日中足以外のバックテストが可能です。

var args = new Arguments(strategy, new BackTestCandleCollection(candles, new Stock(code, code, 100)), begin, end, PeriodUnit.Minute, 15);

このargsを使えば15分足でのバックテストが可能となります。

github.com

株主優待イベント投資 2022/02結果

株主優待イベント投資」を実践しましたので、その2022年2月優待分の結果を報告します。

 

私が実践した株主優待イベント投資手法は、羽根英樹さんの「イベントドリブントレード入門」に記載されていた方法を参考にしています。

 

yooce.hatenablog.com

 

違いを挙げると、私の場合は、株主優待権利付き最終日までの値動きの検証において、TOPIXとの乖離を見るようにしています。つまり、インデックス(TOPIX)よりも株価上昇が期待できそうな銘柄に投資するということですね。

 

それに加えて、以下の3点をクリアする銘柄に投資しました。

 

 

これらの条件は、「株主優待の権利を巡る需給の歪みがある」ということを確認できるものと考えています。

 

私が開発する「MagicalNuts」でこれらの確認を行っていまして、例えば、3月末が権利確定日のシダックス(4837)でいうと、下図は権利付き最終日前後の値動きをグラフ化したものです。ここから、権利付き最終日に向けた緩やかな株価上昇と権利落ち日の急落を確認できます。

 

f:id:yooce:20210328092735p:plain

 

また、下図は過去10年間の平均値動きの推移です。ここから、権利付き最終日に向けた値動き以外は、目立った値動きが無いことがわかります。

 

f:id:yooce:20210328093654p:plain

 

検証の結果、シダックスは権利付き最終日の60日前に買って5日前に売れば、ほぼ間違いなく(検証で100%の勝率)8.81%の利益、年率換算で40.06%のリターンが期待できることがわかっています。

 

f:id:yooce:20210328094620p:plain

 

今回はこのような銘柄を7つ選び、そのパフォーマンス結果は下表のようになりました。

 

f:id:yooce:20220302085250p:plain

 

はい、やらかしてしまいました…。同期間のTOPIXに対しアンダーパフォームしており、2つヒドイのがあります。

 

特に、ヨシムラ・フード・ホールディングス(2884)が目も当てられない結果で、下落トレンドにしっかり付き合ったかたちです。

 

f:id:yooce:20220303201327p:plain

 

前述の条件による銘柄選定時の判断は、今見ても間違っているとは思えませんでした。つまり、当時この銘柄を避ける判断は私にはできなかったと思います。

 

株主優待イベント投資において私は、想定より早期に期待以上の結果が出た場合、その時点で手仕舞いするようにしています。逆に言えば、想定より悪い状態に陥った場合に損切りすべきです。

 

今回は、期待値があったこともあり、いずれ戻るだろうということで短期的な塩漬けをしてしまいました。自分の弱さが出てしまい、反省すべき投資となりました。

 

株主優待イベント投資 2022/01結果

株主優待イベント投資」を実践しましたので、その2022年1月優待分の結果を報告します。

 

私が実践した株主優待イベント投資手法は、羽根英樹さんの「イベントドリブントレード入門」に記載されていた方法を参考にしています。

 

yooce.hatenablog.com

 

違いを挙げると、私の場合は、株主優待権利付き最終日までの値動きの検証において、TOPIXとの乖離を見るようにしています。つまり、インデックス(TOPIX)よりも株価上昇が期待できそうな銘柄に投資するということですね。

 

それに加えて、以下の3点をクリアする銘柄に投資しました。

 

 

これらの条件は、「株主優待の権利を巡る需給の歪みがある」ということを確認できるものと考えています。

 

私が開発する「MagicalNuts」でこれらの確認を行っていまして、例えば、3月末が権利確定日のシダックス(4837)でいうと、下図は権利付き最終日前後の値動きをグラフ化したものです。ここから、権利付き最終日に向けた緩やかな株価上昇と権利落ち日の急落を確認できます。

 

f:id:yooce:20210328092735p:plain

 

また、下図は過去10年間の平均値動きの推移です。ここから、権利付き最終日に向けた値動き以外は、目立った値動きが無いことがわかります。

 

f:id:yooce:20210328093654p:plain

 

検証の結果、シダックスは権利付き最終日の60日前に買って5日前に売れば、ほぼ間違いなく(検証で100%の勝率)8.81%の利益、年率換算で40.06%のリターンが期待できることがわかっています。

 

f:id:yooce:20210328094620p:plain

 

今月は1銘柄だけですが、そのパフォーマンス結果は下表のようになりました。

 

f:id:yooce:20220212145215p:plain

 

年始からの強烈な下げ相場の印象が強く、全然儲かっている気がしていなかったのですが、アウトパフォームしていました。

 

f:id:yooce:20220212162621p:plain

 

権利落ち日の下落が凄まじいですね。-10%以上です。まあ、こういう銘柄を狙ってはいるのですが…。