勝率81.6%が出たら疑う|検証コードに先読みが入っていた話
銘柄選びの点数付けを作っていて、小型株を買う設定を試したら、勝率81.6%、利益は損失の11倍、10年で694万円という結果が出ました。うまくいったのではなく、検証のコードが間違っていました。その話を書きます。
これはAIを使った株の検証記録です。特定の売買をすすめるものではありません。
やろうとしていたこと
日本株から10銘柄を選んで持つ、という仕組みを作っていました。全銘柄に点数を付けて、上位から選ぶ。点数はモメンタム(勢い)、値動きの素直さ、財務、需給の4つを合成したものです。
問題は財務でした。手元にある証券会社のデータは「今日の時価総額」しか持っていません。過去に遡って検証するには、当時の時価総額が要ります。
思いついた復元方法
発行済株式数は短期間ではあまり変わりません。だったら、今の時価総額を今の株価で割れば株式数が出る。それに当時の株価を掛ければ、当時の時価総額が復元できる。そう考えました。
式にするとこうなります。
当時の時価総額 = 今の時価総額 × (当時の株価 ÷ 今の株価)
一見それらしく見えます。実際、私はこれで数日間検証を回していました。
数字がおかしい
できあがった結果がこれです。小型株、つまり復元した時価総額が小さい順に買う設定で、勝率81.6%。利益と損失の比は11.19倍。10年で694万円。
株の検証でこの数字は出ません。プロの運用でも勝率6割あれば優秀です。8割超えて、しかも利益が損失の11倍というのは、現実の相場では起きない形です。
この手のことは前にもありました。「エッジを見つけた」と思ったときは、まず自分の検証コードを疑う。過去に3回、全部コードの間違いでした。今回もそうでした。
右辺に「今の株価」が入っている
式をもう一度見ます。
当時の時価総額 = 今の時価総額 × (当時の株価 ÷ 今の株価)
右辺に「今の株価」があります。これが致命的でした。
ある銘柄が当時から今までに大きく値上がりしていたとします。すると「当時の株価 ÷ 今の株価」は小さくなり、復元された当時の時価総額も小さくなります。その後に値上がりした銘柄ほど、当時は小型だったと算出されるわけです。
「小型株を買う」という設定は、実際には「これから上がる銘柄を買う」になっていました。答えを見てから解答用紙を埋めていたことになります。勝率81.6%も当然でした。
気づけた理由と、気づけなかった時間
気づいたきっかけは数字の大きさだけです。式そのものを見直して間違いを見つけたのではなく、結果が良すぎたから式に戻りました。
裏を返すと、もし勝率が58%くらいの「ありそうな数字」だったら、そのまま採用していた可能性が高いということです。派手に間違えたから助かりました。
この式は結局使えないので、財務の項目は検証できないままにしました。過去の財務データを持っていないので、正直に「未検証」と書いて残してあります。埋められない穴は、埋めたふりをしないほうが安全です。
教訓というほどでもない教訓
検証のコードを書くとき、計算式の右辺に「今」の値が混ざっていないかを見る。これだけです。過去のある時点を再現しているつもりで、今の情報を持ち込んでいないか。
今回は「今の株価」でした。他にも、上場廃止した会社が最初からデータに入っていない、といった形で今の情報が紛れ込むことがあります。実際、使っているデータは10年分の全銘柄と言いながら、上場廃止が1件も入っていません。生き残った会社だけの記録です。これも別の形の同じ問題です。
うまくいった結果より、うまくいきすぎた結果のほうが危ない。そう思っておくくらいがちょうどいいと感じています。
(※これはAIを使った検証の記録です。特定の売買をすすめるものではありません。投資は自己責任でお願いします。)
