事實上,backtrader雖然沒有直接提供接口給我們做這樣的優(yōu)化,但是我們可以通過繼承DataBase基類重寫DataFeed實現(xiàn)目的。下面就給大家演示一下如何從MySQL中提取數(shù)據(jù)并增加換手率指標進行回測。
本文完整源代碼和數(shù)據(jù)均在開源代碼倉庫中:
https://github.com/Ckend/pythondict-quant
1.準備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,請訪問這篇文章:超詳細Python安裝指南 進行安裝。如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.
此外,推薦大家用VSCode編輯器,因為它可以在編輯器下方的終端運行命令安裝依賴模塊:Python 編程的最好搭檔—VSCode 詳細指南。
Windows環(huán)境下打開 Cmd (開始-運行-CMD),蘋果系統(tǒng)環(huán)境下請打開 Terminal (command+空格輸入Terminal),準備開始輸入命令安裝依賴。
在終端輸入以下命令安裝我們所需要的依賴模塊:
pip install backtrader
pip install numpy
pip install matplotlib
看到 Successfully installed xxx 則說明安裝成功。
2.自定義DataFeed
何為DataFeed?DataFeed 即 backtrader 中的“數(shù)據(jù)源”,任何數(shù)據(jù)進入策略回測前都要通過DataFeed,而DataFeed中會對數(shù)據(jù)進行處理,使得策略可以高效地進行計算。
我們今天要做的,就是增加一個基于MySQL的DataFeed,使得整個流程變得更加自動化。
首先,需要定義一個類,使其繼承與backtrader的數(shù)據(jù)基類 DataBase
:
from backtrader.feed import DataBase
from backtrader import date2num
class MySQLData(DataBase):
pass
如果需要從外部傳入所需股票數(shù)據(jù)的代碼和其一定范圍內(nèi)的K線數(shù)據(jù),需要提前定義params. 此外,如果你有除了:datetime(時間)、open(開盤價)、close(收盤價)、high(最高價)、low(最低價)、volume(成交量) 之外的指標。需要提前定義lines,如下所示:
從上圖可見,在lines中我增加了兩個自定義指標:turnover(成交額) 和 turnover_rate(換手率)。
接下來,編寫一個函數(shù)根據(jù)params參數(shù)從MySQL中獲取數(shù)據(jù):
代碼本身沒有什么可說的,記得替換你本地的mysql配置,值得注意的是最后一行,拿到mysql數(shù)據(jù)后需要轉(zhuǎn)化為迭代器。
在類初始化的時候,需要定義相關(guān)的數(shù)據(jù)存放變量并調(diào)用上述函數(shù)獲取數(shù)據(jù):
接下來到了關(guān)鍵的步驟,在調(diào)用回測策略前,cerebro會遍歷Datafeed的所有數(shù)據(jù),此時會調(diào)用_load函數(shù), 因此我們需要在這里,將數(shù)據(jù)庫中提取的每列數(shù)據(jù)對應(yīng)到lines上:
如果你完整地看完了我的上述分析,那么理解下面整個DataFeed,甚至自己寫一個DataFeed,是非常容易的。
3.使用自定義數(shù)據(jù)流進行回測
接下來,讓我們嘗試使用這個自定義數(shù)據(jù)流輸入數(shù)據(jù),采用第二章的macd策略輔助增加換手率指標進行回測。
這里當然需要你先讀懂第二章的內(nèi)容,如果有點忘記了,可以回頭閱讀一下,非常簡單:
Python 量化投資實戰(zhàn)教程(2) —MACD策略
首先,在回測模塊及next函數(shù)中,引入換手率指標:
next函數(shù)買入時增加判斷換手率必須小于3%的條件:
最后,引入我們剛剛編寫完成的MySQLData Feed,傳入相關(guān)參數(shù)讀取股票為603520.SH的數(shù)據(jù)流,取2017年1月1日至2020年4月12日的數(shù)據(jù),并調(diào)用回測函數(shù):
-
接口
+關(guān)注
關(guān)注
33文章
8908瀏覽量
153099 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7234瀏覽量
90887 -
終端
+關(guān)注
關(guān)注
1文章
1187瀏覽量
30577 -
database
+關(guān)注
關(guān)注
0文章
5瀏覽量
10921 -
MySQL
+關(guān)注
關(guān)注
1文章
842瀏覽量
27457
發(fā)布評論請先 登錄
如果從采集的數(shù)據(jù)串中提取一個完整的脈沖數(shù)據(jù)?
怎么從EXA中提取IQ數(shù)據(jù)進行后期處理
怎么從繪圖或變換中提取特定數(shù)據(jù)點
怎么從DHT11溫度傳感器中提取數(shù)據(jù)
如何從特征值中提取兩個字節(jié)?
如何以編程方式從STL庫中提取版本信息?
如何通過M480系列的PDMAA步態(tài)模式從RGB顏色陣列中提取
如何從HTML或XML文件中提取數(shù)據(jù)的Python爬蟲庫Beautiful Soup概述
新加坡研發(fā)從空氣中提取水的氣凝膠
MySQL端口可以從MySQL數(shù)據(jù)庫中存儲和檢索數(shù)據(jù)
利用MySQL進行一主一從的主從復(fù)制
如何使用OpenCV和Python從圖像中提取感興趣區(qū)域
從光體積圖中提取呼吸速率的信號處理技術(shù)的比較
OST中提取郵箱數(shù)據(jù)和重置丟失的WindowsServer 密碼的工具

評論