手法 バックテストエンジン

第2章

バックテストエンジン

当社のバックテストエンジンは、イベント駆動型アーキテクチャで自社開発しています。取引判断を現実とまったく同じ形でシミュレートし、1本のバーずつ処理して、未来の情報は決して使用しません。

1. イベント駆動型アーキテクチャ

エンジンの中核となる設計原則は、ストラテジーが現在のバーとそれ以前のデータしか参照できず、未来のバーは決して参照できないという点です。これは運用ルールではなく、アーキテクチャによって強制されています。ストラテジーのコードが先のデータにアクセスすることは物理的に不可能です。

処理ループ(バーごと)

データフィード

OHLCVバーが到着

インジケーターエンジン

インジケーターを再計算

ストラテジーロジック

エントリー/エグジットルールを評価

注文生成

待機中の注文を作成

注文執行

次のバーの始値で約定

ポートフォリオ更新

損益、資産曲線

逐次処理

各バーは時系列順に1本ずつ処理されます。エンジンは厳密なカーソルを保持しており、バーTとそれ以前のすべてのバーは読み取れますが、バーT+1はまだ存在しません。

再現可能な出力

同じデータファイルと同じストラテジーパラメーターであれば、エンジンは毎回まったく同じ結果を出力します。ランダム性はなく、実行ごとの浮動小数点の差異もありません。

マルチアセット対応

エンジンは複数の銘柄に対して同時にストラテジーを実行でき、ポートフォリオレベルの資金制約や資産間の相関を考慮します。

2. シグナル生成

売買シグナルは、価格系列にインジケーター関数を適用して生成されます。バーTにおけるすべてのインジケーター値は、バーTの時点で利用可能なデータ、つまりバー0からバーTまで(バーTを含む)の価格のみを用いて計算されます。シグナルはその後、バーT+1の始値で実行されます。

# 簡略化した疑似コード——先読み禁止の仕組みを示す for T in range(warmup_period, len(bars)): current_bar = bars[T] # このバーのOHLCVのみ参照可能 history = bars[:T+1] # Tまでを含むすべてのバー # インジケーターは[0..T]で計算——未来のバーにはアクセス不可 sma_fast = mean(history.close[-20:]) sma_slow = mean(history.close[-50:]) rsi = rsi_func(history.close, period=14) # バーTでシグナル → バーT+1の始値で執行(次の関数呼び出し) if sma_fast > sma_slow and rsi < 70: queue_order(side='BUY', qty=position_size(), exec_bar=T+1)

対応インジケーターの種類

  • ▸ 移動平均(SMA、EMA、WMA、DEMA、TEMA、KAMA)
  • ▸ モメンタム(RSI、MACD、Stochastic、CCI、ROC)
  • ▸ ボラティリティ(ATR、Bollinger Bands、Keltner Channels、HV)
  • ▸ 出来高(OBV、CMF、VWAP、Volume Profile)
  • ▸ トレンド(ADX、Parabolic SAR、Ichimoku Cloud)
  • ▸ オシレーター(Williams %R、Ultimate Oscillator、MFI)
  • ▸ 統計(Zスコア、線形回帰の傾き、相関)
  • ▸ カスタム複合インジケーター(ストラテジー固有)

シグナルの種類

  • ▸ 買いエントリー/売りエントリー
  • ▸ 買いエグジット/売りエグジット(明示指定)
  • ▸ ストップロスのトリガー(価格ベースまたはATR倍数)
  • ▸ 利益確定のトリガー(固定目標またはトレーリング)
  • ▸ 積み増し/一部決済(ピラミッド型エントリー)
  • ▸ 時間ベースのエグジット(固定保有期間)
  • ▸ レジームフィルター(市場環境のゲート)
  • ▸ リスクベースのエグジット(ポートフォリオのドローダウン閾値)

3. 約定モデル

約定モデルは、注文がどのように約定するかを決定します。当社は、実際のパフォーマンスをやや低めに見積もる保守的な前提を意図的に採用しています。落胆するよりも、嬉しい誤算のほうが望ましいからです。

約定パラメーター

約定価格
次のバーの始値(T+1始値) 同一バーでの非現実的な約定を防止
スリッページ
1取引あたり0.05%(デフォルト) 流動性の高い銘柄向けの保守的な見積もり
手数料——香港
往復0.10% 香港の個人向け証券会社の一般的な水準
手数料——米国
往復0.05% 米国の証券会社の一般的な水準
手数料——日本/欧州
往復0.15% 地域ごとの高めのコストを反映
最小売買単位
各取引所の規則に従って適用 端株は不可
空売り
過去に認められていた場合のみ可 取引所のアップティックルールを適用
借株コスト
年率0.5%~5%(ストラテジーにより異なる) 売りポジション向け

なぜ次のバーの始値なのか?

多くの個人向けバックテストツールは、シグナルを生成した同じバーでの約定を認めていますが、現実にはそれは不可能です。バーTの終値でクロスが発生した場合、シグナルはバーが確定するまで分からないため、バーTの終値で取引することはできません。

当社のルール: バーTの終値でシグナル発生 → 注文を待機 → バーT+1の始値で約定。これが現実的に執行可能な最も早いタイミングです。
当社が決して行わないこと: バーTの終値、高値、安値での約定。これらの価格はバーが確定した後にしか分からないため、リアルタイムで取引することはできません。

4. ポジションサイジングモデル

ポジションサイジングは、各取引にどれだけの資金を割り当てるかを決定します。レポートで使用したサイジングモデルは、常にレポートのヘッダーに開示されます。ストラテジーごとに、リスク特性に応じて異なるモデルが用いられます。

固定比率(資産に対する%)

最も一般的

最も広く使われているモデルです。各取引で、現在の口座資産の一定割合をリスクにさらします。口座が増えればポジションサイズも比例して大きくなり、減れば小さくなります。

# 計算式
ポジションサイズ = 口座資産 × リスク% ÷ (エントリー価格 – ストップ価格)
# 例
口座:HK$100,000 | リスク:2% | エントリー:HK$10 | ストップ:HK$9 → サイズ = HK$2,000 ÷ HK$1 = 2,000株

固定金額

シンプルなストラテジー

口座の大きさにかかわらず、各取引に一定の金額を割り当てます。理解しやすい反面、口座の成長に応じた調整はできません。

# 計算式
ポジションサイズ = 固定金額 ÷ エントリー価格
# 例
固定:HK$10,000 | エントリー:HK$10 → サイズ = 1,000株

ボラティリティ調整(ATRベース)

トレンド系ストラテジー

ポジションサイズは、アベレージ・トゥルー・レンジ(ATR)で測定した銘柄の直近ボラティリティに反比例して調整されます。ボラティリティの高い銘柄は小さく、低い銘柄は大きくなります。

# 計算式
ポジションサイズ = (口座資産 × リスク%) ÷ (ATR(14) × ATR倍率)
# 例
口座:HK$100,000 | リスク:2% | ATR:HK$0.50 | 倍率:2 → サイズ = HK$2,000 ÷ HK$1 = 2,000株

ケリー基準(ハーフケリー)

上級者向け

ケリーの公式は、ストラテジーの過去の勝率とリスクリワード比に基づいて長期的な成長を最適化します。分散を抑えるため、公式の出力の50%であるハーフケリーを使用します。

# 計算式
f* = (W × R – (1–W)) ÷ R → ハーフケリー = f* ÷ 2
# 例
勝率:55% | リスクリワード比:2:1 → f* = (0.55×2 – 0.45)/2 = 32.5% → ハーフケリー = 資産の16.25%

5. ポートフォリオレベルのシミュレーション

ストラテジーが複数の銘柄を同時に取引する場合、エンジンはポートフォリオレベルの制約を適用します。これにより、無制限の数の取引を同時に保有できるという非現実的な状況を防ぎます。

資金配分

保有中のポジションはそれぞれ資金を消費します。エンジンは投下済みの総資金を管理し、残りの現金が最小ポジションサイズを下回る場合は新規エントリーを拒否します。ストラテジーで明示されない限り、レバレッジは使用しません。

最大保有ポジション数

各ストラテジーは、同時に保有できるポジション数の上限を定めています。上限に達すると、新規エントリーシグナルは待機となり、既存のポジションが決済されるにつれて約定します。これにより過度な分散を防ぎます。

ポートフォリオのドローダウンストップ

ポートフォリオ全体のドローダウンが設定可能な閾値(デフォルト:25%)を超えた場合、すべてのポジションが決済され、クールダウン期間中は新規エントリーが停止されます。これはリスク管理の規律をシミュレートしたものです。

リバランスとドリフト

マルチアセットのストラテジーでは、エンジンが定期的にポジションのウェイトを目標配分に戻すリバランスを行います。リバランスの頻度と許容範囲は、ストラテジーごとに設定できます。

6. 対応する時間軸

エンジンは複数のデータ解像度に対応しています。ストラテジーに適した時間軸は、保有期間とシグナルの頻度によって異なります。

時間軸 一般的な保有期間 ストラテジーの種類 対応状況
日足(終値) 5日~12か月 スイングトレード、ポジショントレード すべての市場
週足 1~6か月 トレンドフォロー、長期 すべての市場
月足 3~24か月 マクロ戦略、ファクターモデル すべての市場
4時間足 1~5日 短期スイング 香港、米国(集約により対応)
1時間足 4~48時間 日中スイング 香港、米国のみ
15分足 1~8時間 デイトレード 香港、米国のみ
5分足 30分~4時間 スキャルピング戦略 米国のみ(履歴は限定的)