システムトレードでは、過去の株価データに基づいて、ストラテジーを検証します。
しかし、それは一つのシナリオでの評価にしか過ぎません。
そこで、出来上がったストラテジーの勝率、利益率、損益率、資金量で複数回シミュレーションしたらどのような結果になるか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回程度まで利益が上がらないケースもあることがわかります。
別のストラテジー(逆張り)では、
でした。
こちらのほうが安定して資産が増えて行きます。
今回は出来上がったストラテジーから勝率や平均利益率などの値を取り出しているので、
統計的な妥当性があるかどうかはわかりません。
皆さんはどう思いますか?