vnpy怎么創建策略并回測_【手把手教你】入門量化回測最強神器backtrader(一)

74df9398becab996de171ea07f6bfe33.png

1 引言

目前基于Python的量化回測框架有很多,開源框架有zipline、vnpy、pyalgotrader和backtrader等,而量化平臺有Quantopian(國外)、聚寬、萬礦、優礦、米筐、掘金等,這些量化框架或平臺各有優劣。就個人而言,比較偏好用backtrader,因為它功能十分完善,有完整的使用文檔,安裝相對簡單(直接pip安裝即可)。優點是運行速度快,支持pandas的矢量運算;支持參數自動尋優運算,內置了talib股票分析技術指標庫;支持多品種、多策略、多周期的回測和交易;支持pyflio、empyrica分析模塊庫、alphalens多因子分析模塊庫等;擴展靈活,可以集成TensorFlow、PyTorch和Keras等機器學習、神經網絡分析模塊。而不足之處在于,backtrader學習起來相對復雜,編程過程中使用了大量的元編程(類class),如果Python編程基礎不扎實(尤其是類的操作),學起來會感到吃力。本文作為backtrader的入門系列之一,對其運行框架進行簡要介紹,并以實際案例展示量化回測的過程。

2 backtrader簡介

如果將backtrader包分解為核心組件,主要包括以下組成部分:
(1)數據加載(Data Feed):將交易策略的數據加載到回測框架中。

(2)交易策略(Strategy):該模塊是編程過程中最復雜的部分,需要設計交易決策,得出買入/賣出信號。
(3)回測框架設置( Cerebro):需要設置(i)初始資金(ii)傭金(iii)數據饋送(iv)交易策略(v)交易頭寸大小。
(4)運行回測:運行Cerebro回測并打印出所有已執行的交易。
(5)評估性能(Analyzers):以圖形和風險收益等指標對交易策略的回測結果進行評價。

“Lines”是backtrader回測的數據,由一系列的點組成,通常包括以下類別的數據:Open(開盤價), High(最高價), Low(最低價), Close(收盤價), Volume(成交量), OpenInterest(無的話設置為0)。Data Feeds(數據加載)、Indicators(技術指標)和Strategies(策略)都會生成 Lines。價格數據中的所有”Open” (開盤價)按時間組成一條 Line。所以,一組含有以上6個類別的價格數據,共有6條 Lines。如果算上“DateTime”(時間,可以看作是一組數據的主鍵),一共有7條 Lines。當訪問一條 Line 的數據時,會默認指向下標為 0 的數據。最后一個數據通過下標 -1 來訪問,在-1之后是索引0,用于訪問當前時刻。因此,在回測過程中,無需知道已經處理了多少條/分鐘/天/月,”0”一直指向當前值,下標 -1 來訪問最后一個值。

d39e358657485f6be6e1a1c683160cc9.png

3 回測應用實例

量化回測說白了是使用歷史數據去驗證交易策略的性能,因此回測的第一步是搭建交易策略,這也是backtrader要設置的最重要和復雜的部分,策略設定好后,其余部分的代碼編寫是手到擒來。

01構建策略(Strategy)

交易策略類代碼包含重要的參數和用于執行策略的功能,要定義的參數或函數名如下:

(1)params-全局參數,可選:更改交易策略中變量/參數的值,可用于參數調優。

(2)log:日志,可選:記錄策略的執行日志,可以打印出該函數提供的日期時間和txt變量。

(3) __init__:用于初始化交易策略的類實例的代碼。

(4)notify_order,可選:跟蹤交易指令(order)的狀態。order具有提交,接受,買入/賣出執行和價格,已取消/拒絕等狀態。

(5)notify_trade,可選:跟蹤交易的狀態,任何已平倉的交易都將報告毛利和凈利潤。

(6)next,必選:制定交易策略的函數,策略模塊最核心的部分。

下面以一個簡單的單均線策略為例,展示backtrader的使用過程,即當收盤價上漲突破20日均線買入(做多),當收盤價下跌跌穿20日均線賣出(做空)。為簡單起見,不報告交易回測的日志,因此log、notify_order和notify_trade函數省略不寫。

class my_strategy1(bt.Strategy):#全局設定交易策略的參數params=(('maperiod',20),)def __init__(self):#指定價格序列self.dataclose=self.datas[0].close# 初始化交易指令、買賣價格和手續費self.order = Noneself.buyprice = Noneself.buycomm = None#添加移動均線指標,內置了talib模塊self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)def next(self):if self.order: # 檢查是否有指令等待執行, return# 檢查是否持倉   if not self.position: # 沒有持倉#執行買入條件判斷:收盤價格上漲突破20日均線if self.dataclose[0] > self.sma[0]:#執行買入self.order = self.buy(size=500)         else:#執行賣出條件判斷:收盤價格跌破20日均線if self.dataclose[0] < self.sma[0]:#執行賣出self.order = self.sell(size=500)

02數據加載(Data Feeds)

策略設計好后,第二步是數據加載,backtrader提供了很多數據接口,包括quandl(美股)、yahoo、pandas格式數據等,我們主要分析A股數據。

mpl.rcParams['axes.unicode_minus']=False

#先引入后面可能用到的包(package)
import pandas as pd  
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
%matplotlib inline   #正常顯示畫圖時出現的中文和負號
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']#使用tushare舊版接口獲取數據
import tushare as ts 
def get_data(code,start='2010-01-01',end='2020-03-31'):df=ts.get_k_data(code,autype='qfq',start=start,end=end)df.index=pd.to_datetime(df.date)df['openinterest']=0df=df[['open','high','low','close','volume','openinterest']]return df

dataframe=get_data('600000')

#回測期間
start=datetime(2010, 3, 31)
end=datetime(2020, 3, 31)
# 加載數據
data = bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)

03 回測設置(Cerebro)

回測設置主要包括幾項:回測系統初始化,數據加載到回測系統,添加交易策略, broker設置(如交易資金和交易傭金),頭寸規模設置作為策略一部分的交易規模等,最后顯示執行交易策略時積累的總資金和凈收益。

# 初始化cerebro回測系統設置                           
cerebro = bt.Cerebro()  
#將數據傳入回測系統
cerebro.adddata(data) 
# 將交易策略加載到回測系統中
cerebro.addstrategy(my_strategy1) 
# 設置初始資本為10,000
startcash = 10000
cerebro.broker.setcash(startcash) 
# 設置交易手續費為 0.2%
cerebro.broker.setcommission(commission=0.002) 

04 執行回測

輸出回測結果。

print(f'凈收益: {round(pnl,2)}')

d1=start.strftime('%Y%m%d')
d2=end.strftime('%Y%m%d')
print(f'初始資金: {startcash}n回測期間:{d1}:{d2}')
#運行回測系統
cerebro.run()
#獲取回測結束后的總資金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印結果
print(f'總資金: {round(portvalue,2)}')初始資金: 10000
回測期間:20100331:20200331
總資金: 12065.36
凈收益: 2065.36

05可視化

對上述結果進行可視化,使用內置的matplotlib畫圖。至此,簡單的單均線回測就完成了。下面圖形展示了浦發銀行在回測期間的價格走勢、買賣點和交易總資金的變化等。當然,本文著重以最簡化的例子展示backtrader的框架和運行過程,要想更詳細的展示回測過程和結果,還需要加入其他函數和模塊,關于Analyzers分析模塊的應用請留意下一篇推文。

%matplotlib inline #在jupyter notebook上運行
cerebro.plot(style='candlestick')

6db6fda99cbb7e24ec95a787448de229.png

4 結語

backtrader是目前功能最完善的Python量化回測框架之一(單機版),得到歐洲很多銀行、基金等金融機構的青睞,并應用于實盤交易中。作為入門序列之一,本文簡單介紹了backtrader框架的各個組成部分,然后以20日單均線策略為例,展示了回測系統的編程和運行。公眾號接下來將以專題的形式為大家全面介紹backtrader的應用。學習沒有捷徑,要想全面而深入地學習backtrader回測框架,最好的方法是研讀其官方文檔。

參考資料:

backtrader官方文檔:

https://www.backtrader.com/docu/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構基礎:算法的基礎知識筆記

1、算法的概念算法是問題求解過程中的精確描述&#xff0c;它為解決某一特定類型的問題規定了一個運算過程。2、算法的特點2.1 有窮性一個算法必須在有窮的步驟結束后結束&#xff0c;并且每一步都在有窮時間內完成。2.2 確定性算法的執行過程中每一步都要有確定的定義&#xf…

Spring Bean Scope 有狀態的Bean 無狀態的Bean

在Spring的Bean配置中&#xff0c;存在這樣兩種情況&#xff1a; [xhtml] view plaincopy<bean id"testManager" class"com.sw.TestManagerImpl" scope"singleton" /> <bean id"testManager" class"com.sw.TestMana…

數據結構基礎:圖結構的學習筆記

1、圖的定義圖是比樹更加復雜的數據結構&#xff0c;在圖的結構當中&#xff0c;任意兩個節點之間都有可能有直接關系&#xff0c;所以圖中一個節點的前驅和后繼的數目是沒有限制的。2、圖的用途用于描述各種復雜的數據對象&#xff0c;在自然科學、社會科學和人文科學等很多領…

企業網站 源碼 服務郵箱:_企業網站建設對于服務器的選擇至關重要

網站建設是離不開租用服務器的&#xff0c;這是目前大多數企業都在做的。但有些企業由于對網站服務器的租用技巧及經驗的缺乏&#xff0c;經常會導致網站在運營過程中出現非常多的問題&#xff0c;嚴重影響了企業業務的正常開展。石家莊網站建設方面的人才來說明幾點不容忽視的…

linux sli 提高效率,從原理到性能提升 MCP78智能SLI全解析

NVIDIA正式發布了“Hbrid SLI”技術在昨日的2008 CES上&#xff0c;NVIDIA正式向外界發布了“Hbrid SLI”技術&#xff0c;即我們所俗稱的混合SLI&#xff0c;而NVIDIA在發布時已更正式名為“智能SLI技術”。雖然這僅僅是NVIDIA在此次消費電子展上的宣講主題之一&#xff0c;但…

git操作代碼文件的顏色變化

1.若文件顯示紅色&#xff0c;表示文件未add到git進行管理 2.若文件顯示綠色&#xff0c;表示文件已經交給git管理&#xff0c;但從未上傳到遠程倉庫中 3.若文件顯示藍色&#xff0c;表示文件已經上傳過遠程倉庫&#xff0c;且此時本地文件與遠程倉庫文件不一致 4.若文件顯示…

[GitHub]第三講:簡單分支操作

Git 最核心的操作對象是版本&#xff08; commit &#xff09;&#xff0c;最核心的操作技巧就是分支。 什么是分支&#xff1f; 倉庫創建后&#xff0c;一旦有了新 commit&#xff0c;默認就會放到一個分支上&#xff0c;名字叫 master。前面咱們一直看到的多個版本組成的一條…

算法基礎:常用的排序算法知識筆記

1、算法外排序分類2、冒泡排序冒泡排序&#xff08;Bubble Sort&#xff09;屬于交換排序&#xff0c;它的原理是&#xff1a;循環兩兩比較相鄰的記錄&#xff0c;如果反序則交換&#xff0c;直到沒有反序的記錄為止。實現算法&#xff1a;/*** 冒泡排序優化后的算法* 設置一個…

302狀態碼_http狀態碼是什么?301 302 404的SEO應用場景

什么是HTTP狀態碼&#xff1f;簡單的講&#xff0c;就是用以表示網頁服務器HTTP響應狀態的3位數字代碼。其中1xx表示臨時響應&#xff0c;2xx表示成功處理了請求&#xff0c;3xx代表重定向&#xff0c;4xx表示請求錯誤&#xff0c;而5xx表示服務器錯誤。除了網頁正常返回200之外…

Android高版本開機廣播,android3.1以上,假如程序沒有啟動過,怎么獲取開機廣播呢?...

官方說不支持&#xff1a;Launch controlson stopped applicationsStarting from Android 3.1, the systems package manager keepstrack of applications that are in a stopped state and provides ameans of controlling their launch from background processes andother a…

git push前請先git pull

開發過程中 如果要推送代碼到遠程倉庫&#xff0c;請先git pull。養成好習慣。 原因很簡單&#xff0c;在你開發過程中&#xff0c;你的同事可能也在改代碼然后他提交了沒通知你&#xff0c;你直接git push很容易造成代碼沖突&#xff0c;代碼沖突解決也簡單&#xff0c;可萬一…

table 中 thead tbody tfoot 加載順序問題

這幾個標記主要是用于提高table標簽的加載以及顯示的&#xff0c;說白了&#xff0c;就是分布加載。在傳統的瀏覽器&#xff0c;在加載 時&#xff0c;是當所有的標簽中元素都被下載后才會顯示&#xff0c;當然這樣的用戶體驗是不好的。再加入了這幾個t打頭的標簽后&#xff0c…

算法基礎:常用的查找算法知識筆記

1、查找表和查找效率的概念查找表是指由同一類型的數據元素構成的集合。分為靜態查找表和動態查找表。1.1 靜態查找表1、查詢某個特定元素是否在查找表的集合當中2、查詢某個特定元素的各種屬性1.2 動態查找表1、在查找表中插入一個數據元素2、在查找表中刪除一個元素1.3 關鍵字…

注解參數怎么使用變量_硅橡膠膠水有哪些特點?使用參數表現的怎么樣?如何儲存?...

作為單組分產品&#xff0c;硅橡膠膠水的使用方法簡單又靈活。直接涂抹在粘接基面上&#xff0c;固化之后即可抵抗外界的壓力與沖擊。別看它的規格不是很打&#xff0c;卻可以順順利利完成粘接&#xff0c;形成保護膜。硅橡膠膠水有哪些特點?沒有固化之前&#xff0c;是半透明…

android 谷歌郵箱,Android 使用 SMTP 發送郵件 (Gmail)

具體使用方法請看&#xff1a;http://www.oschina.net/code/snippet_12_9831.[代碼]GMailSender.javapackage org.apache.android.mail;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.mail.Message;import javax.mail.PasswordAuthent…

Java中return的兩種用法

一、return語句總是用在方法中&#xff0c;有兩個作用。 一個是返回方法指定類型的值&#xff08;這個值總是確定的&#xff09;。 一個是結束方法的執行&#xff08;僅僅一個return語句&#xff09;。 一般的就百是用在有反回值的方法中&#xff0c;用來返回方度法指定問類…

Alpha版總結會議

一、會議過程 我們于第十五周周一開始在學院樓針對前一段時間開發過程中的問題進行了討論。會議期間我們整合并回顧了一下兩次沖刺周期的成果。會議開始首先每個人都先發表了自己針對Alpha版開發過程中存在的疑惑和一些問題的看法。我們最后挑選出出三個最具針對性的問題進行了…

算法基礎:遞歸算法知識筆記

1、遞歸算法定義遞歸算法是將重復問題分解為同類的子問題而解決問題的方法&#xff0c;其核心思想是分治策略。簡單來說就是自己調用自己。直到達到退出遞歸的條件&#xff0c;則完成遞歸。2、遞歸的步驟1、找整個遞歸的終止條件&#xff1a;遞歸應該在什么時候結束&#xff1f…

ttl繼承邏輯門的邏輯功能與參數測試 實驗總結_LMS電聲測試儀,LMS-V測試系統,精聲電聲...

LMS-V測試系統LMS揚聲器測試儀從推出到現在25年的時間&#xff0c;在全世界被很多揚聲器開發與制造廠家廣泛應用研發與生產質量控制&#xff0c;傳統的LMS揚聲器測試儀采用ISA卡的形式提供&#xff0c;所以面臨著越來越多的零件過時&#xff0c;所以為了徹底解決這些問題&#…

android自動讓輸入框上劃,Android界面技巧:當輸入法調出時,如何讓界面自動上移,使輸入法不會遮擋到主界面(Activity)...

android:windowSoftInputModeactivity主窗口與軟鍵盤的交互模式&#xff0c;可以用來避免輸入法面板遮擋問題&#xff0c;Android1.5后的一個新特性。這個屬性能影響兩件事情&#xff1a;【一】當有焦點產生時&#xff0c;軟鍵盤是隱藏還是顯示【二】是否減少活動主窗口大小以便…