CTA 策略,即商品交易顧問 (Commodity Trading Advisor,簡稱 CTA)。一般而言,要求不少於 60%的資產要投資於期貨市場。也就是說,假設一家管理期貨策略的私募基金有 1 億元可投資金,至少要有 6000 萬作為期貨保證金。CTA 策略一直是量化投資領域裡面的一塊重要組成部分,和股票的量化策略相比,CTA 策略具有更穩定的收益和更小的風險。正是基於 CTA 策略的對沖性及其高頻性,讓市場的一切波動都會慢慢趨於平滑,也就是說,只要你對沖做得好,基本可以無視大盤。
最近整理了一下 CTA 策略的開發工具。市面上有 TB 或 MC 之類的可編程的交易軟體,奈何一方面這些商業軟體的價格不菲,另一方面,編程用的所謂的 EasyLanguage 其實非常小眾,複雜功能的開發比較麻煩。做了一些比較後,最後還是選定了 VN.PY 作為 CTA 策略的開發平台。本文介紹的是 VN.PY 的入門心得,幫助大家了解 VN.PY 並快速入門,而非策略的開發(策略的開發一本書也寫不完。。。)
一、VN.PY 安裝#
基於 VN.PY 的 CTA 策略主要依賴於 VNStation 進行,可在官網上下載最新版安裝即可。目前的最新版本是 2.5.1。默認安裝目錄為 C:\vnstudio。注意點如下:
1)VNStation 安裝是自帶 Python 包的,所以本地不需要事先安裝 Python。開發 IDE,比如 VSCode,建議選擇該自帶 Python 包作為編譯器。不建議本地有其他的 Python 環境,最好乾乾淨淨地使用 VNStation 一家即可。
2)vnpy 的源代碼在 C:\vnstudio\Lib\site-packages\vnpy 目錄下可以找到,但是這個源代碼和GitHub上的源代碼有一些不一樣。vnpy 目錄下應該是一致的,但是 GitHub 的源代碼上還有其他的目錄,比如 examples 的目錄,其中有很多可以借鑒的源代碼是安裝包裡所不具備的。
二、啟動 VNStation#
1、策略代碼目錄創建
創建 C:\Users [用戶名或 Administrator]\strategies 目錄,開發完成的策略代碼可以放在該目錄下。
2、啟動 VNStation
啟動 VNStation,頁面如下所示:
選擇【VN Trader Pro】,啟動如下頁面:
左側的底層接口選擇【CTP】或者【CTP 測試】。右側的上層應用主要根據我們的需要選擇,一般選擇【CTA 自動交易模塊】和【CTA 回測研究模塊】較多。下方的運行目錄,注意和上述【1、策略代碼目錄創建】的目錄保持一致。點擊啟動即可。補充說明如下:
1)CTP 和 CTP 測試
目前上期技術是支持通過 API 接入看穿式監管的,主要開發語言是 C++。由於 VN.PY 已經在底層幫我們完成這一複雜的任務了,所以我們無需關心該部分內容。但是連接看穿式監管仍然需要帳號,既需要測試帳號(即 CTP 測試),也需要實盤帳號(即 CTP)。我們用測試帳號來驗證投資策略的正確性,用實盤帳號來完成實盤交易。該帳號的申請主要通過自身所在的期貨公司來申請。申請的步驟可以參考文章《看完這篇,徹底搞定期貨穿透式 CTP API》。
如果暫時只是想做一下策略的研究,不做實盤交易的情況下,還有一個方法可以獲得 CTP 交易帳號,那就是 Simnow 的仿真實盤 / 測試帳號。如果準備使用 Simnow 帳號,要注意以下幾點:
- 底層接口選擇的是 CTP,而非 CTP 測試!!
- SimNow 提供兩套環境,其中第一套仿真實盤環境只能在交易時段使用(9:00-15:00),第二套仿真測試環境只能在非交易時段使用(所有其他時間);在非交易時段使用第一套環境時,主界面左下角日誌區域沒有任何輸出信息。在對應時間段不能連接的話,建議先重新登錄 VnTrader 嘗試驗證一下。
- 第一套環境中又分為三組伺服器,據 vn.py 官方建議,只能連接第二和第三組伺服器(支持穿透式驗證的版本),不能連接第一組;
- 由於運維方面的原因,SimNow 伺服器有時會出現停機維護的情況(2019 年之後尤其頻繁),此時只能等待到下一個交易日再嘗試。
2)CTA 自動交易模塊和 CTA 回測研究模塊
顧名思義,前者是 CTA 策略實施,後者是 CTA 策略回測。如果兩者都不選擇的話,後續啟動的頁面只能做基於頁面的基礎買賣操作,而無法使用 CTA 策略交易的功能。
3、CTP 或 CTP 測試連接
進入 VNTrader 的主頁面,如下所示:
點擊左上角【系統】-【連接 CTP(或連接 CTP 測試)】進行 CTP(或 CTP 測試)的配置:
關於 CTP 或者 CTP 測試的配置,一般期貨公司會提供相關的文檔。如果是基於 Simnow 的 CTP 配置,可以參考官網介紹,也可以參考文章《國內期貨 CTP 配置教程》。Simnow 連接成功後的【日誌】窗口的頁面如下:
期貨公司的連接成功後,可能並沒有 Simnow 那麼詳細,一切以期貨公司的認定標準為準。
連接後可確認【持倉】和【資金】窗口的數據是否正確地顯示。
連接後也可測試一下是否行情數據正確能夠獲取,在【交易】窗口 -【代碼】處鍵入合約代碼,按回車,看行情窗口是否正確地顯示。注意,合約代碼是否輸入正確,國內 4 家期貨交易所的合約命名規則有所區別,vn.py 內部全部採用官方命名,代碼是區分大小寫的。比如 TF2003、rb2003 這樣。
三、CTA 回測和 CTA 策略#
1、VNTrader 的全局配置
在使用【CTA 策略】或【CTA 回測】之前,我們需要先進行數據的準備。因為在策略中,我們既可能需要根據歷史數據進行技術指標的計算,也可能在回測中,利用歷史數據進行策略的驗證。
VNTrader 的數據準備可以用兩種方法,一是使用 RQData 數據,二是構建本地數據庫服務。前者使用便捷,更為推薦,其具體的使用方法如下:
1)打開【配置】頁面
2)配置【全局配置】頁面的以下兩個項目
注意:此處的 rqdata.username 和 rqdata.password 和 RQData 官網的用戶名和密碼不是同一回事!!
rqdata.username 固定為:license
rqdata.password 為:(申請 rqdata 後,官網會給一個很長字母的 License)
配置完畢後,啟動【功能】-【CTA 回測】,在日誌窗口確認 RQData 是否正常連接,如下圖所示:
如果不能正常連接且檢查無誤的情況下,可以嘗試通過打開 VN Station prompt 窗口,輸入 pip install rqdatac -U 來更新後看一下是否能解決問題。
另外,RQData 中的連續合約數據,提供 88、888、99 等多種類型,以股指期貨合約為例,其區別如下:
- IF88:簡單將 IF 股指期貨每個主力月份的量價數據進行拼接,未做任何平滑處理,在主力合約換月時數據會有跳空的現象,因此該數據只適合日內 CTA 策略的回測(收盤無持倉);
- IF888:在 IF88 數據的基礎上,當主力合約換月時記錄換月的價差金額,並對之前的歷史數據全部加上或者減去該價差,進行平滑處理,因此該數據適合隔夜 CTA 策略的回測(收盤有持倉);
- IF99:由所有可交易品種的數據,以累計持倉量進行加權平均後,得出的指數數據,由於其在現實中不可交易(交易所並不提供指數合約),因此不推薦使用該數據進行回測,可用於某些數據模型的研究。
2、CTA 回測
在 VP.PY 中已經預開發了一些經典策略供投資者回測和策略交易,比如 ArtRsi 策略、DualThrust 策略等,初學者可以從使用或修改這些策略開始著手。
啟動【功能】-【CTA 回測】,選擇策略,輸入本地代碼(格式為【商品代碼。商品交易所】,比如 TF2003.CFFEX)及其他回測條件,點擊【開始回測】,回測頁面顯示如下:
各項回測指標在中間顯示,【帳戶淨值】、【淨值回測】、【每日盈虧】、【盈虧分佈】的圖形化頁面在右側顯示。
注意:
1)(回測)交易並不一定從開始日期開始,因為 VN.PY 需要有一定的交易日(比如 10 個交易日)的數據作為初始化,該天數內不會有交易數據。此時可通過回測指標的【首個交易日】進行確認。該部分的程序可以參考策略的 on_init 函數中的 self.load_bar (10)。
2)回測頁面時並不能對平今倉的手續費進行特別設置(因為平今倉和平隔夜倉的手續相差較大,會影響收益結果)
3)如果中間的回測指標欄無法正確顯示的話,可以嘗試
i)在全局配置中,改小 font.size
ii)C:\vnstudio\Lib\site-packages\vnpy\app\cta_backtester\ui\widget.py 的 184 行設置為較小值,比如 600。
在【CTA 回測】頁面,亦可以進行參數優化。比如說,有個策略有均線纏繞的比較,快速均線的窗口期和慢速均線的窗口期如何設置才能獲得最好的收益率或夏普比率,需要進行遍歷比較。點擊【參數優化】,可以對目標值、快速均線窗口值、慢速均線窗口值進行遍歷比較,比較結束後,可點擊【優化結果】進行查看。
3、CTA 策略
啟動【功能】-【CTA 策略】,確認日誌窗口的信息如下:
選擇策略,點擊【添加策略】,
strategy_name:表示策略名字,可以設任意字符串,比如 demo1
vt_symbol:表示交易代碼,格式為【商品代碼。商品交易所】,比如 TF2003.CFFEX
其他則根據自己策略的需要設置。
可以看到部分變量,比如 atr_value、atr_ma 等值為 0,這主要是尚未通過歷史數據計算,點擊【初始化】,完成策略初始化,並對上述需要的值進行賦值。
初始化後,可點擊【啟動】,啟動策略,此時便開始按照策略進行量化交易。
此時即便關閉【CTA 策略】窗口,亦不會關閉策略的執行。
4,策略調試
方法一:cmd 調試
如果要對策略進行調試,則需要通過 VN Studio Prompt 來啟動 VN Station。輸入命令行:python -m vnstation。如下圖所示:
在 vn trader 中選擇 CTA 回測模塊,選擇你要調試的策略,點擊開始回測。相應的調試輸出(需要根據個人需求自己設定,一般使用 print()函數),會在 cmd 中顯示。cmd 顯示的就是 python 解釋器在運行策略文件時的輸出。如此便實現策略調試。
方法二:Jupyter notebook 調試
通過桌面圖標啟動 vnstation,在彈出的圖形界面中選擇 Jupyter Notebook。
選擇要調試的策略所在的目錄為 Jupyter Notebook 的運行目錄,即 C:\Users [用戶名或 Administrator]\strategies 目錄。
在 Jupyter notebook 中 import 被調試的策略,
#%%
from vnpy.app.cta_strategy.backtesting import BacktestingEngine, OptimizationSetting
from vnpy.app.cta_strategy.strategies.atr_rsi_strategy import (
AtrRsiStrategy,
)
from datetime import datetime
然後根據你要回測的品種,回測時間起點,回測時間終點,交易佣金,滑點,價格跳動 ,回測資金,依次修改 vt_symbol,interval,start,end,rate,slippage,size,pricetick,capital。 最後設定被調試策略 engine.add_strategy (被調試的策略,{})。
#%%
engine = BacktestingEngine()
engine.set_parameters(
vt_symbol="IF88.CFFEX",
interval="1m",
start=datetime(2019, 1, 1),
end=datetime(2019, 4, 30),
rate=0.3/10000,
slippage=0.2,
size=300,
pricetick=0.2,
capital=1_000_000,
)
engine.add_strategy(AtrRsiStrategy, {})
運行代碼,如果出現錯誤,可以通過 engine.strategy. 访问策略中的變量來進行排查錯誤。也可以在策略代碼中使用 print () 函數。更詳細的 demo 代碼可以參考 vnpy-master\examples\cta_backtesting\backtesting_demo.ipynb
四、VN.PY 的相關學習資料#
本文介紹了 VN.PY 的快速入門,顯然對於博大精深的 VN.PY 的學習而言僅僅是冰山一角。以下的一些學習資料可以供大家更多地了解 VN.PY。
1、VN.PY 公眾號視頻教程(付費)
教程名稱:《全實戰進階策略 —CTA 策略》。該教程由於是一邊操作電腦頁面,一邊授課,且逐步分解,由易到難,非常適合作為首選學習資料。根據自身的定位(投資家、策略開發者、平台開發者),可以選擇性觀看不同的章節(該選擇需要自己判斷)。
2、VN.PY 官網的項目文檔
https://www.vnpy.com/docs/cn/index.html
該項目文檔由於比較精煉,更適合作為資料查詢,對於初學者來說有點難,可以和視頻結合看,可方便理解。
3、VN.PY 知乎
https://zhuanlan.zhihu.com/vn-py
這是 VN.PY 作者的知乎頻道,勝在不停地更新,可以作為持續的學習資料。
4、VN.PY 蝸牛博客
http://www.snailtoday.com/archives/category/qihuo/vnpy
這是一位大牛的 VN.PY 學習博客,有很多文章可以和 VN.PY 官方文檔形成互補,涉及很多 VN.PY 源碼的原理,且實戰性很強,更多地適合於平台開發者。
5、《Python 量化交易》(張揚飛著)
這本書是基於 VN.PY 的而寫的量化交易,優點是非常細致地介紹了 VN.PY 的原理,另外,對於 VN.PY 預開發的一些經典交易策略,進行了詳細的金融層面的介紹和說明,彌補了官方資料的不足(官方資料側重於 Python 的開發方面),缺點是 VN.PY 更新版本的速度也很快,很多書中介紹的和最新版本已經不是非常相符。