第2天 vn.py CTA策略優(yōu)化酗钞、回測與實盤(一)

今天主要是理論部分,主要是學(xué)習(xí)文檔為主来累,估計要看幾天
后面還期權(quán)波動砚作,價差,風(fēng)控之類的嘹锁,估計得到周末用windows電腦再搞一波實盤了葫录。

教程基本分為兩部分:
一部分是vnpy介紹:
功能介紹
安裝指南
基本使用
交易接口
數(shù)據(jù)庫配置

  第二部分是vnpy模塊代碼使用: 對應(yīng)了代碼中vnpy/app 中的各種模塊
   [CTA策略模塊](https://www.vnpy.com/docs/cn/cta_strategy.html)
   。领猾。米同。骇扇。可以直接看教程排列的模塊

今天直接學(xué)第二部分第一個模塊
主要參考CTA策略

代碼參考位置
vnpy/app/cta_strategy
包含
base
template 策略模版面粮,基本策略都是繼承自這個類
strategies 包含了vnpy提供的一些策略
backesting 做回測用的
converter 針對上期所的轉(zhuǎn)換
engine 定義實盤引擎

策略開發(fā)
基于template進(jìn)行開發(fā)少孝,可以定義在自己項目里,也可以定義在vnpy庫里熬苍,策略文件用_下劃線命名方式稍走,策略類用駝峰式命名,規(guī)范命名可以讓代碼看起來更清晰柴底。

跳過數(shù)據(jù)部分后面再說

參數(shù)設(shè)置
文檔里舉例基于已有的BollChannelStrategy策略改造
boll_window = 18
boll_dev = 3.4
這些定義都是策略參數(shù)婿脸,可以根據(jù)品種的特征進(jìn)行調(diào)整

類的初始化
繼承了模版,調(diào)用super函數(shù)進(jìn)行參數(shù)設(shè)置
BarGenerator k線生成模塊似枕,把tick數(shù)據(jù)合成1分鐘或更大周期的k線盖淡,并且傳入策略執(zhí)行函數(shù)
ArrayManager k線時間管理模塊年柠,根據(jù)k線生成技術(shù)指標(biāo)

策略的初始化凿歼、啟動、停止
總共有3個固定函數(shù) on_init on_start on_stop
表示策略初始化冗恨,開始和停止
on_init調(diào)用函數(shù)load_bar(10)答憔,代表策略初始化需要載入10個交易日的歷史數(shù)據(jù)

Tick數(shù)據(jù)獲取,文檔里叫數(shù)據(jù)回報不太好理解掀抹,就叫做數(shù)據(jù)獲取吧
on_tick函數(shù)
每拿到tick數(shù)據(jù)會調(diào)用on_tick虐拓,如果策略是基于1分鐘或更長周期,需要調(diào)用self.bg.update_tick(tick)聚合成k線數(shù)據(jù)傲武,推到on_bar函數(shù)

K線數(shù)據(jù)獲热鼐浴(回報)
on_bar(self, bar: BarData) 收到1分鐘k線,調(diào)用self.bg.update_bar(bar)可以聚合成15分鐘k線推送到on_15min_bar函數(shù)

15分鐘k線數(shù)據(jù)獲染纠(回報)
這函數(shù)是自己定義的态兴,在BarGenerator中初始化,然后策略也在這里寫
分為三部分
1疟位、self.cancel_all() 取消上一個15分鐘沒有成交的單子
2瞻润、調(diào)用時間序列管理模塊,生成指標(biāo)
3甜刻、根據(jù)指標(biāo)進(jìn)行下單(buy/sell)绍撞,同時設(shè)置離場點(short/cover)
最后調(diào)用put_event()傳遞出CTA買賣信號

委托、成交得院、停止單 回報
可以直接pass傻铣,具體邏輯交給回測/實盤負(fù)責(zé)

以上是策略開發(fā)部分,下面就是如何回測祥绞,看看策略是否好用

在backtesting.py中定義了回測引擎

加載策略 add_strategy

加載歷史數(shù)據(jù) load_data
1非洲、根據(jù)數(shù)據(jù)不同可以分為k線和Tick模式
2阱驾、select().where()方法有條件的選出數(shù)據(jù),可以根據(jù):vt_symbol怪蔑、 回測開始日期里覆、回測結(jié)束日期、K線周期
3缆瓣、order_by(DbBarData.datetime)表示需要按照時間順序載入數(shù)據(jù)
4喧枷、數(shù)據(jù)以迭代的方式最終存入self.history_data

撮合成交 cross_limit_order
載入策略和歷史數(shù)據(jù)后,根據(jù)新來的數(shù)據(jù)計算弓坞,若符合發(fā)出具體的委托(buy/sell/short/cover)隧甚,并且在下一根k線成交。
根據(jù)委托類型分為兩種撮合:限價單和停止單撮合交易盡量仿真交易渡冻。暫時就簡略看下戚扳。

計算策略盈虧情況 calculate_pnl
基于收盤價、當(dāng)日持倉量族吻、合約規(guī)模帽借、滑點、手續(xù)費率等計算總盈虧與凈盈虧超歌。有個計算公式可以參考下

計算策略統(tǒng)計指標(biāo) calculate_statistics
基于逐日盯市盈虧情況來計算衍生指標(biāo)砍艾,如最大回撤、年化收益巍举、盈虧比脆荷、夏普比率等。

統(tǒng)計繪圖 show_chart 使用matplotlib繪制
1懊悯、資金曲線圖 2蜓谋、資金回撤圖 3、每日盈虧圖 4炭分、每日盈虧分布圖

單策略回測實例
1桃焕、導(dǎo)入回測引擎和CTA策略
2、設(shè)置回測參數(shù)
3欠窒、載入數(shù)據(jù)和策略
4覆旭、統(tǒng)計盈虧情況

--到此需要數(shù)據(jù)了,稍后搞數(shù)據(jù)

投資組合回測
多個策略回測岖妄,每個策略都有一個BacktestingEngine對象
創(chuàng)建run_backtesting函數(shù)型将,初始化每個策略的engine
分別進(jìn)行單策略回測,得到各自的DataFrame荐虐,除空值后即得到投資組合的DataFrame
show_portafolio()七兜,也是BacktestingEngine對象,計算夏普比率之類的統(tǒng)計指標(biāo)福扬,可以顯示單策略效果也能展示組合回測效果

回測基本學(xué)完了腕铸,準(zhǔn)備不用客戶端惜犀,本地python跑個回測
需要搞數(shù)據(jù)


官方推薦使用RQData就去搞一個,這個是米筐的
官網(wǎng) https://www.ricequant.com/welcome/ 需要注冊
好像看了下也需要客戶端才能用這個狠裹,算了先看完再說

加載數(shù)據(jù)
菜單欄點擊“配置”虽界,進(jìn)入全局配置頁面輸入RQData賬號密碼;或者直接配置json文件涛菠,即在用戶目錄下.vntrader文件夾找到vt_setting.json

初始化RQData客戶端 init_rqdata
:從vt_setting.json中讀取RQData的賬戶莉御、密碼到rq_client.init()函數(shù)進(jìn)行初始化

RQData載入實盤 query_bar_from_rq
輸入vt_symbol后,首先會轉(zhuǎn)換成符合RQData格式的rq_symbol俗冻,通過get_price()函數(shù)下載數(shù)據(jù)礁叔,并且插入到數(shù)據(jù)庫中。

學(xué)完了策略和回測迄薄,但是數(shù)據(jù)部分還是有點糟 mark下后面填坑

參數(shù)優(yōu)化
回測完發(fā)現(xiàn)策略表現(xiàn)不好琅关,但是大致方向是對的需要調(diào)整參數(shù)就需要參數(shù)優(yōu)化。

參數(shù)優(yōu)化主要有三部分
1讥蔽、參數(shù)設(shè)置 OptimizationSetting類
設(shè)置參數(shù)優(yōu)化區(qū)間
設(shè)置要優(yōu)化的字段
隨機生成參數(shù)組合涣易,把參數(shù)組合打包
這個例子有點草率,沒有說清楚怎么用勤篮,后面寫完優(yōu)化之后會補上自己寫的代碼

2都毒、參數(shù)對組合回測
調(diào)用回測引擎
輸入回測設(shè)置
輸入?yún)?shù)對組合到策略中
回測
返回回測統(tǒng)計結(jié)果

3色罚、多進(jìn)程優(yōu)化 為了加快回測速度
使用進(jìn)程池 multiprocessing.Pool碰缔,每個進(jìn)程調(diào)用apply_async( )運行參數(shù)對組合回測,回測結(jié)果存到results戳护,對results的內(nèi)容通過目標(biāo)優(yōu)化字段標(biāo)準(zhǔn)進(jìn)行排序金抡,輸出結(jié)果。

參數(shù)優(yōu)化部分略顯簡單后面寫完代碼理解后再補充

最后是實盤運行

創(chuàng)建策略 add_strategy
可以通過客戶端創(chuàng)建策略實例腌且,一鍵初始化梗肝,啟動和停止
創(chuàng)建實例的時候需要填寫如圖的實例名稱、合約品種铺董、參數(shù)設(shè)置巫击,合約名稱 vt_symbol
代碼里調(diào)用 add_strategy,實現(xiàn)功能
1精续、檢查策略是否重名
2坝锰、添加策略配置信息(strategy_name, vt_symbol, setting)到strategies字典中
3、添加該策略要訂閱的合約信息到symbol_strategy_map
4重付、策略配置信息保存json
5顷级、圖形化界面更新狀態(tài)

初始化策略 _init_strategy
1、調(diào)用on_init()确垫,并載入歷史數(shù)據(jù)
2弓颈、恢復(fù)上次退出之前的策略狀態(tài)
3帽芽、讀取.vntrader/cta_strategy_data.json的策略信息
4、調(diào)用subcribe()訂閱指定的行情信息
5翔冀、策略初始化狀態(tài)變成ture导街,顯示在圖形界面

啟動策略
1、查看策略初始化狀態(tài)纤子,啟動狀態(tài)菊匿,避免重復(fù)啟動
2、調(diào)用策略類的on_start()函數(shù)啟動策略
3计福、策略啟動狀態(tài)變成ture跌捆,顯示在圖形界面

停止策略
1、查看策略停止?fàn)顟B(tài)
2象颖、調(diào)用on_stop()停止策略
3佩厚、更新策略啟動狀態(tài)為false
4、撤單
5说订、策略參數(shù)抄瓦,最新的技術(shù)指標(biāo),以及持倉數(shù)量保存到.vntrader/cta_strategy_data.json
6陶冷、界面更新策略狀態(tài)

編輯策略
1钙姊、重新配置策略字典setting
2、更新參數(shù)字典到策略
3埂伦、界面更新

移除策略
1煞额、檢查策略狀態(tài),只有停止后才能移除
2沾谜、從json文件中移除策略配置文件
3膊毁、從symbol_strategy_map字典中移除監(jiān)控的合約
4、從strategy_orderid_map移除活動委托記錄
5基跑、從strategies字典移除該策略的相關(guān)配置信息婚温。

鎖倉操作
通過填寫lock字段來讓策略完成鎖倉操作,即禁止平今媳否,通過反向開倉來代替栅螟。
cta策略模板template中,可以看到如下具體委托函數(shù)都有l(wèi)ock字段篱竭,并且默認(rèn)為False
設(shè)置lock=True后力图,cta實盤引擎send_order()函數(shù)發(fā)生響應(yīng),并且調(diào)用其最根本的委托函數(shù)send_server_order()去處理鎖倉委托轉(zhuǎn)換室抽。首先是創(chuàng)建原始委托original_req搪哪,然后調(diào)用converter文件里面OffsetConverter類的convert_order_request來進(jìn)行相關(guān)轉(zhuǎn)換。
在convert_order_request_lock()函數(shù)中,先計算今倉的量和昨可用量晓折;然后進(jìn)行判斷:若有今倉惑朦,只能開倉(鎖倉);無今倉時候漓概,若平倉量小于等于昨可用漾月,全部平昨,反之胃珍,先平昨梁肿,剩下的反向開倉。

實盤部分基本就是基于客戶端和代碼交互做的簡單介紹觅彰,感覺對框架理解有點用吩蔑,但是實戰(zhàn)策略意義不大。最后的鎖倉操作理解不深填抬,后面再慢慢體會烛芬!
基本的流程已經(jīng)學(xué)完了,出了數(shù)據(jù)以外其他都理解差不多飒责,數(shù)據(jù)明天再弄赘娄,先搞定非客戶端數(shù)據(jù)的使用,估計要自己倒數(shù)據(jù)庫宏蛉,還有數(shù)據(jù)接口遣臼,明天再對回測做個補充


學(xué)習(xí)完吐個槽,vnpy安裝確實有點坑拾并,晚上windows下載完安裝各種報錯揍堰,還把Anaconda環(huán)境整的不行,自己的量化也跑不通了辟灰,終于知道創(chuàng)建虛擬運行環(huán)境的重要性个榕!雖然vnpy坑比較多但是現(xiàn)在可替代的也不多,后面考慮搞backtrader芥喇,先入坑vnpy,光學(xué)習(xí)的話還是有很多借鑒的凰萨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末继控,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胖眷,更是在濱河造成了極大的恐慌武通,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊搀,死亡現(xiàn)場離奇詭異冶忱,居然都是意外死亡,警方通過查閱死者的電腦和手機境析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門囚枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來派诬,“玉大人,你說我怎么就攤上這事链沼∧福” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵括勺,是天一觀的道長缆八。 經(jīng)常有香客問我,道長疾捍,這世上最難降的妖魔是什么奈辰? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乱豆,結(jié)果婚禮上冯挎,老公的妹妹穿的比我還像新娘。我一直安慰自己咙鞍,他們只是感情好房官,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著续滋,像睡著了一般翰守。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲酌,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天蜡峰,我揣著相機與錄音,去河邊找鬼朗恳。 笑死湿颅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥诫。 我是一名探鬼主播油航,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怀浆!你這毒婦竟也來了谊囚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤执赡,失蹤者是張志新(化名)和其女友劉穎镰踏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙合,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡奠伪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊率。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡谨敛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出即舌,到底是詐尸還是另有隱情佣盒,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布顽聂,位于F島的核電站肥惭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏紊搪。R本人自食惡果不足惜蜜葱,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耀石。 院中可真熱鬧牵囤,春花似錦、人聲如沸滞伟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梆奈。三九已至野崇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亩钟,已是汗流浹背乓梨。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留清酥,地道東北人扶镀。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像焰轻,于是被迫代替她去往敵國和親臭觉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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