Site Overlay

一般サラリーマンがテクニカル戦略をバックテストで検証してみた話 -導入編-

こんにちは。
普段はITエンジニアとして働いてますが、資産形成としてNISAでコツコツ長期・分散・積立をしてるごく一般的なサラリーマンです。本格的な金融やトレードはド素人です。そんな私が、いまやITエンジニアでは必須となっているClaude Codeを駆使して、今回から数回に分けて、検証プロセスを記事にしていこうと思います。テーマは「テクニカル分析は本当に長期的な資産形成の役に立つのか?」という、投資をやっている人なら一度は気になるであろう問いです。

検証の出発点になった問い

チャート分析の本を読むと、移動平均線やMACDのようなテクニカル指標を使えば「トレンドに乗って利益を伸ばせる」という話がよく出てきます。ただし、天井や底をピンポイントで当てられる人はどこにもいません。現実的なところを言えば、

天井・底を完璧に当てるのではなく、トレンドの60〜80%程度を機械的に取り続ければ、長期的にBuy & Holdより良い結果になるのか?

という問いのほうが、よほど実務的です。「感覚」や「後知恵」ではなく、実際に過去データへ機械的なルールを当てはめたらどうなるのかを、ちゃんと手を動かして確かめてみようというのが、このシリーズの出発点です。

まずはSPY・ドル円で試してみたが、外しました

最初に検証したのは、王道中の王道であるS&P500(SPY)と、身近なドル円(JPY=X)でした。戦略はテクニカル分析の基本であるMACD(12, 26, 9)です。ざっくりいえば「MACDがシグナルを下から上に抜けたら買い、上から下に抜けたら売って現金化する」という、教科書どおりのシンプルなルールです。

結果は、正直にいって期待外れでした。

銘柄期間Buy&Hold CAGRMACD CAGRBuy&Hold SharpeMACD Sharpe
SPY1993〜20268.91%3.58%0.550.37
ドル円(JPY=X)1996〜20261.10%-0.77%0.15-0.05

SPYはCAGR・Sharpe・最大ドローダウンのすべてでBuy & Holdに負けてしまいました。緩やかな右肩上がりの中に短期的なノイズが多く、MACDが細かく売買を繰り返す(この期間だけで369回)ことでリターンを削ってしまうのです。ドル円に至っては、MACDのCAGRがマイナスに転落しています。長期のレンジ相場や急激な相場変動が、トレンドフォロー型の戦略には構造的に不利に働くようです。

学習期間と検証期間を分けるWalk-forward検証(学習期間だけでパラメータを選び、見ていない検証期間で試す方式)でも、同じ傾向が再現されました。つまり「たまたま12/26/9というパラメータが悪かった」のではなく、SPY・ドル円という資産そのものに対して、MACDが構造的な優位性を持たないということです。

ここで一度、正直に立ち止まることにしました。都合の良い銘柄だけを探して優位性を「発見」するのは、後知恵バイアスと紙一重です。SPY・ドル円は検証対象から外し、現在はBTC-USD・ETH-USDに絞って検証を続けています。

BTC-USDでは何が起きたか

同じMACD(12, 26, 9)をBTC-USD(2014年〜)に適用すると、様相が変わります。

Buy & HoldMACD(サイジングなし)
CAGR51.56%65.75%
Sharpe0.961.34
最大ドローダウン-83.40%-48.71%

CAGR・Sharpe・最大ドローダウンのすべてで、MACDがBuy & Holdを上回りました。強い片方向トレンドが繰り返し発生しやすい資産では、機械的な追随がうまく機能するようです。

ただし、ここで話を終わらせると誠実ではありません。実弾投入を想定して、ボラティリティに応じてポジションサイズを調整する仕組み(VolatilityTargetSizer)と、致命傷を避けるためのストップロス(15%)を組み込んだ「本番構成」で同じ期間を測り直すと、数字はこう変わります。

Buy & HoldMACD(本番構成)
CAGR51.56%46.88%
Sharpe0.961.43
最大ドローダウン-83.40%-37.52%

リスク管理を組み込んだ本番構成では、CAGRという単純な比較でBuy & Holdに負けます。得られているのはSharpe・最大ドローダウンで測った「リスク当たりの効率」であって、絶対リターンでの優位性ではありません。下落局面でいったん現金化するコスト、つまりその後の急反発を取り逃す機会損失が積み重なるためで、これはトレンドフォロー戦略に共通する弱点です。

一方で、最大ドローダウンをBuy & Holdの-80%前後から-40%前後まで押さえる効果は、検証期間や通貨建てを変えてもかなり一貫して確認できています。「トレンドの一部を機械的に取り続けることで、暴落時の傷を浅くする」という、地味ですが実務的には一番使える効果だと感じています。

つまり、冒頭の問いへの答えは単純なYes/Noではありません。生のMACDシグナルだけを見ればYesですが、実弾投入に耐えるリスク管理を組み込んだ構成ではNo、というのが今のところの誠実な結論です。

検証で気をつけていること

このシリーズを通して、次の3点は毎回必ずチェックするようにしています。

  • Look-ahead bias(未来情報の混入)を入れない — 当日の終値で計算したシグナルは、翌営業日のポジションから反映させます。「今日の終値を見てから今日のうちに売買できる」という、現実にはあり得ない前提を排除するためです。
  • 過学習(overfitting)を疑う — パラメータを全期間で最適化すると、その期間のノイズにフィットしただけの見せかけの優位性が生まれやすくなります。学習期間と検証期間を分けるWalk-forward方式で、見ていないデータでも効くかを確認します。
  • Winner’s curse(選定バイアス)を疑う — 複数パラメータの中からSharpe最良の1つを選ぶ作業自体が、その期間固有のノイズを拾いやすくします。学習期間のSharpeが高くても検証期間で大きく崩れるケースが、実際に何度もありました。

このリポジトリに自動テストスイートはありません。小規模なリサーチスクリプトという位置づけなので、その代わりにこの3つの警戒姿勢を毎回の検証で崩さないようにしています。検証というものは、都合の良い結果だけを拾ってこない姿勢が一番大切だと思っています

次回予告

次回は「ポジションサイジング・ストップロス編」です。本番構成で使っているVolatilityTargetSizerとストップロスが、具体的にどういう理屈で最大ドローダウンを圧縮しているのか、パラメータをどう選んだのかを掘り下げていきます。

最後まで読んでいただきありがとうございます。ご質問やコメントはお問い合わせからよろしくおねがいします。