関連記事
- 【Python】CoinGeckoのAPIからビットコイン価格データを取得する
- 【Python】トレード戦略をバックテストして有効性を検証する
- トレード戦略の有効性の検証する際に使う指標をまとめておく
モメンタムとMacdによるトレード戦略の検証
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import time
import requests
import json
from datetime import datetime
import pandas as pd
import talib
def get_btcprice(ticker,max):
url = ('https://api.coingecko.com/api/v3/coins/')+ticker+('/market_chart?vs_currency=jpy&days=')+max
r = requests.get(url)
r2 = json.loads(r.text)
return r2
# ビットコインの全期間の価格データを取得する
r2 = get_btcprice('bitcoin','max')
# jsonから価格データだけをPandasに変換して抽出する
def get_price(r2):
s = pd.DataFrame(r2['prices'])
s.columns = ['date','price']
date = []
for i in s['date']:
tsdate = int(i/1000)
loc = datetime.utcfromtimestamp(tsdate)
date.append(loc)
s.index = date
del s['date']
return s
btc = get_price(r2)
change = btc['price'].pct_change()
change.head()
trade_return = (change + 1).cumprod()
trade_return[0] = 1
trade_return = trade_return * 10000
print(trade_return.head(), trade_return[-5:])
price = btc['price']
#####複合計算
numpyprice = np.array(price)
rsi = talib.RSI(price, timeperiod=7)
momentam = talib.MOM(price, timeperiod=6)
macd = talib.MACD(price, fastperiod=12, slowperiod=26, signalperiod=5)
signal = []
for i in range(len(price)):
if momentam[i] > 0 and macd[2][i] > 0:
signal.append(1)
elif momentam[i] < 0 and macd[2][i] < 0 :
signal.append(-1)
else:
signal.append(0)
#### 累積リターンの計算 ###
# Matplotlibの日本語化
from pylab import rcParams
import matplotlib as mpl
font = {"family":"Noto Sans CJK JP"}
mpl.rc('font', **font)
rcParams['figure.figsize'] = 15,5
returns3 = ((change[1:] * signal[:-1]) + 1).cumprod()
returns2 = (change + 1).cumprod()
df2 = pd.DataFrame({'hold':trade_return, 'trade':returns3})
df3 = df2.fillna(method='ffill')
y1 = np.array(df3['hold'])
y2 = np.array(df3['trade'])
x = price.index[0:len(price)-1]
plt.title('トレードリターンの比較')
plt.plot(x, returns2[0:-1], 'b-', label='ホールドしてた場合のリターン', alpha=0.3, linewidth=1)
plt.plot(x, returns3, 'orange', label='MACD&モメンタムで取引した場合のリターン', alpha=1, linewidth=1.5)
plt.ylabel('倍率')
plt.grid(which='both')
plt.legend()
plt.show()
<実行結果>※投稿日時点の成績

結果は出た。とりあえずモメンタムとMACDが相性良さそうなので、次は関数化して機械学習のグリッドサーチの要領でfor文で全パラメータを当てはめて最適な期間を見つけ出してみます。
続き:【自動取引】トレード戦略のバックテスト②~MACDとモメンタムのパラメータ最適化

コメント