量化策略初探——使用tushare进行沪深300ETF双均线策略
生活随笔
收集整理的這篇文章主要介紹了
量化策略初探——使用tushare进行沪深300ETF双均线策略
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用tushare采集滬深300ETF數據,并對滬深300ETF采用簡單移動平均、指數移動平均、進行雙均線策略,最后使用backtrader進行回測。
一、基本概念
雙均線策略:運用兩條不同周期的移動平均線,即短周期移動平均線和長周期移動平均線的相對大小,研判買進與賣出時機的策略。由短周期均線自下向上穿越長周期均線,所形成的交點,稱為金叉。當短周期均線自上而下穿越長周期均線,所形成的交點,稱為死叉。
簡單移動平均法:對指定期間內的數據做算術平均,新舊數據的權重一樣。
指數移動平均法:對指定期間的數據賦予不同的權重,每天數據的權重系數以指數等比形式縮小。
從tushare獲取滬深300ETF數據
import pandas as pd import numpy as np import backtrader as bt import datetime,time import tushare as tsdef get_data(ts_code):#獲取滬深300ETF數據pro = ts.pro_api('your token')try :df = pro.fund_daily(ts_code=ts_code)except : time.sleep(0.5)print('獲取數據失敗')else :print('獲取數據成功')#對數據進行處理符合backtrader格式columns = ['trade_date','open','high','low','close','vol']df = df[columns]#轉換日期格式df['trade_date'] = df['trade_date'].apply(lambda x: pd.to_datetime(str(x)))bt_col_dict = {'vol':'volume','trade_date':'datetime'}df = df.rename(columns = bt_col_dict)df = df.set_index('datetime')#openinterest 默認為0df['openinterest'] = 0#由于獲取的數據的第一行是最新數據,需要重新排列,否則最新日期的均線數據為空df=df.sort_index()return dfdf=get_data('510300.SH')策略準備
當前策略先計算簡單移動平均,后續計算指數移動平均使用bt.indicators.EMA()
class MYstrategy(bt.Strategy):params = dict(pfast = 20, # 快周期pslow = 50) # 慢周期def __init__(self): self.dataclose = self.datas[0].close # Order變量包含持倉數據與狀態self.order = None # 初始化移動平均數據 self.slow_sma = bt.indicators.SMA(self.datas[0], period = self.params.pslow) self.fast_sma = bt.indicators.SMA(self.datas[0], period = self.params.pfast)#backtrader內置函數,可以判斷兩線的交叉點self.crossover = bt.ind.CrossOver(self.fast_sma, self.fast_sma)#訂單相關 def notify_order(self, order):if order.status in [order.Submitted, order.Accepted]:#主動買賣的訂單提交或接受時 - 不觸發return#驗證訂單是否完成if order.status in [order.Completed]:self.bar_executed = len(self) #重置訂單self.order = None#next包含所有交易邏輯def next(self):# 檢測是否有未完成訂單if self.order:return#驗證是否有持倉if not self.position:#如果沒有持倉,尋找開倉信號#SMA快線突破SMA慢線if self.crossover > 0:self.order = self.buy()#SMA快線跌破SMA慢線elif self.crossover < 0:self.order = self.sell()else:# 如果已有持倉,尋找平倉信號,此地方選擇10日之后平倉if len(self) >= (self.bar_executed + 10):self.order = self.close()策略執行——backtrader回測
def execute_strategy(pfast,pslow):#初始化cerebro = bt.Cerebro(optreturn=False)#設置數據的參數data = bt.feeds.PandasDirectData(dataname=df)cerebro.adddata(data)#加載策略cerebro.addstrategy(MYstrategy,pslow=pslow,pfast=pfast) #設置初始現金cerebro.broker.set_cash(1000000.0)#設置傭金率cerebro.broker.setcommission(commission=0.0001)#設置固定的購買股數#cerebro.addsizer(bt.sizers.FixedSize, stake=100)#分析框架夏普比率和回撤cerebro.addanalyzer(bt.analyzers.SharpeRatio,_name = 'SharpeRatio')cerebro.addanalyzer(bt.analyzers.DrawDown, _name = 'DW')#初始現金start_cash = cerebro.broker.getvalue()#運行result = cerebro.run()#最終現金end_cash=cerebro.broker.getvalue()#利潤計算profit = end_cash-start_cashstrategy = result[0]SR=strategy.analyzers.SharpeRatio.get_analysis()DW=strategy.analyzers.DW.get_analysis()return profit,SR['sharperatio'],DW.drawdown,DW.max.drawdown策略優化
period = [1,5,10,20,30,60,120,250] final_results_list = [] for i in period:for j in period:if i < j :result=execute_strategy(i,j)final_results_list.append([i,j,result[0],result[1],result[2],result[3]])pd.DataFrame(final_results_list,columns = ['pfast','pslow','profit','SR','DW','max_DW'])策略結果
SMA運行結果
EMA運行結果
部分回測圖展示
從結果上可以看到,指數移動平均法相比于移動平均法更能反映出短期的價格波動情況,其利潤的波動更大,但同時最大回撤也更大。后續也可以用遍歷形勢求出收益最優組合。
總結
以上是生活随笔為你收集整理的量化策略初探——使用tushare进行沪深300ETF双均线策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永远不说喜欢你
- 下一篇: The Sandbox 和艺术家 Ale