BOTのリターン分布や頻度をヒストグラム(相対度数表)で確認しよう!この章ではバックテスト編で作成したBOTの売買ロジックに、さらに移動平均線などのフィルターを加えてエントリー条件を絞ることで、もっと精度を上げることを目指します。その前にそもそもBOTの売買ロジックの期待値が一体どこから来ているものなのか、その特徴を理解しておく必要があります。BOTの強みや特徴を理解しないまま、成績指標などの数値だけを見ながら無闇にフィルターを加えてしまうと、本来のBOTが持つ利益機会を削ってしまう可能性があるからです。成績を評価する指標には、例えば、以下のようなものがあります。1)運用成績(≒CAGR)2)プロフィットファクター3)シャープレシオ4)MARレシオ運用成績については前章の「資金管理編」、プロフィットファクターについては「バックテスト編」のパラメーター探索の記事で解説しましたね。各々の指標の教科書的な説明は検索して調べてみてください。フィルターの有効性を検証する上で、当然これらの指標も使います。これらの数値を確認する前に、もっと単純かつ原始的なレベルで把握しておくべきことがあります。それがリターン分布の形状です。リターン分布の形状ご存知の方からすれば当たり前の話ですが、各トレードのリターンは正規分布ではありません。このフィルター編では、資金管理の方法の違いによる影響を排除するため、資金量に関わらず、常に1BTCだけ売買するものとします。リターン分布図の作り方は後半で解説します。1度リターン分布だけを拡大してみてみましょう。リターン分布図(点線は損益±0、オレンジは期待値)各トレードのリターン率の中で最も出現頻度が高い数値(最頻値)は-2%台です。-4~1%の範囲に集中しているのがわかります。このようにトレンドフォロー型のブレイクアウトBOTは、もともとの勝率が低いため、ほとんどのトレードは僅かなマイナスの結果に終わります。中心から離れたところをみると、右側にだけ末広がりに伸びているのがわかります。左右非対称なファットテールの形状です。試しに検証結果のうち、10%以上の損失に終わった回数と、10%以上の利益に終わった回数を比較してみましょう。以下のようにpandasで集計して出力してみます。左列は各ポジションを閉じたときの日時10%を下回るトレードは1回しか存在しない一方、10%を超えるトレードは17回も存在することがわかります。20%を超えるリターンは合計3回あり、そのうち1回はなんと40%ものリターンを生み出しています。トレードの時期やエントリーの方向にも極端な偏りはありません。たしかに昨年の11月や12月の暴騰相場で40%という驚異のリターンを出していますが、3月以降にも20%近いリターンを2回記録しています。この左右非対称性こそが、トレンドフォローBOTの利益の源泉です。ストップを用いない場合なお、この傾向について「ストップを入れてるんだから損小利大になるのは当たり前だろう」と思う方もいるかもしれません。これはトレンドフォロー戦略そのものの特徴です。確認のために、ストップを用いない場合もテストしてみましょう。SELL損切りを全く用いない場合、さらにリターンのバラツキは大きくなりますが、基本的な傾向は変わりません。左右非対称で右側に広がったファットテールの分布になっています。-10%を下回るトレードは6回しかなく、-15%を下回るトレードは1回もありません。+15%を上回るトレードは11回もあり、+20%を超えるトレードも5回に増えています。各リターン率の頻度では、最初の図を各リターン率の回数と頻度の表にしてみましょう。集計してみると以下のようになります。2%全トレードのうち半分は-5%以内の範囲の損失となり、逆に10%以上の大勝ちは10回エントリーしたうちの1回程度しかないことがわかります。フィルターを用いるときの注意点このようにトレンドフォロー型は、「たまに来る大勝ち」に賭けるタイプのトレード戦略です。多少勝率が悪くても、大きなトレンドに確実に乗ることが保証されているからこそ、全体で見るとプラスの期待値が生まれることを知っておかなければなりません。10~20%台の利益のトレンドを数回逃しただけでも全体のパフォーマンスは大きく悪化するため、逆張り型のBOTとは異なり、あまり無闇にエントリー条件を絞るべきではありません。自身のBOTの利益機会がどこにあるのかを理解していないと、間違ったフィルターでエントリー機会を絞ってしまい、本来のBOTが持つ優位性が損なわれてしまう可能性があります。次回から具体的なフィルターを使ってテストを行っていきます。2)収益指標の計算さて、では準備として今回のフィルター編で必要になる各成績指標の計算方法を確認しておきましょう。フィルターの有効性を検証する指標として、期待値やトレード回数、運用成績、ドローダウンなどの通常の指標に加えて、以下の指標を使います。いう変数に格納している前提で解説します。詳しくはこちらの記事を参考にしてください。1.MARレシオMARレシオは、運用成績を最大ドローダウン率で割った数字です。違う言い方をすると、資産が1%減るリスク(覚悟)を受け入れる代わりに何%のリターンが期待できるか、という指標です。分子にリターンをとって分母にリスクをとっているので、大きいほど良い数字になります。)なお、MARレシオに「いくつ以上なら良い」という数値目標はありません。これは分子に運用成績が含まれているからです。運用成績は「初期資金」と「資金管理の方法」によって全く違う数字になります。これはすでに資金管理編で確認した通りです。そのため、同じ資金条件でテストした場合のみ、比較可能な数値である点に注意してください。2.シャープレシオシャープレシオは、平均リターン(1回のトレードの期待値)をリターンの標準偏差で割った数字です。標準偏差とは、数字が中心の平均値からどのくらいバラついているかを表す数値です。これは先ほどのドンチアン・ブレイクアウトBOTの例をみると、凄くわかりやすいでしょう。-10.1%シャープレシオは、平均リターンを分子に、そのバラつき具合(標準偏差)を分母にとることで、リターンの安定性を図ります。高ければ高いほど毎回のトレードで安定したリターンが期待できます。round(records.Rate.mean()/records.Rate.std(),2)ただし先ほども述べたように、標準偏差といっても、チャネルブレイクアウトBOTのリターンは左右対称にバラついているわけではありません。各回の損失は非常に安定していて、リターンだけが極端に右側にバラついた形状をしています。このような場合、標準偏差が大きいことは必ずしも悪いことでないので、シャープレシオの数値にあまり拘る必要はありません。どちらかというと、勝率の高いカウンタートレード型のBOTに有効な指標だと思います。非常にシンプルでわかりやすく、この数値の中に、勝率・損益レシオ・期待値などの要素が総合的に含まれているため、もっとも信頼できる指標の1つだと思います。round(records[records.Profit>0].Profit.sum()/abs(records[records.Profit<0].Profit.sum()),2)ただし弱点として、勝率の悪さから生じる「連敗する確率」を一切考慮していないので、途中過程でどのくらいのドローダウンに見舞われる可能性があるかは、この数値からは全く見当がつきません。そのため、最初のMARレシオと併せて比較することが多いです。4.CAGR(年間成長率)これは単に「運用成績」を年率に換算しただけの数値です。同じ期間を使ってテストするのであれば、いままでどおり運用成績を使って問題ありません。1時間足と2時間足を比較する場合や、去年(~12月)と今年(~5月)を比較する場合など、前提のテスト期間が異なる場合は、年率に換算しないと比較できません。そこでCAGRを使います。通常は数年間の成績を1年の成長率に換算するのですが、BTCFXはテスト期間が短いので、テスト日数を1年に換算しています。100,2)なお、MARレシオの分子には本来、CAGRを使うことが多いです。BTCFXではテスト期間が1年に満たない場合も多く、最大ドローダウン率を等倍して年率換算するのはおかしいので、分子にはドローダウンと同じ期間の運用成績を使うことにします。以上で成績指標は完成です!3)リターン分布の相対度数表の作り方ではリターン分布図の作り方を確認しておきましょう。先ほどの図のように、どのリターン率がどのくらいの頻度で生じるか、という「頻度」を棒グラフにした統計図のことを相対度数表(ヒストグラム)といいます。使えば、以下のようなコードを2行書くだけで作れます。records.Rate,50,rwidth=0.9)plt.show()2番目の引数の「50」で、データを何区間に分類して棒グラフにするかを指定することができます。ここを「10」に設定すれば、以下のようにもっとおおまかな相対度数表を作れます。リターン率の相対度数表(10区間に分類)「100」に設定すれば、以下のようにさらに細かくなります。リターン率の相対度数表(100区間に分類)なお、ヒストグラムの作り方や引数の設定等は以下のページを参考にさせてもらいました。複数の表を並べてプロットするここでは「損益グラフ」と「リターン分布図」を並べて表示するようにしておきましょう。1行2列で表を横に2つ並べる、という意味です。subplot(2,1)にすれば、縦に2つの表が並びますし、subplot(2,2)にすれば、2×2で表を並べることができます。n%以上のリターンと損失の履歴を全て表示する最後に先ほどの「10%以上の損失に終わった回数と-10%以上の利益に終わった回数」を表示するコードを記載しておきます。))今回使用したコード今回のフィルター編では、資金管理の方法による違いの影響を排除するため「初期資金100万円でずっと1BTCだけ売買する」という条件でテストします。そのため、前回までのコードを修正して、「固定ロット/可変ロット」を使い分けてテストできるようにしておきます。あれば、エントリーサイズは全て1BTCで計算します。分割エントリー(増し玉)の設定は無効になります。難しいコードではないと思うのでご自身で確認してください。stop_price:flag["records"]["log"].append("{0}円の損切ラインに引っかかりました。stop_price:flag["records"]["log"].append("{0}円の損切ラインに引っかかりました。コメントをキャンセルメールアドレスが公開されることはありません。