본문 바로가기

카테고리 없음

[파이썬] backtesting에 macd 지표 추가

728x90
반응형

 

[파이썬] backtesting에 macd 지표 추가

 
 
 

Backtesting with MACD[SONY stock]

Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources

www.kaggle.com

 
 
import pandas_datareader.data as web
import datetime
from icecream import ic
import pandas
from pandas_datareader import data as pdr
import yfinance as yfin


yfin.pdr_override()

start = datetime.date(2018,1,1)
ic(start)
end = datetime.date(2021,5,1)
ic(end)
#data = web.DataReader('SONY', 'yahoo', start, end)
data = pdr.get_data_yahoo('SONY', start='2018-1-1', end='2021-5-1')

print(data)
data.to_csv('aaa.csv')


from backtesting import Backtest, Strategy # バックテスト、ストラテジー
from backtesting.lib import crossover

import talib as ta

def MACD(close, n1, n2, ns):
    #n1-n2
    macd, macdsignal, macdhist = ta.MACD(close, fastperiod=n1, slowperiod=n2, signalperiod=ns)
    return macd, macdsignal

class MACDCross(Strategy):
    n1 = 12 #短期EMAの期間
    n2 = 26 #長期EMAの期間
    ns = 9 #シグナル(MACDのSMA)の期間

    def init(self):
        self.macd, self.macdsignal = self.I(MACD, self.data.Close, self.n1, self.n2, self.ns)

    def next(self): # チャートデータの行ごとに呼び出される
        if crossover(self.macd, self.macdsignal): #macdがsignalを上回った時
            self.buy() # 買い
        elif crossover(self.macdsignal, self.macd): #signalがmacdを上回った時
            self.position.close() # 売り



# バックテストを設定
bt = Backtest(
    data, # チャートデータ
    MACDCross, # 売買戦略
    cash=1000, # 最初の所持金
    commission=0.00495, # 取引手数料
    margin=1.0, # レバレッジ倍率の逆数(0.5で2倍レバレッジ)
    trade_on_close=True, # True:現在の終値で取引,False:次の時間の始値で取引
    exclusive_orders=True #自動でポジションをクローズ(オープン)
)

output = bt.run() # バックテスト実行
print(output) # 実行結果(データ)
bt.plot() # 実行結果(グラフ)

#最適化
output2=bt.optimize(n1=range(10, 100, 10),n2=range(10, 300, 10),ns=range(10, 50, 5), maximize='Equity Final [$]', method='grid')
print(output2)
bt.plot()            
반응형