🍣

Binance永久先物の時間足一本分のリターンと戯れる #2

2022/10/05に公開

(このメモはド素人の個人的な記録です。理論的な間違いや計算間違いが含まれている可能性が高いことにご注意ください)

マケデココミュニティへのリンクはこちらです。 https://market-api.dev/

きっかけ

Binance永久先物の時間足一本分のリターンと戯れる #1を書いて、マケデコで紹介された執行戦略を使ったとき、トレードごとの利益に対する手数料負担が重くても、どのくらい勝率が高ければ手数料負けしないかを計算することができるようになりました。

ただ、計算した勝率で本当に累積リターンが期待値通りになるのか怪しいと思ったので、シミュレーションをしてみることにしました。

検証データについて

  • 期間は2020/9/20(月) から2022/9/18(日)までとしました
  • 検証の対象とするリターンは、翌日クローズ価格から翌々日クローズ価格の対数リターン系列にしました
  • 銘柄はBTCUSDTを選択しました
  • 検証対称は1時間足としました

シミュレーションについて

  • 上記のデータの時間足ごとに勝率に基づいてランダムで勝敗を決めます
  • 勝敗に基づいて、時間足ごとに手数料込みの利益を求めます
  • 手数料込みの利益の累積和を計算して、折れ線グラフをplotします
  • この試行を256回繰り返します
  • 最後に、256回分の累積リターンの最終的な値の統計的な特性を表示します。

以下、かなり適当に書いたシミュレーションのpythonコードです。Google Colabで動かしました。

fig = plt.figure(figsize = (12, 8))

# df_pivot_logreturnはあらかじめ準備しておいた時間が行、各銘柄が列、対数リターンを値としたデータフレームです
series_btcusdt_logreturn = df_pivot_logreturn.loc[:, 'BTCUSDT']

df_simulation = pd.DataFrame()
df_simulation['logreturn'] = series_btcusdt_logreturn

array_cumsum_finalvalues = []

for i in tqdm(range(256)):
  df_simulation['rand'] = np.random.rand(df_simulation.shape[0])
  # ここの0.5を増やしたり減らしたりして勝率を調整します
  df_simulation['profit'] = np.where(df_simulation['rand'] >= (1 - 0.5), np.abs(df_simulation['logreturn']) - 0.0008, -(np.abs(df_simulation['logreturn']) + 0.0008))
  series_cumsum = df_simulation['profit'].cumsum()
  series_cumsum.plot(lw = 0.5)
  array_cumsum_finalvalues.append(series_cumsum[-1])

pd.Series(array_cumsum_finalvalues).describe()
fig.show()

結果

その結果、上記の表の数字を使った場合は大きな丸め誤差があってうまくいかないのですが、丸め誤差が少ない値を使って計算した場合には、想定通りの結果になっていることが分かりました。

BTCUSDT1時間足、勝率50%でのシミュレーション

この場合、手数料分の-0.08%が一回の取引でのリターンの期待値となります。シミュレーション期間は2年間ですので、2年分の累積リターンの期待値は-0.08 * 2 * 365 * 24 = -1401.06%となります。

この結果は、256回分のシミュレーション結果を平均した-14.06とよく一致しています。

BTCUSDT1時間足、勝率57.4705%でのシミュレーション

この勝率では、一回の取引あたりのリターンの期待値は0%になっているはずです。256回分のシミュレーション結果を平均した0.023%はとよく一致しています。

BTCUSDT1時間足、勝率66.8087%でのシミュレーション

この勝率の場合、リターンの期待値は1時間ごとに0.1%になっているはずです。期間は2年間なので、期待されるリターンは0.1 * 2 * 365 * 24 = 1752%となり、256回分のシミュレーション結果を平均した17.62とよく一致しています。

おわりに

  • 前回の記事で考えたことが間違っていないことが確認できてよかったです
  • 色々な執行戦略がありますが、一回のトランザクションで得られる値幅、トランザクションの間隔、そして勝率でその執行戦略の輪郭をつかむことができるような気がしてきました。ナンピンをする戦略や、複数銘柄を扱う戦略はどのように考えればいいのかは、よくわかりません
  • 難易度はともかく、シンプルな上下当てでも、精度よくできるならBotの体裁は整うことが分かりました
  • 実際にBotを作り、動かすときは、無数のシミュレーション結果のうち1本だけが選ばれます。どれだけ勝率がよくても運悪く原資を全て失うかもしれませんし、勝率が悪くても莫大な利益を出してしまう可能性があります。おっかないですね

Discussion