量化交易回測(cè)框架Backtrader初識(shí)

Backtrader知識(shí)儲(chǔ)備

框架的概念還挺多:Cerebro,Data Feeds捧搞,Strategy,Indicators,Orders实牡,Broker陌僵,Analyzers轴合,Observers创坞,Sizers。逐個(gè)來(lái)看看大概的功能和角色受葛。對(duì)學(xué)習(xí)框架好處多多题涨。

  • Cerebro :翻譯過(guò)來(lái)是大腦的意思∽芴玻可以說(shuō)是backtrader的基石纲堵,有點(diǎn)類似cpu的感覺(jué),處理收集所有數(shù)據(jù)闰渔、運(yùn)行策略席函,執(zhí)行回溯測(cè)試,操作交易冈涧,繪圖等等茂附。
  • Data Feeds:交易數(shù)據(jù),這個(gè)沒(méi)什么好說(shuō)的督弓,都是各種金融平臺(tái)的交易數(shù)據(jù)营曼,開(kāi)盤價(jià),收盤價(jià)啥的愚隧。
  • Strategy:策略蒂阱,根據(jù)定義的策略會(huì)處理或者說(shuō)遍歷數(shù)據(jù),來(lái)判定具體的買賣等動(dòng)作狂塘。
  • Indicators:指標(biāo)录煤,用股市打比方,比如相對(duì)強(qiáng)弱指標(biāo)(RSI)荞胡、隨機(jī)指標(biāo)(KD)辐赞、趨向指標(biāo)(DMI)、平滑異同平均線(MACD)硝训、能量潮(OBV)等等這些都已經(jīng)實(shí)現(xiàn)好的响委,不用咱們自己實(shí)現(xiàn),拿來(lái)使用即可窖梁。當(dāng)然也支持自定義指標(biāo)赘风。
  • Orders:下單員,可以理解具體交易訂單執(zhí)行單元纵刘,觸發(fā)了對(duì)應(yīng)的策略邀窃,發(fā)出訂單信號(hào),具體交給orders處理訂單操作。
  • Broker:經(jīng)紀(jì)人瞬捕,可以理解為交易所鞍历,收取手續(xù)費(fèi),管理賬戶資金肪虎。
  • Analyzers:看樣子輔助分析執(zhí)行的流程劣砍,協(xié)助改進(jìn)和修正問(wèn)題的角色(暫且這么理解)
  • Observers:看樣子輔助分析執(zhí)行的流程,協(xié)助改進(jìn)和修正問(wèn)題的角色(暫且這么理解)
  • Sizers:這個(gè)比較好理解扇救,不同的交易所刑枝,交易的單位不一樣,比如迅腔,1手是100股装畅,交易都是以100為單位。通過(guò)這個(gè)來(lái)設(shè)置交易的基本單位沧烈。

看了下官方給出的:Quickstart Guide掠兄。由于官網(wǎng)舉得例子都是國(guó)外的數(shù)據(jù)。要是想掌握這個(gè)必須把源頭先搞定锌雀,就是提供交易數(shù)據(jù)(Data Feeds )蚂夕,還好官方支持按照規(guī)范自己實(shí)現(xiàn)自己的數(shù)據(jù)。所以還是從這里開(kāi)始研究汤锨。

第一彈:Data Feeds(交易數(shù)據(jù))

背景

因?yàn)閿?shù)據(jù)的獲取双抽,我使用的是tushare。tushare返回的是pandas的dataframe格式闲礼。所以我就主攻pandas-datafeed這塊牍汹。

原理

參考官方文檔pandas-datafeed

class PandasData(feed.DataBase):
    '''
    The ``dataname`` parameter inherited from ``feed.DataBase`` is the pandas
    DataFrame
    '''

    params = (
        # Possible values for datetime (must always be present)
        #  None : datetime is the "index" in the Pandas Dataframe
        #  -1 : autodetect position or case-wise equal name
        #  >= 0 : numeric index to the colum in the pandas dataframe
        #  string : column name (as index) in the pandas dataframe
        ('datetime', None),

        # Possible values below:
        #  None : column not present
        #  -1 : autodetect position or case-wise equal name
        #  >= 0 : numeric index to the colum in the pandas dataframe
        #  string : column name (as index) in the pandas dataframe
        ('open', -1),
        ('high', -1),
        ('low', -1),
        ('close', -1),
        ('volume', -1),
        ('openinterest', -1),
    )

PandasData類繼承feed.DataBase類,初始化數(shù)據(jù)需要7列數(shù)據(jù) 分別為:datetime柬泽、open慎菲、high、low锨并、close露该、volume、openinterest第煮,其中datetime是索引列解幼。經(jīng)過(guò)實(shí)踐送過(guò)去的數(shù)據(jù)按照這個(gè)順序排列,不包含header部分即可包警。

實(shí)踐(Data Feeds 使用pandas數(shù)據(jù))

使用的是601668 中國(guó)建筑的股票數(shù)據(jù)撵摆,csv文件我放到github上了『蓿可以自行去下載特铝,按照官方文檔的源碼改了下數(shù)據(jù)元,正常執(zhí)行。

# -*- coding: utf-8 -*-
"""
搞定自定義的數(shù)據(jù)送給backtrader
"""
#############################################################
#import
#############################################################
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
import os,sys
import pandas as pd
import backtrader as bt
#############################################################
#global const values
#############################################################
#############################################################
#static function
#############################################################
#############################################################
#class
#############################################################
#############################################################
#global values
#############################################################
#############################################################
#global function
#############################################################
def G_get_dataframe():
     # Get a pandas dataframe
    datapath = './data/stockinfo.csv'
    tmpdatapath = './data/stockinfo_tmp.csv'
    print('-----------------------read csv---------------------------')
    dataframe = pd.read_csv(datapath,
                                skiprows=0,
                                header=0,
                                parse_dates=True,
                                index_col=0)
    print(dataframe)
    print('--------------------------------------------------')
    print('-----------------------change time------------------------')
    dataframe.trade_date =  pd.to_datetime(dataframe.trade_date, format="%Y%m%d")
    print(dataframe)
    print('--------------------------------------------------')
    print('-----------------------add openinterest-------------------')
    dataframe['openinterest'] = '0'
    print(dataframe)
    print('--------------------------------------------------')
    print('-----------------------make feedsdf-----------------------')
    feedsdf = dataframe[['trade_date', 'open', 'high', 'low', 'close', 'vol', 'openinterest']]
    print(feedsdf)
    print('--------------------------------------------------')
    print('-----------------------change columns---------------------')
    feedsdf.columns =['datetime', 'open', 'high', 'low', 'close', 'volume', 'openinterest']
    print(feedsdf)
    print('--------------------------------------------------')
    print('-----------------------change index-----------------------')
    feedsdf.set_index(keys='datetime', inplace =True)
    print(feedsdf)
    print('--------------------------------------------------')
    feedsdf.iloc[::-1].to_csv(tmpdatapath)
    feedsdf = pd.read_csv(tmpdatapath, skiprows=0, header=0, parse_dates=True, index_col=0)
    if os.path.isfile(tmpdatapath):
        os.remove(tmpdatapath)
        print(tmpdatapath+" removed!")
    return feedsdf
########################################################################
#main
########################################################################
if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro(stdstats=False)

    # Add a strategy
    cerebro.addstrategy(bt.Strategy)

    # Get a pandas dataframe
    feedsdf = G_get_dataframe()
    
    # Pass it to the backtrader datafeed and add it to the cerebro
    data = bt.feeds.PandasData(dataname=feedsdf)
    print(data)

    cerebro.adddata(data)

    # Run over everything
    cerebro.run()

    # Plot the result
    cerebro.plot(style='bar')

輸出圖形

Figure_0.png

源碼:

qtbt

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲫剿,一起剝皮案震驚了整個(gè)濱河市鳄逾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灵莲,老刑警劉巖雕凹,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異笆呆,居然都是意外死亡请琳,警方通過(guò)查閱死者的電腦和手機(jī)粱挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門赠幕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人询筏,你說(shuō)我怎么就攤上這事榕堰。” “怎么了嫌套?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逆屡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我踱讨,道長(zhǎng)魏蔗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任痹筛,我火速辦了婚禮莺治,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帚稠。我一直安慰自己谣旁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布滋早。 她就那樣靜靜地躺著榄审,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杆麸。 梳的紋絲不亂的頭發(fā)上搁进,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音昔头,去河邊找鬼饼问。 笑死,一個(gè)胖子當(dāng)著我的面吹牛减细,可吹牛的內(nèi)容都是我干的匆瓜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驮吱!你這毒婦竟也來(lái)了茧妒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤左冬,失蹤者是張志新(化名)和其女友劉穎桐筏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拇砰,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梅忌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了除破。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牧氮。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑰枫,靈堂內(nèi)的尸體忽然破棺而出踱葛,到底是詐尸還是另有隱情,我是刑警寧澤光坝,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布尸诽,位于F島的核電站,受9級(jí)特大地震影響盯另,放射性物質(zhì)發(fā)生泄漏性含。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一鸳惯、第九天 我趴在偏房一處隱蔽的房頂上張望商蕴。 院中可真熱鬧,春花似錦悲敷、人聲如沸究恤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)部宿。三九已至,卻和暖如春瓢湃,著一層夾襖步出監(jiān)牢的瞬間理张,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绵患, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雾叭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓落蝙,卻偏偏與公主長(zhǎng)得像织狐,于是被迫代替她去往敵國(guó)和親暂幼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 引言 目前基于Python的量化回測(cè)框架有很多移迫,開(kāi)源框架有zipline旺嬉、vnpy、pyalgotrader和...
    CuteHand閱讀 4,754評(píng)論 2 6
  • 回測(cè)原理 非專業(yè)人士操作股票厨埋,常常是看電視或者網(wǎng)上介紹了某種方法邪媳,第二天就根據(jù)自己的想象去操作了。然而每一種策略都...
    xieyan0811閱讀 3,446評(píng)論 0 0
  • 1. 股票數(shù)據(jù)分析 ?股票數(shù)據(jù)分析和一般數(shù)據(jù)分析一樣荡陷,用到數(shù)據(jù)清洗分析雨效,機(jī)器學(xué)習(xí)深度學(xué)習(xí),自然語(yǔ)言處理等技術(shù)废赞,當(dāng)我...
    xieyan0811閱讀 7,040評(píng)論 1 3
  • 1.前言 uniapp是一個(gè)使用html5標(biāo)準(zhǔn)的徽龟,一次開(kāi)發(fā),可以發(fā)布到安卓蛹头,ios顿肺,小程序的多端框架戏溺。非常方便渣蜗。 ...
    柴先森chai閱讀 33,430評(píng)論 20 15
  • 君為水~吾為魚~水未見(jiàn)魚淚~卻明魚心~魚離水而亡~水因魚而歡~無(wú)魚之水寂也~ 君非水~而吾非魚~但無(wú)君之時(shí)~生而無(wú)...
    black_swan閱讀 276評(píng)論 0 0