日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

量化策略初探——使用tushare进行沪深300ETF双均线策略

發布時間:2024/1/18 编程问答 122 豆豆
生活随笔 收集整理的這篇文章主要介紹了 量化策略初探——使用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双均线策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。