Pythonで取引戦略を構築する:バックテストが誤解を招く理由とリスク管理法

Bifu Editorial · 2026-05-25 · 8分で読めます


目次

Pythonを使えば取引アイデアのテストは高速に行えますが、同時に自分を欺くのも簡単です。セットアップ、データ、バックテストの落とし穴、そしてシステムの存続を左右するポジションサイジングとストップについて、実践的に解説します。

Pythonはあなたにエッジを与えない。テストベンチを与えるのだ。

2024年のクオンツファイナンス開発者調査では、Pythonの使用率は81.3%に上った。大手銀行も、フィンテックも、そしてコードに触れるほとんどの個人トレーダーも、最終的にはPythonにたどり着く。その理由は退屈だが正しい。ライブラリが充実しており、構文が邪魔にならず、生の価格系列からテスト済みのルールまでを半日で作り上げられるからだ。

ここで見落とされがちなのが、Pythonは測定器であり、戦略そのものではないという点だ。Pythonは悪いアイデアを喜んでバックテストし、美しい資産曲線を描いてくれる。重要なスキルはループを書くことではなく、どの結果が嘘をついているかを見極めることだ。ツールを、アイデアが実際のデータと現実のコストに耐えうるかどうかを確かめる手段として扱えば、その価値は発揮される。しかし、これを金のなる木として扱えば、高くつく教訓を静かに学ばされることになる。

後で自分を欺かないためのセットアップ

3つのライブラリでほとんどの作業が済む。NumPyは配列計算を処理する。pandasはDataFrameを提供し、価格や出来高のデータを操作する際にその中でデータを扱う。matplotlibは、何かおかしいと感じたときに凝視するためのチャートを描画する。

pip install numpy pandas matplotlib

エディタは、自分に正直でいられるものを選べ。PyCharmには本格的なデバッガと統合テスト機能があり、これは人々が認める以上に重要だ。「戦略はうまくいく」の多くは、1トレードをステップ実行すれば気づけたバグだったりする。VS Codeはより軽量で問題ない。Jupyter Notebookは探索には最適だが、実際に取引するものには危険だ。セルが順不同で実行され、未来のデータが変数に残って「過去の」計算に漏れ込むことが容易だからだ。ノートブックで調査する場合は、信頼する前に最終的なロジックをきれいなスクリプトとして再構築せよ。

最初のコミットからすべてをGitで管理せよ。コラボレーションのためではない。自分のためだ。火曜日に素晴らしいバックテスト結果だったものが、木曜日に壊れていた場合、バージョン履歴があれば、変更した1行を見つけ出せる。正確に再構築できない戦略は、信頼に値しない。

2つの戦略ファミリー、2つの異なる誤り方

ほとんどのシステム的なアイデアは2つのタイプに分類され、それぞれに特徴的な失敗のモードがある。それを最初に挙げておく価値がある。

トレンドフォロー はモメンタムに乗る。ルールはおおよそ次の通りだ:何かが動いている、それに乗り、止まるまで留まる。これはトレンドがランダムな偶然が示唆するよりも頻繁に持続するために機能する。そして、ほとんどの場合トレンドがないために、レンジ相場で小さな損失を重ね、その損失を補う大きな動きを待つことになるため、痛みを伴う。トレンドシステムは低い勝率と少数の大きな利益で成り立つ。ほとんどのトレードで負けることに耐えられなければ、本当に重要なトレードの直前にやめてしまうだろう。

平均回帰 は反対の賭けをする:価格が行き過ぎて、平均に引き戻されるというものだ。勝率が高く、それは素晴らしい感触を与える。しかし、価格が回帰せずにそのまま進み続けるその1回までだ。その1回のトレードで、長い連勝を帳消しにすることができる。ハードストップなしの平均回帰は戦略ではなく、カウントダウンにすぎない。

対称性に注目してほしい。トレンドフォローは頻繁な小さな損失を許容するよう求め、平均回帰はまれな大きな損失を生き残るよう求める。どちらが安全というわけではない。痛みの分散方法が異なるだけで、 実際に耐えられるドローダウンプロファイル によって、どちらを構築するかを決めるべきだ。

テクニカル分析——価格と出来高の履歴から再現可能なパターンを読むこと——は、ほとんどのPython戦略がコード化するものだ。ファンダメンタル分析—— underlying businessや資産を評価すること——は自動化が難しく、通常はシグナルではなくフィルターとして登場する。どちらかを選ばなければならないというルールはない。しかし、自分のコードが実際に何をテストしているのかを明確にしておくべきだ。

「取引成功の鍵は精神的な規律だ。知能が鍵なら、取引で利益を上げる人はもっとたくさんいるだろう。」 — ビクター・スペランデオ

この引用は飾りではない。戦略をコード化する目的は、判断を感情から、冷静なときに書いたルールへと移すことにある。 規律の問題は、コンピュータが注文を出すことで消えるわけではない ——それは、システムがアンダーウォーターになっている日に、実際にそのシステムに従うかどうかという問題に移るのだ。

データこそ、ほとんどのバックテストが間違う原因

戦略は、その基盤となるデータと同じ程度にしか正直ではない。データを入手するのは簡単な半分だ。

APIから価格を取得できる。Alpha VantageやYahoo Financeは無料枠、IEX Cloudはよりクリーンなフィード、Bloomberg、Refinitiv、Quandlなどの有料プロバイダーは、深みと信頼性が必要な場合に適している。学習目的であれば無料データで十分だ。ただし、無料フィードには欠損、時折の誤った値、そして時には静かに履歴を調整することがあることを認識しておくべきだ。

次にクリーニングが来る。ここで結果が静かに作り出されるのだ。

問題 一般的な修正 落とし穴
欠損値 平均値/中央値で補完、補間、または行を削除 周辺のポイントで補間すると、戦略が持っていなかったはずの未来のデータを忍び込ませる可能性がある
資産間の異なるスケール Min-Maxスケーリングで[0,1]へ、またはz-score正規化 データセット全体にスケーラーを適合させると、テスト期間の統計が訓練に漏れ込む
誤った値と外れ値 極端な値をフィルタリングまたは上限設定 上限を厳しくしすぎると、実際に戦略を破綻させるボラティリティの急上昇を正確に消し去ってしまう

記憶に焼き付けるべき2つの言葉は 先見バイアス生存バイアスだ。先見バイアスとは、戦略が判断時に持っていなかった情報を使用することだ。例えば、今日のエントリーに今日の終値を使う、まだ発生していないデータで計算された正規化などだ。生存バイアスとは、現在も存在する資産でのみテストすることであり、ゼロになったすべての企業を静かに削除し、「押し目買い」ルールを素晴らしく見せかける。これらは両方ともバックテスト結果を膨らませる。そして、探しに行かない限り、どちらも見えない。

正直なバックテスト、そして誰もモデル化しないコスト

データがきれいになれば、バックテストは機械的に単純だ。ルールを履歴に適用し、それが何を行ったかを記録し、結果を見る。機械的な部分は難しいところではない。出力を信じることこそが難しいのだ。

コストを無視したバックテストはフィクションだ。すべてのトレードはスプレッド、場合によっては手数料、そしてスリッページ——見た価格と実際に約定した価格の差——を支払う。頻繁に取引する戦略では、コストだけで印刷上の利益を実際の損失に変えることができる。悲観的にモデル化せよ。もしエッジがゼロコストでのみ生き残るなら、エッジは存在しない。

次に、オーバーフィッティングがある。これは最も魅惑的な失敗だ。十分なパラメータを追加すれば、過去を完璧に適合させることができる。2021年から2023年を完璧に捉えるように調整された曲線は、2025年について何も教えてくれない。防御策は古くて華やかさに欠ける。開発中に戦略が見たことのないデータを保持すること、異なる市場レジームでテストすること、そして「14」でなければ全体が崩壊するようなパラメータには疑いの目を向けることだ。ロバストなエッジは少しぼやけている。脆いエッジは鋭利で無価値だ。

チュートリアルが飛ばすシステムの半分

エントリーシグナルはすべての注目を集める。しかし、それらは機能するシステムの中で最も重要でない部分だ。

エントリールールは、いつ入るかを教える。それは、どのくらいの量か、いつ出るか、または自分が間違っていたことをどうやって知るかについては何も言わない。これら3つ——サイジング、エグジット、そして無効化——こそが、戦略を単なる勘から区別するものであり、シグナルと同じくらい明示的にコードに含まれるべきだ。

  • ポジションサイジング は、1回のトレードでどれだけの損失を被るかを決定する。固定比率モデル——アカウントの小さな一定割合を1トレードごとにリスクにさらす——は、1回の悪い判断が壊滅的なものになるのを防ぐ。 ポジションのサイズ設定方法は、何を取引するかよりも生存にとって重要であり、コード化するのは簡単だ。
  • ストップと無効化 は、エントリーする前に、そのアイデアが間違っていることを証明する価格を定義する。感情ではなく、水準だ。 ストップを置く場所は、セットアップの構造から決めるべきであり、その日にどれだけ損失を許容できるかから決めるべきではない。エグジットさせる価格がなければ、トレードは成立しない。
  • エグジットロジック は利益の出ているトレードも扱う。利益確定またはストップをトレーリングするルールは、良いエントリーを往復トレードではなく実現利益に変える。

これらを戦略の第一級の部分としてコード化し、バックテストでそれらを測定させよ。凡庸なシグナルと規律あるリスク管理を持つシステムは、通常、素晴らしいシグナルでリスク管理がないシステムよりも長持ちする。これはスローガンではない。実際に両方をテストしたときの資産曲線が示すものだ。レバレッジが関与すると、さらに重要になる。ポジションが逆行した場合、 証拠金請求や強制決済 により、仮説が展開する前に終わってしまう可能性があるからだ。

どこから始めるか

小さく構築せよ。1つの資産、1つの明確なルール、明示的なストップとサイジング、コストを正直にモデル化し、開発中に戦略が触れたことのないデータの塊。実行せよ。リターンだけでなくドローダウンも読め。最悪の期間は、実際に耐えなければならない期間であり、それが耐えられるかどうかを教えてくれる数字だ。そして、見たことを書き留めよ。そうすれば、次のバージョンは記憶ではなく証拠と議論できる。

Pythonはこれらすべてを高速にする。しかし、それらのどれも真実にはしない。あなたが正直であって初めて、この測定器も正直になる。そして戦略にコード化される規律は、 市場が不快にさせるときでも、それに従い続けるために必要な 規律と同じだ。このいずれも利益を保証するものではない。テストされたルールは、リスクを意図的に管理する方法であり、結果についての約束ではない。

Ready to put this into practice?

Pythonを使えば取引アイデアのテストは高速に行えますが、同時に自分を欺くのも簡単です。セットアップ、データ、バックテストの落とし穴、そしてシステムの存続を左右するポジションサイジングとストップについて、実践的に解説します。

Start trading

免責事項

This content is for educational purposes only and does not constitute financial, investment, legal, tax or trading advice. Digital assets, RWA products, gold-related products and forex products involve risk, including possible loss of principal. Always review product rules and risk disclosures before trading.