Tradeが提供している投資アルゴリズム開発プラットフォーム「QuantX」で、MFIを実装しました。Indexの略で相場の中でお金が買い、売りのどちらに流れているのかを株価と出来高を元に判断する、オシレーター指標のひとつです。定義式まず、高値をHigh、安値をLow、終値をClose、出来高をVolumeとします。Volume\\次に、前日比でTypicalPriceが上昇したn日のMoneyFlowの合計と、前日比でTypicalPriceが下落または変わらずだったn日のMoneyFlowの合計を求めます。n日は任意の日数ですが、一般的には14日が良く用いられているそうです。MoneyFlowMoneyFlowIndexはPositiveMoneyFlowの合計をNegativeMoneyFlowの合計で割った値のMoneyRatioを用いて求められます。#この部分に作成するアルゴの指標を書き込んで下さい。SELL")initialize(ctx)この関数は最初に一度だけ呼び出されます。初期化部分で今回扱う銘柄と値を決めています。Core30を用いました。ファナック、村田製作所は基本的に売買されません。_my_signal(data)まずPandasのfillna関数を使って欠損値(NaN)を穴埋めしています。ここでは、methodにffillを指定することで前の値で埋めています。次に変数mfiにPandasのDataFrameを代入しています。ここでは、indexにcp(終値(株式分割調整後)を穴埋めしたもの)のインデックスを用いています。TA-LibのドキュメントのMFIの形式に従ってfor文を用いてmfiに必要な値を代入します。ここでは、for文の中身がcp.items()の数だけ(指定した期間の日数回)実行されます。このfor文のsymはcpのカラム、つまり指定した証券コードです。tadoc.org.シグナル生成部分ではmfiの値が20未満の時、買いシグナルを、mfiの値が80より大きい時、売りシグナルを生成しています。下に例を示しておきます。mfiは定義式からも分かるように1から100までの実数値となります。Trueここでの、買われ過ぎのサインとしての80という値と売られ過ぎのサインとしての20という値はStockChartsのChartSchoolのMFIについての解説を参考にしました。current)この関数は日ごとに呼び出される関数です。これは例えば100日分のデータのバックテストをやる場合、100回呼び出される事になります。ここで株をどの位売買するかの決定や損切り、利益確定売りを指定します。この関数はエンジンから直接呼び出されます。変数dfにcurrent(dateの当日のデータとシグナルを含んだpandas.DataFrameオブジェクト)のコピーを代入しています。Truedf_buyは以下のようになります。(ここでは、表示の都合上split_ratio、high_price_adj、close_price_adj、low_price_adj、volume_adj、close_priceをsplit、high_a、close_a、low_a、close、vol_aと略記し、適宜四捨五入しています。DataFrameとなります。BUY")によってこの銘柄の総保有額が総資産評価額(現金+保有ポジション評価額)に対して指定の割合となるように注文を行ないます。引数はamountでここには割合(例:10%なら0.10)を指定します。第二引数はcommentでバックテスト結果に表示されます。詳しくはこちらのQuantX公式APIリファレンスを参照してください。SELL")とします。損益率:16.54%MaxDrawdown:-0.178累積損益が日経平均の変化を下回っています。損益率:1.12%MaxDrawdown:-0.18次に、シグナルの条件を以下のように変更したところ下のような結果になりました。損益率:3.91%MaxDrawdown:-0.058日経平均の変化に比べて累積損益の変化量がかなり小さいです。考察シグナルの条件を20から10、80から90に変更したところ極端にシグナル回数が減少しました。上記の引用にもありましたが、MFIが10を下回るか90を上回るのはかなり稀な出来事のようです。シグナルの回数が少なめの指標なので、採用する銘柄の数を増やしてもう一度バックテストをしてみました。Core30のみの場合と比べて、損益率、MaxDrowDownともに良い結果となりました。日経平均の変化と比べて累積損益が大きく上回っています。Core30のみの場合と比べて、損益率は悪化、MaxDrowDownは僅かに改善しました。最後に、シグナルの条件を20から10、80から90に変更し、もう一度バックテストを行いました。損益:38.73%MaxDrawDown:-0.166シグナルの条件を変える前と比べて、損益率、MaxDrawDownともに悪い結果となりました。Core30の場合と同様にMaxDrawDownが改善すると予想したのですが、そうはなりませんでした。損益:0.05%MaxDrawDown:-0.2シグナルの条件を変える前と比べて、損益率は僅かに改善しましたが、MaxDrawDownはこれまでの試行の中で一番悪い結果となりました。おわりに単一の指標のみを利用してうまく利益を出そうとすること自体ナンセンスかも知れませんが、今後複数の指標を組み合わせたり独自のアルゴリズムを作るにあたってどのような指標があるか学び、どのような結果が得られるのか知ることは意味があるのではないかと思います。Factory上で今回紹介したコードのバックテストを行うことが出来ます。https://factory.quantx.io/developer/9edcc98353544184b9253c6983874c34採用する銘柄を増やす時に、弊社インターンの小林さんの記事を参考にしました。免責注意事項このコードや知識を使った実際の取引で生じた損益に関しては一切の責任を負いかねますので御了承下さい。TradeはQuantXをはじめ、AIxITを活用した金融サービスを次々に世の中に打ち出していきます。upLoginユーザーは見つかりませんでした。