私たちの自動トレーディングシステムは前向きな期待値を持っていました:数学はチェックアウト、バックテストは素晴らしいように見え、最初は、それはお金を作りました。 これはコードのバグではなく、生産において何が重要かという根本的な誤解でした。 期待値の ほとんどのトレーディングチュートリアル、学術論文、オンラインコースは、期待値を最大化することを教えます。 E[profit] = Σ(probability_i × outcome_i) この数がポジティブであれば、あなたはトレードを取るべきです. あなたがこの数を増やすことができるなら、あなたはそれを最適化するべきです. シンプルでしょ? 生産を除けば、この最適化戦略には致命的な欠点があります。 . it doesn't account for the path you take to reach that expected value 私たちのシステムから現実のシナリオで何を意味するかを示そう。 出血システム 私たちの戦略は、波動的な市場における価格のピークをキャプチャするように設計されました。 各取引ウィンドウの可能な価格方向を分析する 四角形プログラミングを使用して位置サイズの最適化 スプレッドチャンスをキャプチャするためのトレードを実行する 紙面では、予想値は堅実にポジティブでした。 Day 1-3: Captured a major spike, made $15,000 トップページ 4日~12日:毎日小さな損失、合計$8000 Day 13-14: Another Spike, Made $12,000 より 15日~28日:徐々に出血、合計11000ドル 問題は? 私たちの最適化は構造的な偏見を開発していました。 彼らはしばしば大きな勝利をし、しばしば小さな金額を失ったポジションを体系的に取りました。 予想値の計算はこれがうまくいくと言いました:大きな勝利は最終的に補償するでしょう。 しかし「最終的には」無限の資本と無限の時間の地平線が必要です。 どちらもなかった。 違いを見る:シミュレーション これらのリスクコントロールが重要な理由を説明するために、同じ市場を1年間で取引する2つの戦略を比較してみましょう。 期待値に基づく攻撃的なポジションサイズ化で、チャンスが良いように見える場合に150%のリバウンドを使用します。 Strategy A (EV Maximization) : 同じ市場信号ですが、高尾リスク期間中に割合的なケリーサイズ(40%の攻撃性)とCVaRベースのポジション削減。 Strategy B (Risk-Controlled) 結果は重要なストーリーを物語ります。左のグラフをよく見てください - ほとんどのEV最大化パスは災害的に失敗しません。 彼らは単に...複合しません。 あなたはサワトウのパターンを見ることができます: 時々ピークアップ、それに続いて遅い侵入です。 これは、肯定的な期待値が欠けている潜在的な出血です。 いくつかの経路が500万ドルに達したことに気付くか? その外見者は平均146万ドルまで引き上げる。 価格はわずか136万ドルで、100コースのうち29コースは出発資本の下で終了します。 メディア In a backtest, you might have gotten lucky and seen one of those winner paths. In production, you get one random draw. 右のグラフは「退屈」であり、それが正確にポイントです。500万ドルまでの月面ショットはありませんが、災害的な引き下げもありません。リスク制御された戦略は、謙虚な成長の周りに緊密に集結しています。 これが生産の現実である:生き残る戦略は結合し、出血する戦略は、期待値計算が約束したことを問わず、何もしない。 What Expected Value Doesn't Capture(予想された価値が収集しない) 1.破壊の危険性 これはケリー基準によって公式化された古典的なギャンブルの問題です. ポジティブな期待値でさえ、あなたのポジションサイズが間違っている場合、あなたは 壊れろよ ウィル 考えてみてください:あなたは10万ドルの資本を持っており、60%の勝利確率を持つ取引は、あなたの賭けを倍増するか、それを失います。期待値はポジティブです (+20%)。 ケリーはあなたに、最適な賭けサイズは次のとおりです。 kelly_fraction = (p * b - q) / b # where p = win probability, q = loss probability, b = odds しかし、ここでは、私たちが制作で学んだこと: . even Kelly is too aggressive なぜか?なぜか: あなたの確率推定は間違っている(常に) 市場の変化(あなたの60%の利点が52%) ストレス下での相関関係(あなたがそれらを最も必要とするとき) 直ちに再バランスをとることができない(スリッピング、遅延、市場影響) 私たちは断片的なケリー(理論的なケリーの賭けの25〜50%)を使用した結果、あなたの利点を過大評価することの現実的なコストは破滅的です。 2. 極端な出来事における数的不安定性 ある朝、私たちのシステムは極端な天候の際に崩壊し、ソフトウェアの故障ではなく、数学的な故障でした。 私たちのコヴァリアンスマトリックスはシングルとなりました。最適化は解決策を見つけることができませんでした。私たちは、私たちの戦略が最もお金を稼ぐべき正確な条件の下で取引することができませんでした。 問題:我々は予想されたシナリオに最適化したが、極端な出来事には異なる相関構造がある。通常独立して動く資産は突然完全に相関する。 修正は予想値の計算よりも良いものではありませんでした。 : regularization from sklearn.covariance import LedoitWolf # Instead of sample covariance cov_matrix = np.cov(returns.T) # Use shrinkage towards structured estimator lw = LedoitWolf() cov_matrix_robust = lw.fit(returns).covariance_ これは極端な安定性のために通常の時間にいくつかの精度を削減します. あなたの予想値の計算は少し悪くなります. あなたのシステムはブラックスワンに生き残ります. タイム・ホリゾン・ミスマッチ バックテストでは現れない問題があります:予想値の計算では、大数の法則が働くまで十分に長く待つことができます。 生産では、できない。 我々は、我々のシステムが90日間のウィンドウで強力な肯定的な期待値を示したが、30日間のウィンドウで一貫してお金を失ったときにこれを発見した。 当社の資本提供者は、毎月パフォーマンスをレビューしました。当社のリスク限界は、最近の結果に基づいて四半期にわたって調整されました。当社が3か月間悪かった場合、長期予想値が何を言おうと、当社のポジション限界は削減されました。 理論的な戦略は、利益を確実に示すのに6~12カ月を要した。 我々は、我々の最適化に明確なタイムホリゾン制限を追加しなければならなかった。 def optimize_with_horizon_constraint(scenarios, max_horizon_days=30): """ Optimize not just for long-term EV, but for probability of positive returns within operational time horizon """ # Standard expected value ev = np.mean(scenarios) # But also: what'sthe probability we're profitable # within our actual time horizon? rolling_returns = pd.Series(scenarios).rolling(max_horizon_days).sum() prob_profitable_in_horizon = (rolling_returns > 0).mean() # Penalize strategies with low short-term win probability # even if long-term EV is great if prob_profitable_in_horizon < 0.6: return ev * 0.5 # Heavily discount return ev これは、理論上の期待値が少し低いが、運用上の制約の範囲内で利益を示す可能性が高い戦略を受け入れることを意味していた。 代わりに何を最適化するか 痛ましいレッスンの後、以下は私たちが最適化することを学んだもの: 1. Risk-Adjusted Returns with CVaR (CVaR) E(利益)を最大化するのではなく、CVaR(リスクにおける条件付き価値)を最小化する:最悪のシナリオの5%で予想される損失 import cvxpy as cp # Decision variable: position sizes positions = cp.Variable(n_assets) # Scenarios returns scenario_returns = get_price_scenarios() # shape: (n_scenarios, n_assets) portfolio_returns = scenario_returns @ positions # CVaR constraints alpha = 0.05 # 5% tail var = cp.Variable() u = cp.Variable(n_scenarios) constraints = [ u >= 0, u >= -(portfolio_returns - var), ] cvar = var + cp.sum(u) / (n_scenarios * alpha) # Optimize for return while constraining tail risk objective = cp.Maximize(cp.sum(portfolio_returns) / n_scenarios - lambda_risk * cvar) これは明らかに良い平均的な収益を有する戦略を罰するが、災害的な尾のリスクを有する。 2. モデルエラーに対する強度 私たちは、私たちのモデルが間違っていると仮定し、それを最適化します。 合理的な不確実性の範囲内: 最悪ケース # Instead of single expected return estimate mu_estimated = historical_returns.mean() # Assume uncertainty mu_lower_bound = mu_estimated - 2 * historical_returns.std() / np.sqrt(len(historical_returns)) # Optimize for worst-case in uncertainty range # (Robust optimization / minmax approach) これは、過度に信頼性の高いパラメータ推定から保護します。 3.Kelly-Constrainted Position Sizeing(ケリー制限位置サイズ) 私たちは明示的にKelly基準に基づいてポジションサイズを制限しますが、オプティマザーがより多くを望む場合でも: def kelly_position_limit(edge, volatility, capital, max_kelly_fraction=0.25): """ edge: expected return per unit risk volatility: standard deviation of returns max_kelly_fraction: fraction of theoretical Kelly to actually use """ kelly_full = edge / (volatility ** 2) kelly_fraction = capital * kelly_full * max_kelly_fraction return kelly_position 私たちは25%のKellyを厳格な制約として使用します。はい、これは期待値を減らします。 生産思考 期待値思考から生産思考への移行は哲学的である。 「どの戦略が最も期待される収益を持っているか?」 Research mindset 「どんな戦略が私の仮定を間違えると生き残るだろうか?」 Production mindset 以下は、私たちが行った実践的な変更です。 バックテスト:平均回収だけでなく、最悪の月の分析を追加 Position sizing: Conservative by default, with kill-switches for anomalies. (ポジションサイズ:保守的なデフォルトで、異常のためのキット・スイッチ) Risk metrics: Track CVaR daily, not only P&L(リスクメトリクス) モデル検証:すべての推定のパラメータ不確実性の30%を仮定する 災害計画:「モデルは完全に間違っている」シナリオのための明確なコードパス レッスン 期待値は美しい数学的概念であり、清潔で直感的で、理論的には最適です。 それも足りない。 生産では、あなたは確率分布に対して取引していない。 自分の不完全なリスクモデル 変化する市場 あなたのバックテストにない運用制限 「予想値はポジティブである」にもかかわらず、あなたの資本が日々減少するのを観察する心理的現実 生き残るシステムは、期待値が最も高いシステムではないが、モデルが間違っているとき、市場が変化し、ブラック・スワンが現れるときに強力なシステムである。 第一に生存のために最適化し、第二に収益性で期待値はその計算の一部ですが、客観的な機能ではありません。