関連記事
- 【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とモメンタムのパラメータ最適化
コメント