バックテストの結果を読む
取引ごとにストラテジーを確認し、費用による違いを比較します。
最初のストラテジーが実行できました。今度は、シミュレーションの取引がルールに従っているか、表示された結果が何を意味するかを調べます。
デモデータは架空の価格列です。結果は動作確認に使えますが、実際の市場で期待できる収益を示すものではありません。
まず取引を1つ調べる
crossover_strategy.pyを長さ5と20で実行し、完了後に下のパネルのTradesを選びます。閉じていれば、右の矢印で開きます。
表には各取引のエントリーと決済のデータがあります。ロングなら、エントリーが買い、決済が売りです。
| 列 | 内容 |
|---|---|
Trade | 取引番号とエントリーID |
Entry time | エントリーの約定時刻 |
Entry price | エントリーの約定価格 |
Exit time | 決済の約定時刻 |
Exit price | 決済の約定価格 |
Qty | 数量 |
Profit | その決済済み取引の金額損益 |
Profit % | その取引の損益率 |

取引の行をクリックし、チャートでその期間を探します。エントリー前のクロスと、決済を引き起こしたクロスの両方を見てください。
元のプログラムにはcommission_valueもslippageもないため、これから加える費用は基本実行には含まれていません。まず、この単純な実行で方向、時刻、数量を確認します。
簡単な取引の損益を計算する
1単位を100で買い、103で売れば、価格差は3です。ポイント価値が1で費用がなければ、金額での損益も3です。
一般に、ロングの価格差による損益は次のようになります。
(決済価格 − エントリー価格) × 数量 × ポイント価値ポイント価値は市場メタデータの一部です。1単位のポジションで価格が1動いたときの金額を表します。この本のDEMOでは1です。
手数料は純損益を減らします。スリッページは約定価格を変えるので、すでに価格差に反映されています。変更後の価格から、同じスリッページをもう一度引く必要はありません。
Performanceビュー
Performanceは、実行全体の資産推移を示します。次の項目があります。
- Cumulative P&L:初期資金に対する資産の増減。
- Max drawdown:資産曲線の過去の高値から測った最大の下落。
- Final equity:最後に処理したローソク足での資産。
- Max run-up:資産の過去の安値から測った最大の上昇。

エクイティは、未決済ポジションの評価損益を含む場合があります。そのため、最後の資産が、初期資金と決済済み取引の利益合計に一致するとは限りません。最後に残ったポジションも確認します。
資産曲線は終点だけでなく、途中も見てください。同じ最終結果でも、下落幅や損失が続く期間は異なることがあります。
Statsビュー
Statsには、実行後の詳細な統計があります。Total Tradesで決済済み取引数、Net Profitでその純損益の合計を確認できます。
Profit Factorは、利益取引と損失取引の合計の比率です。総利益を総損失の絶対値で割ります。損失取引がなければ、通常の有限な比較値にはなりません。
勝率は、決済済み取引のうち利益になった割合です。それだけでは総利益は決まりません。多くの小さな利益を、少数の大きな損失が上回ることもあります。
取引が少ないと、集計が誤解を招きやすくなります。総取引数を他の指標と一緒に確認し、損失取引も個別に見てください。
Propertiesで費用を設定する
チャート下のパネルのStrategy propertiesの歯車を開き、Propertiesタブを選びます。初期資金、数量、費用を変更できます。
次の2回の実行を比較します。費用は例題用の値です。実際の市場の費用は別に指定してください。
- Initial capitalが10000、Order sizeが1 Contractsであることを確認します。
- Commissionを0.1にし、単位に**% of order value**を選びます。入力は
0.1です。 - Slippageを2 tickにします。
- Saveで保存し、Run Pyne codeを実行して完了を待ちます。

0.1%は10%ではありません。この欄の数値の単位はパーセントです。100の約定なら手数料は0.1になります。エントリーも決済も約定なので、どちらにも費用がかかる場合があります。
tickは、市場の最小価格刻みです。DEMOでは0.01なので、2 tickは価格差0.02です。スリッページは、成行注文の約定価格をストラテジーに不利な方向へずらします。
別の市場ではtickやポイント価値が違うこともあります。DEMOでの費用の解釈を、そのまま別の銘柄に当てはめないでください。
約定設定も比較条件の一部
Fill ordersのOn bar closeは、成行注文の時点に影響します。基本ストラテジーでは無効のままにし、シグナルから出した注文が次の始値で約定するようにします。
After order is filledは、約定後の再計算を指定できます。Using bar magnifierは、より短い時間足の詳細データで、足の内部の約定を調べられます。実行条件が変わるので、基本実行の比較では無効にしておきます。
設定を1つ変えただけでも、別の実行結果です。長さ、数量、費用、約定方法を一度に変えると、何が差の原因か分からなくなります。
比較した条件を残す
チャートのツールバーのOpen trades output CSVで取引の書き出しを、Open plot output CSVで描画値の表を開けます。プロジェクトのOutputにも結果ファイルがあります。
再実行する前に、残したい書き出しを別名でコピーします。結果のファイル名だけでは、すべての設定を識別できません。
自分のメモに、少なくとも次を記録します。
| 実行 | データ | 短期/長期 | 数量 | 手数料 | スリッページ |
|---|---|---|---|---|---|
| 基本 | DEMO | 5 / 20 | 1単位 | 0% | 0 tick |
| 費用あり | DEMO | 5 / 20 | 1単位 | 0.1% | 2 tick |
実際の実行結果も書き添えてください。この表は、自分で実行した値を使って埋めます。
自分で試す
費用なしと費用ありで、同じ取引を比較してください。エントリー価格、決済価格、利益を確認します。何が変わり、シグナルのルールでは何が同じでしょうか。
解答
移動平均とクロスは、手数料やスリッページから計算しないので、元のシグナルは変わりません。成行のエントリーと決済価格は、スリッページによって不利になる場合があります。手数料は純損益をさらに減らします。
直接比較できるのは、入力、数量、データ、約定方法が同じで、両方とも注文を実行できる場合です。
別のデータを選ぶ
デモの後は、PyneIDEのデータダウンロード機能で市場データも用意できます。価格、tickサイズ、数量制限、取引は異なる場合があります。先にデータを調べてから結果を比較してください。
- 左のPyneビューでDataの見出しにポインターを置きます。雲から下向きの矢印の**Download Data…**をクリックすると、Symbol Browserが開きます。Dataの見出しを右クリックしても選べます。
- Providerを選びます。画像は
ccxtです。この場合、Brokerで具体的なデータ提供元も選べます。 - フィルターに市場名を入力します。画像では
coinbaseのBTC/USD現物市場です。記号全体を確認してください。似た接頭辞でも別の市場の場合があります。 - Timeframeを
1D、Fromを365 days backにします。Toのnowは、ダウンロード時点までを指定します。 - Downloadをクリックし、完了を待ちます。

右の情報にあるmintickはtickサイズ、pointvalueはポイント価値、mincontractは最小数量です。自分のデータでも確認してください。データ提供元の利用可否や必要なアクセス権はサービスによります。ここでデータを取得することは、取引口座の利用ではありません。
取得したデータはDataに入ります。ストラテジーのチャート上部の市場名をクリックして選択画面を開き、新しいデータを選べます。チャートは再計算されますが、入力とストラテジーの設定は引き続き確認してください。
期間を指定しても、本数が保証されるわけではありません。提供元の保有期間、取引日、欠損期間も影響します。新しく取得するとデータ列が変わる場合があるので、比較に使うデータファイルとメタデータファイルは保存しておきます。
実行結果の意味
バックテストは、指定したルール、データ、実行モデルの組み合わせで計算します。コードが記述どおりに動くか、モデル内でどう振る舞うかを調べられます。未来のデータは結果に含まれません。
同じデータで何度もパラメーターを変えると、そのデータに合うルールを見つけることがあります。設定に使わなかった別の期間で調べるのは、それとは別の問いです。最終プロジェクトでは、正しい動作と設定の比較を分けて確認します。