LoginSignup
0
3

More than 3 years have passed since last update.

Pythonで株式システムトレードのストラテジーを評価してみた。

Posted at

システムトレードでは、過去の株価データに基づいて、ストラテジーを検証します。

例えば、以下の検証結果は、とある順張りの検証結果です。
【分析結果】_名前なし__7順張り250日20日_20191118_pdf(2___12ページ).jpg

しかし、それは一つのシナリオでの評価にしか過ぎません。

そこで、出来上がったストラテジーの勝率、利益率、損益率、資金量で複数回シミュレーションしたらどのような結果になるか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)

Untitled11_ipynb_-_Colaboratory.jpg

こうしてみると、取引回数50回程度まで利益が上がらないケースもあることがわかります。

別のストラテジー(逆張り)では、

Untitled11_ipynb_-_Colaboratory.jpg

でした。

こちらのほうが安定して資産が増えて行きます。

今回は出来上がったストラテジーから勝率や平均利益率などの値を取り出しているので、
統計的な妥当性があるかどうかはわかりません。

皆さんはどう思いますか?

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3