前回のブログ更新から、既に2ヶ月が過ぎてしまいました。。。

「三日坊主には絶対にするまい」と思って始めたものの、なかなか実際に継続するのは難しいものですね。


単に個人的事情で言い訳になりませんが、急に仕事が忙しくなり、なかなかブログを更新する時間が取れなかった、というのが背景です。ですので今後もしばらくは週1ペース程度でしか更新できないと思いますが、たまにブログを覗きに来ていただければ有難いです。


というわけで、前回どこまでお話したかさえ忘れてしまっている状況でして…えーっと、そうでした!「パラメータを変えて再検証してみたところ、収益性が上がっているようだが、これは本当に収益性が上がったとみてよいのか、それとも単に誤差の範囲内なのか」ってお話をすることになっていたようです(苦笑)。


これを確かめるには、統計学でいうところの「仮説検定」という作業を行います。仮説検定の正確な定義は統計学の書籍をご覧いただくとして、ここでは例を挙げて考えてみることにしましょう。


折角ですので、これまでのブログで紹介してきたデータを使いたいと思います。


4月29日のブログで紹介した、

 1. 5日移動平均と25日移動平均がゴールデンクロスしたら、翌日の寄り付きで買い

 2. 5日移動平均と25日移動平均がデッドクロスしたら、翌日の寄り付きで売り

 3. 買いポジションでザラ場中にデッドクロスが発生したら手仕舞い

 4. 売りポジションでザラ場中にゴールデンクロスが発生したら手仕舞い

 5. エントリ後25営業日が経過したら、その日の大引けで手仕舞い

という条件で得られた結果

【勝敗】 23,130戦 8,310勝 14,590敗 230分 → 勝率は36.3%

【勝トレード】 平均利益率 9.36%

【負トレード】 平均損失率 5.02%

 →平均損益率 0.20%

【指標】 比率ベースのPF(プロフィットファクター) 1.06


というトレード結果に対して、その改善策として5月9日のブログで紹介した

 6. 日経平均の25日移動平均の傾きがマイナス、かつ終値が25日移動平均よりも下の場合は、

翌日の買いエントリは行わない。

 7. 日経平均の25日移動平均の傾きがプラス、かつ終値が25日移動平均よりも上の場合は、

翌日の売りエントリは行わない。
を条件に加えた場合の結果

【勝敗】 16,946戦 6,259勝 10,527敗 160分 → 勝率は37.3%

【勝ちトレード】 平均利益率 9.69%

【負けトレード】 平均損失率 5.03%

 →平均損益率 0.45%

【指標】 比率ベースのPF(プロフィットファクター) 1.15


を例に、この改善が統計学的視点からも「改善した」と言えるかどうかを確認してみましょう。


今回設定する仮説は「日経平均の条件を追加することによって平均損益率が改善した」とします。

この平均損益率ですが、トレードによっては数10%の利益であったり、逆に数10%の損失であったりと、色々な値から構成されています。損益率の分布を取ってみると、下の図のように多くのトレードが平均損益率に近いところに存在し、平均損益率から離れていくにつれ、その発生確率も下がっていくのが分かります。(厳密には移動平均を使ったトレードの場合、極めて高い利益率を示すトレードが一定比率で存在するため、このような綺麗な分布図にはなりません)

ダニーのシストレ広場

このような分布を正規分布と呼び、統計学の根幹をなす考え方の一つです。(正規分布って言葉、高校生の頃に数学の授業で聞いた記憶ありませんか?というわけで、申し訳ありませんが正規分布の話はここでは割愛します)


以降では、平均損益率が正規分布に従うと仮定して話を進めたいと思います。(正規分布に従うとみなしてよいか、いけないかを判定する方法もあるのですが、その話は別の機会にしたいと思います)


仮説検定では、平均損益率以外に、標準偏差と呼ばれる、上図の分布の散らばり具合を示す値も使います。大雑把に言うと、分布がピーク値に集中しているほど標準偏差は小さくなります。標準偏差の計算方法も、申し訳ありませんがここでは割愛します。(割愛ばかりですいません…)


では条件を増やす前と後で、検証結果がどうなったか、見てみましょう。

■条件追加前

 【トレード数】 N1 = 23,130 → 統計学的には「標本数(サンプリング数)」

 【平均損益率】 E1 = 0.20

 【標準偏差】 D1 = 9.61 → Excelの関数を使って計算可能です

■条件追加後

 【トレード数】 N2 = 16,946

 【平均損益率】 E2 = 0.45

 【標準偏差】 D2 = 9.73


ここで検定の精度を95%(統計学用語では「有意水準5%」と呼びます)、つまりこれから出そうとする検定結果が正しい確率を95%とすると、Z = (E2 - E1)/sqrt(D1/N2) の値が 1.96より大きいことが必要となります。ちなみにsqrtとは平方根(Square Root)、つまり√のことで、1.96はここでは決まりきった値と考えてください。(興味のある方は統計学のt分布表、というものを参照してください)


実際に計算してみると Z = 10.50 となり、1,96を超えましたので、最初に仮説として立てた「日経平均の条件を追加することによって平均損益率が改善した」は95%以上の確率で正しい、と言えることになります。


念のため、逆の仮説「日経平均の条件を無くすことで平均損益率が悪くなった」を検証してみます。この場合は、Z = (E1 - E2)/sqrt(D2/N1) の値が -1.96より小さいことが必要となりますが、計算結果は Z = -12.19 ですので、こちらの仮説も正しいことが分かりました。


既にお気づきの方もいらっしゃるかも知れませんが、今回は標本数が非常に多いために Zの値が大きくなり、仮説の正当性が確認できた、ということになります。


例えばトレード数を1/100にすると、Zの値は1/10になりますので、先ほどの Z = 10.50 は Z = 1.05 になってしまい、95%の確率では改善したと言えなくなってしまうのです。


サンプル数が少なすぎるとシミュレーション結果の精度が落ちる、というのはここに理由があるわけです。


本日も最後までお付き合いくださり、ありがとうございました。今回は数式も出てきて眠くなってしまったのではないかと心配です。。。

前回までのブログでは、移動平均という極めてベーシックな題材を用い、条件を変えてトレード結果が(少しですが)改善されていくのを見ました。


これをもう少し洗練する、あるいは全く別の指標(Indicator)を用いた手法に変えるのは、各人の自由だとは思いますが、ここで注意したいことをお話したいと思います。


パン・ローリングから出ている本なんかには載っている話なので、「今さら」と思う方もいらっしゃるかも知れませんが、結構重要な話だと思うので、敢えて書くことにします。


検証プロセスで私が述べたいことは主に次の2点です。

 1. フォワードテストを絶対に省かない

 2. 十分なトレード数を確保する

(過剰最適化などの話は検証プロセスと少し話がずれるので、また別の機会にします)


まず最初の1.「フォワードテストを絶対に省かない」ですが、意外にすっとばしている人が多い印象を持っています。例として過去10年間のデータを持っているのであれば、それをいきなり全部使って最適化するのではなく、数年分は敢えて使わずに、残りのデータだけでまずテストします。


そのデータの範囲内で最適化を終えた後、取っておいた残りのデータでも同等の結果が出せるかをチェックするのがフォワードテストです。ウォークフォワードテスト(Walk Forward Test)なんて言ったりもしますね。


「テスト、つまり机上では上手く言っていたけど、実戦になると散々…」なんて話を聞く場合、結構フォワードテストをやっていないケースがあるようです。勿論フォワードテストをしていても、実戦では予定通りに行かないこともあるかと思いますが、フォワードテストを省いた場合に比べたら軽微な差なのではないでしょうか。


もっとも最初から人を騙すことを目的とした商材を作るために、ウォークフォワードテストを省略するのであれば話は別ですが。プロフィットファクターも高く、かつ最大ドローダウンもほとんど無いようなロジックも、机上だけでいいなら結構簡単に作れてしまいますよ(笑)。


次の2.「十分なトレード数を確保する」ですが、これはネタ尽き防止のため(?)次回にしたいと思います。これは例えば「パラメータを変えたらトレード成績が良くなったが、これは本当に信じていいのだろうか?それともたまたまそうなっただけなのか?」という問いにも関係する話です。


少し統計学的な話にもなってしまうので、数学アレルギーの方は嫌がるかも知れませんが、システムトレードをする以上、私は無視することの出来ない話題だと考えています。(アクセス数が急減したらテーマを再考することになるかもしれませんが…)


それでは今回も最後までお付き合いください、ありがとうございました。

ゴールデンウィーク中、全くブログ更新しなかった反動で、2日連続でブログを更新してみたいと思います。(今後このペースで更新し続けられるか分かりませんが、出来るだけ頑張ってみます)


さて個人的には移動平均の話ばかりするのに少々飽きてきたのですが、「もう少しトレード成績を上げる」と言ってしまったので、前回に引き続きエントリ条件を厳しくしてトレード成績を改善してみたいと思います。


前回のブログの中で、移動平均を用いた日経平均のトレンドを見る方法について触れました。

 ① 移動平均線の向き(上向き or 下向き)

 ② 株価との位置関係(株価が移動平均より上 or 下)

の2点に着眼してトレンドを読む、というものでした。


今回はこの考え方を個別銘柄にも適用してみたいと思います。これまでに出てきた移動平均は5日、25日でしたので、今回はもう少し長期の移動平均である75日です。(別に75日でなくても構いませんが、良く使われる日数として75日を選びました)


移動平均を使ったトレードは場合によっては数週間保持する、所謂「スイングトレード」と呼ばれる手法になりますので、75日の移動平均は中期的なトレンドを見るのに良く使われるもので、今回のトレード手法にマッチした指標である、というのが採用の理由です。


今回はトレード数を減らしたいこともあるので、上記①と②の条件を同時に満たす場合のみエントリを執行することにしたいと思います。前回のトレード結果 16,946戦 6,259勝 10,527敗 160分(勝率37.3%、PF=1.15)を絞り込むと結果は


【勝敗】 9,769戦 3,676勝 5,993敗 100分 → 勝率は38.0%

【勝ちトレード】 平均利益率 10.32%

【負けトレード】 平均損失率 5.07%

【指標】 PF(プロフィットファクター) 1.25


となって、徐々にではありますが良くなってきましたね。ちなみにここまでくると、スリッページや手数料を入れても、かろうじて損益がプラスになってきます。ただし、トレード数およびドローダウンも大き過ぎるため、実用に耐える代物ではありませんが。


ところで、先ほどスイングトレードという話が出てきましたが、私の持っているシステムは基本的に日足データです。(当然日足から週足データ等を作ることは可能です)ですので、デイトレード向けの戦略を検証したりすることはできません。分足データを入手するのが困難だからです。それこそ東証から入手しようと思ったら、かなりのコストが掛かります。(誰か良い入手先を知っている人がいたら教えてください!)


日足の株価データ(csvファイル等)の入手先として考えられるのは、こんなサイトでしょうか。(URLは意図的に全角にしています)


 ・株価情報日経225先物(無料) www.edatalab.net/kabu/

  無料なのがやはり嬉しいですよね。このデータだけでも相当のことは出来ます。


 ・データゲット(有料) www.data-get.com/

  過去10年分のCD-ROMも売っています。信用データや分割データがあるのも便利


またプログラムを組んでYahoo!ファイナンスから一括ダウンロード、という手もありますが、上場廃止銘柄のデータは取得できないので、気をつけなければなりません。(銘柄を特定してシミュレーションするのであれば問題ないと思います)


FXでいうメタトレーダー(MT4)のように、デイトレにも対応可能なデータ取得から検証・自動売買までやってくれるオープンソフトがあればいいのになぁ、とついつい思ってしまうのでした。。。(スイングだと、どうしてもある程度のドローダウンは見込まないといけないので)


…いつの間にかMT4の話になっていた。。。本当に徒然なるブログになってしまいそうな感じです。

ゴールデンウィーク中、すっかりブログ更新をサボっていたら見事にアクセスが減ってしまいました。。。(まぁ気の向くままに書くのが主旨なので気にしていませんが、ちょっと淋しいな)


ところで皆様はゴールデンウィーク中、如何お過ごしでしたでしょうか?

私は普段週休1日の生活をしているため、ゴールデンウィークくらいは家族サービスをせねばと思い、アミューズメントパークとグルメ中心にいろいろと出掛けていました。(泊まりの旅行に行こうとしていたのですが、4月下旬から急に予約が入り出しているという情報を聞きつけ、旅行に行くのはやめました)


さて、前回は移動平均線のクロスオーバーを例に東証1部で検証してみたのですが、イマイチな結果に終わってしまったので、もう少しまともな結果にすべく、いくつか条件を変えて検証してみたいと思います。


前回は余りにもトレード数が多過ぎて非現実的だったので、今回はもう少し数が減るようにします。(ただし余りにも数が少ないと、統計学的に有意でなくなってしまうので注意は必要ですが)


まず試してみたのは、


【前回】 クロスオーバーが確認できたら、翌日の寄り付きで無条件で買い(売り)

  ↓

【今回】 クロスオーバーの翌日に、その日の高値(安値)を更新したら買い(売り)


です。これは実際の注文形態で言えば、【前回】が寄付の成行注文であるのに対し、【今回】がその日の高値(安値)を注文条件とした成行価格の逆指値注文になります。このように仕掛け/仕舞い条件は現実的に可能なものにしないといけません


この条件で抽出し、手仕舞い条件を前回と同じにして、シミュレーションをしてみたところ、


【勝敗】 11,119戦 4,579勝 6,460敗 60分 → 勝率は41.4%

【勝ちトレード】 平均利益率 8.87%

【負けトレード】 平均損失率 5.91%

【指標】 PF(プロフィットファクター) 1.06


ちなみにプロフィットファクターとは PF = 利益額 ÷ 損失額 で与えられる指標で、1が損益分岐点となります。条件を変えることで、確かにトレード数は減りましたが、結果は変わらないようですね。それに実運用を考えた場合、実際に発注がされなかったとしても、逆指値注文を入れるための資金は必要になるので、これじゃ余り意味ありませんね。ということで、この条件はひとまずボツにします。


。。。ここで今回のブログを終わってしまうと、あまりにも無意味なブログになってしまうので、もう少し踏ん張ってみたいと思います。


次に着目したのが、日経平均との連動です。想像は付くかと思いますが、日経平均が上がっているときは、多くの銘柄が上がりますし、逆もまたしかりです。つまり日経平均のトレンドに逆行する個別銘柄のトレードは控えた方が良い、ということになります。今回はトレンドフォロー系指標の代表格である移動平均を使ったシミュレーションをしていますが、これはオシレーター系指標を使う場合も基本同じです。


さて、これまで扱ってきた数万に上るトレード明細を見てみると、同じ日に買い注文と売り注文が混在しているのが分かります。これを日経平均のトレンドに沿ったものだけに限定してみたいと思います。


さて、では日経平均のトレンドをどう考えるか、という話になりますが、一口にトレンドといっても短期トレンドから長期トレンドまで様々なレンジが考えられます。(例えば超長期トレンドで言えば、日経平均は1990年のバブル期以降、ひたすら下降し続けていることになります)


今回は元々のトレード方針として、5日と25日の移動平均を用いているので、日経平均のトレンドを見るための指標として、25日移動平均線を使ってみることにします。他にも75日や200日なんかもあるので、これらも見るのもいいかも知れませんね。


移動平均線を使ってトレンドを見る場合、

 ① 移動平均線の向き

 ② 移動平均線に対する位置(移動平均より上か下か)

が分類のキーになります。


では実際にこれを抽出条件に適用してみたいと思います。シンプルに考えて、

 ① 移動平均線が上向きで

 ② かつ価格が移動平均より上にあるとき

は明確な下げ相場、という仮定をして、日経平均がこの条件を満たすときは、(空)売り注文は一切出さない、とします。(移動平均が下向きで、かつ価格が移動平均より上の場合は買い注文を控えます)


このときの結果は…、プロフィットファクターが少し良くなりましたね。


【勝敗】 16,946戦 6,259勝 10,527敗 160分 → 勝率は37.3%

【勝ちトレード】 平均利益率 9.69%

【負けトレード】 平均損失率 5.03%

【指標】 PF(プロフィットファクター) 1.15


25日の移動平均だけで日経平均のトレンドを見る、というのも無理があると思いますが、実際には大局を見て動く、というのはとても重要な考え方だと思います。細かい話を始めると長くなるので割愛しますが、結論だけ言うと、日経平均を用いた条件を効果的に組み込むと、シミュレーション結果は劇的に向上します。


まだまだロジックとしては全然使い物になりませんが、せっかくここまで来たので、もう少し粘って、シミュレーション結果を向上させてから、手仕舞い条件を変化させたりしてみたいと思います。(気が変わって別のことを書くかもしれませんが)


今後ともよろしくお願いします。

試しに(恐らく最も有名なトレード戦略のひとつである)「移動平均線のクロスオーバー(交差)をシグナルに用いた売買」を日本株式に適用して、その結果をお見せしたいと思います。


念のため、移動平均線のクロスオーバーについて少しだけ触れておきます。(この辺りの話はインターネットや書籍ですぐに見ることができるので、詳細を知りたい方はそちらをご参考にしていただければと思います)


【N日(単純)移動平均】 過去N日の終値の合計を日数Nで割ったもの


【ゴールデンクロス】 短期移動平均が長期移動平均を下から上に突き抜けることで、買いのサインと言われている(下図の左側)


【デッドクロス】 ゴールデンクロスの逆で、売りのサインと言われている(下図の右側)

ダニーのシストレ広場

基本的な考え方はこんな感じですが、これだけでは検証できませんので、システムに落とし込むための条件をより明確にしておく必要があります。今回はこんな感じでシミュレーションしてみました。


1. 短期移動平均の日数を5日、長期移動平均の日数を25日とする。(良く使われる数値、という理由で)


2. 市場が閉まった後(つまり終値ベースで)、ゴールデンクロスとなった場合に翌日の寄り付きで買い。デッドクロスとなった場合に翌日の寄り付きで売り(空売り)。


3. 以下の条件に合致するものだけを対象とする

  ・対象期間は2000/7/1~2009/6/30の10年間

  ・市場は東証1部のみ

  ・直近5日間の取引高がすべて3億円以上

  ・ゴールデン/デッドクロス発生時の終値が100円以上


4. エントリ後は、取引時間中に一瞬でもデッドクロスが発生した場合は、買いのエントリを手仕舞い。(空)売りの場合はその逆を行う。


5. エントリ後25日経過したら自動的に、その日の大引けで手仕舞いする。


ここで補足をすると、上記3の直近5日間の取引高3億円以上、というのはある程度売買が盛んな銘柄でないと、流動性が確保できず、非常にリスキーなので除外しています。(たとえば、「やばい!」と思って売ろうとしても、誰一人として買手がいないとしたら…想像しただけで怖いですよね)


あと終値が100円以上の銘柄に限定しているのは、低位株は値動きが激しいからで、今回は敢えて外しました。(逆に低位株を狙う人もいる、というのは分かっていますが…)


また実際には「信用銘柄」といって空売りが出来ないものもあるのですが、一部マスタ不備の関係で、売りポジションを建ててしまっている場合があるかも知れません。(ごめんなさい)


それではいよいよ検証結果の発表です!(勝敗および利益/損失率はスリッページや手数料等を含まない値で計算しています)


【勝敗】 23,130戦 8,310勝 14,590敗 230分 → 勝率は36.3%

【勝トレード】 平均利益率 9.36%

【負トレード】 平均損失率 5.02%

【指標】 比率ベースのPF(プロフィットファクター) 1.06


…まぁこんな単純なロジックで利益が出るわけ無いとは思っていたものの、余りにもトレード数の多さに閉口してしまいました。「こんな非現実的なトレード数じゃ議論にならん!」といわれても、「ごもっとも」としか言えません。あくまでシミュレーションということでご容赦ください。


参考までに、すべてのトレードにおいて、最小株数で取引した場合の総利益(スリッページ等を無視した利益)は\11,608,180-ですが、なにせこれだけのトレード数なので、スリッページや手数料、さらには空売り時の貸株料を入れたりしたら、ものすごい損失額になるのが目に浮かびます。


本当なら次に資金曲線や最大ドローダウンの計算をして…なんてことするのでしょうが、もう少し利益が出るルールにしてからが良さそうですね。少なくともそこらへんに転がっている手法で利益を出すなんて甘い考えは捨てたほうがいい、ということは分かっていただけたのでは、と思います。


ただ、せめてもうちょっといいサンプルが無いか、考えてみることにします。

こんなブログを最後まで読んでくださいまして、ありがとうございました。