この記事の内容
この記事を読むと…
- 抽出リストと停止前の実行リストを区別する。
- 初期資本を含め各経路の最大下落を測る。
- 費用と停止の順序を手計算で確認する。
記事内で用語を調べる
バックテスト ドローダウン トレーディングプラン 期待値(損益の加重平均) ポジションサイズ(建玉数量)バックテストは一つの実現経路、simulationは指定した仮定から生成する経路です。数量規則と並べ替え・再抽出で最大下落は変わり得ます。未指定の本番口座の破産確率を検証済みと主張せず、模型の条件を明記します。
Monte Carloはどの模型から抽出するか
Monte Carloは指定模型から繰り返し乱数抽出する方法。固定金額リストのshuffleは順序を変えても全件合計を保持、復元抽出は同じ値を複数回選ぶため合計も変わります。勝敗独立・金額固定というparametric模型も別方式。数量が資本をどう更新するかまで決めます。
手計算用に初期1000単位、損益+200、−100、−100なら資本1000→1200→1100→1000、最大下落200/1200≒16.67%。順序−100、−100、+200なら1000→900→800→1000、最大20%。どちらも終わり1000です。初期資本もpeakへ含めないと最初の連敗の下落を過小評価します。
停止条件があると並べ替えで最終値も変わる
停止なしなら+300−150−150の合計は0。結果ごとに資本を確認し850USD以下で停止する条件を加えると、実行される結果も変わります。
横へスクロールすると全体を確認できます →
横にスクロールすると図全体を確認できます。
架空の費用後USD損益三つ。再投資・資金移動なし、各step全体の結果後に判定。850USDは練習用規則で助言ではなく、二経路は確率を表しません。Python random.shuffleは既存配列の並べ替えを説明しますが停止条件は別に指定した模型です。
抽出したリストと、停止規則で実際に実行したリストを分けます。資本制限・停止・数量変更がある戦略で過去損益を全て並べ替えて足すだけでは同じ動作になりません。
simulationが答える問いとpercentile
定義した模型から最大下落、しきい値到達、最終資本の分布を推定できます。各経路全体の最大下落を先に求め、その分布のpercentileを計算。時点ごとの資本percentile帯は一本の実行経路ではありません。補間方式と離散分布ではpercentile以下の割合が変わり得るため規約を記します。将来の確実な損失上限ではありません。
元の架空模型は独立200取引、勝率0.55、勝ち+100EUR、負け−80EURという固定金額。期待値は0.55×100−0.45×80=19EUR/取引、合計3800EUR。勝ち数Kなら最終利益180K−16000EURです。
| percentile | K | 最終利益EUR |
|---|---|---|
| 1% | 94 | 920 |
| 5% | 98 | 1640 |
| 50% | 110 | 3800 |
| 95% | 122 | 5960 |
これは模型の分布の計算値で、実施した1000回実験の結果と偽りません。有限simulationはこの周囲で変動します。200取引は必ず一年とは限りません。
Excelで初期資本を含めて計算
元の英語式による練習でA1=0.55、A2=100、A3=−80、A4=10000(架空EUR資本)。C1に=$A$4、D1に=C1、E1に0を置きます。行1は取引前です。
B2 =IF(RAND()<$A$1,$A$2,$A$3)
C2 =C1+B2
D2 =MAX(D1,C2)
E2 =(D2-C2)/D2B2:E2を行201までコピーすれば行2〜201の200取引。絶対参照のA入力は固定します。最終資本はC201、最大下落は=MAX(E1:E201)。このcash模型を実務へ使う前には停止・証拠金・支払不能の規則が別途必要です。
別経路は初期行ごとB:Eブロック全体を複製し$A$参照を維持。最終資本の下側5%・1%と、各経路の正の最大下落の上側95%を分けます。=PERCENTILE.INC(range,0.95)は補間する場合があり、最終利益の下側なら0.05または0.01。RANDは再計算されるため、見直す標本の値と仮定を保存します。日本語設定では引数区切りや表示・入力仕様を確認してください。
Pythonのbootstrapと共通乱数
Pythonは反復抽出に便利ですが、適切な式ならExcelも履歴抽出できます。bootstrapは仮定した固定勝敗だけでなく記録済み損益を使います。どちらも依存性、数量、費用、対象履歴を指定します。空でない費用後cash履歴と初期資本を用いて:
new_sequence = rng.choice(history,size=200,replace=True)
equity = np.concatenate(([initial_capital], initial_capital + np.cumsum(new_sequence)))初期状態を前に加え、経路ごとにrunning peakと下落を求めてから最大値を集計。data、seed、library version、期間、費用・停止条件を保存します。経路を増やすと計算上の乱数noiseは小さくなっても、市場の新観測は増えません。
比較を制御する共通乱数の模型:一様乱数Uが閾値より小さければ+1、それ以外−1。A=0.55、B=0.60という仮定なら期待値0.10と0.20、差B−Aは0.10です。同じUを使うと0.55≦U<0.60だけ差+2、ほかは0。差の分散は4×0.05−0.10²=0.19。独立乱数なら0.99+0.96=1.95。この比較のnoiseを減らしますが、市場の確率への不確かさを消さず、全ての戦略で有効とも限りません。
取引単位の復元抽出は観測値を保持しても順序と損失clusterを壊し、未観測のtail eventを作れません。依存が重要ならblock抽出や別のstressを検討し、履歴の不足も残します。固定cashと変動equityから毎回riskを計算する数量規則は同じ実験ではありません。
新しい円例:費用を引く順序で停止判定が変わる
初期200000JPY、全step後の資本が190000以下なら停止、三つの架空価格損益−8000、+16000、−8000を使います。まず費用0なら192000→208000→200000で停止せず三つ実行します。
次に各実行stepの別費用2000JPYを差し引いてから停止判定。最初に200000−8000−2000=190000となり停止、以後は実行しません。終わり190000で、未実行stepの費用も取りません。
三つを全て実行したと仮定すれば194000ですが、この停止規則の実行結果ではありません。価格損益だけで判定し、費用を最後にまとめて引くと最初の停止を見落とします。これは実際の口座losscutの仕組みではなく、費用を含む模型状態で判定する練習です。JPYへの換算で元のUSD・EURを置き換えていません。
判定時点の定義が模型の一部。費用は実行したstepだけ引き、その後で停止条件を確認します。
小さな画面では横にスクロールするか、図を拡大できます。数値と要点は下のテキストにも記載しています。
- 費用0の模型
- 終わり200000JPY – 192000→208000→200000、三step実行。
- 各実行step費用2000
- 終わり190000JPY – 最初の−8000−2000後に停止、後二stepは実行なし。
- 全件実行を誤って加算
- 194000JPY – 三step費用6000の仮想合計は停止規則に合わない。
模型の条件付き結果を実相場の保証にしない
独立固定勝率例は安定分布と独立性の仮定。Monte Carlo全般がこれに限られるわけではなく依存・変動regime模型もありますが、指定と検証が必要です。履歴との整合と外側のstressを確認します。
履歴の復元抽出では存在しないshockは見つからず、重複exposureと市場の範囲も要確認。walk-forwardは開発・評価期間を順に配置できますが、既に見たdataを未見へ戻さず、優位性の劣化を自動証明しません。
percentileは本番riskの確実な上限でも検証済み下限でもありません。失敗の定義、費用、未約定、gap、停止を別々に試します。毎回現在資本の5%を正確に失うだけの理想模型ならn敗後は初期×0.95nで有限nでは正。実際の停止資本・最低証拠金・大きな損失を入れれば別模型です。
最初に再現する四つの作業
- 履歴の件数・費用・risk・市場範囲を記録。小標本のtailは不確かでも100件という普遍的境界はありません。件数のために本番取引を増やさずdemo・履歴studyを使います。
- 三取引の二経路を手計算し、終値と下落を確認。標本を保存してから経路を増やします。一時間・1000回だけで模型の妥当性を証明しません。
- 正の下落なら95%側を確認。負号付き損益なら符号を記載。初期peakと数量規則を含め、riskを半分にしても必ず比例改善と決めず再計算。
- 履歴の市場範囲・単位・費用・規則を揃えて改訂結果を比較。中央値の低下だけで本番edgeの劣化原因を確定しません。
理解度を確認
練習の目安: 約2分.
答えと解説を見る
最初の−150で850。各step後に判定するため後の結果は加えません。
よくある質問
Monte Carloとは?
Excelの始め方は?
Pythonの実装で大切な点は?
限界は?
出典と検証
- docs.python.org
内容の参考資料。記事に記載した範囲と前提を確認してください。
- numpy.org
内容の参考資料。記事に記載した範囲と前提を確認してください。
- support.microsoft.com
内容の参考資料。記事に記載した範囲と前提を確認してください。
計算例には前提条件を明記しています。現在の市場データや提供会社の取引条件の代わりにはなりません。
