システムトレードでは、過去の株価データに基づいて、ストラテジーを検証します。
しかし、それは一つのシナリオでの評価にしか過ぎません。
そこで、出来上がったストラテジーの勝率、利益率、損益率、資金量で複数回シミュレーションしたらどのような結果になるかPythonを使って評価してみました。
# ライブラリーの導入
import pandas as pd
import matplotlib.pyplot as plt
import random
# 評価用の関数
# asset 初期資本
# bet 資本の何%を投入するか
# probability 勝率
# win 平均利益率
# loss 平均損率
# transaction 取引回数
def sim(asset, bet, probability, win, loss, transaction):
result = []
for i in range(transaction):
# 乱数が勝率以下なら勝ち
if random.random() < probability:
# 資産は、投入した資産かける平均利益率分増える。
# 今回は複利ですが、このあたりを変更すれば単利にできます。
asset = asset + (asset * bet * win)
# 負けた場合、投入した資産かける平均損率分減少する。
else:
asset = asset - (asset * bet * loss)
# 取引結果をリストに格納する。
result.append(asset)
return result
# 評価用の関数2
def mon(asset, bet, probability, win, loss, transaction=100, test=1):
df = pd.DataFrame()
# 試行回数分、評価用関数を呼び出し、データフレームに格納する。
for i in range(test):
df[i] = sim(asset, bet, probability, win, loss, transaction)
# グラフ表示
# 補助線用の設定
xmin = -3
xmax = transaction
# ブラフサイズの設定
plt.figure(figsize=(25, 15), dpi=50)
plt.plot(df)
# 補助線の設定
plt.hlines([asset], xmin, xmax, "blue")
plt.show()
# 統計要素の表示
print(df.iloc[transaction - 1].describe())
# 資金量300、リスク20%、勝率61.54% 平均利益率5.83% 平均損率4.63% トレード回数250回、試行回数300回で、検証してみる。
mon(300, 0.2, 0.6154, 0.0583, 0.0463, 250, 300)
こうしてみると、取引回数50回程度まで利益が上がらないケースもあることがわかります。
別のストラテジー(逆張り)では、
でした。
こちらのほうが安定して資産が増えて行きます。
今回は出来上がったストラテジーから勝率や平均利益率などの値を取り出しているので、
統計的な妥当性があるかどうかはわかりません。
皆さんはどう思いますか?