- 量化投資:交易模型開發與數據挖掘
- 韓燾
- 1755字
- 2020-04-03 12:57:02
3.1 選擇回測平臺的技巧
近年來Python在我國量化領域非常流行,同時也涌現出了很多做量化平臺的公司,他們所提供的量化平臺基本都包含回測功能。不過從一個量化分析的過程來講,只有回測功能是不夠的,還需要有底層數據、量化因子、因子生產平臺、績效評價功能、策略優化器等。對于自建平臺的機構或個人愛好者,只需要接入外部數據即可;而對于需要使用專業而全面的量化分析工具的人們,就要對各類平臺認真考慮,從而選擇適合自己的量化平臺。
在此列舉一些量化平臺,也是筆者這幾年在量化分析中了解到的一些平臺名稱,如優礦(通聯數據)、聚寬、米筐、問財、果仁和國信TradeStation。
另外對于自建平臺的數據使用,在此也列舉了一些數據庫廠商,僅供參考,如表3-1所示。
表3-1

3.1.1 根據個人特點選擇回測平臺
投資者除了選擇回測平臺,還需要知道量化投資策略只有建立在有一定數量的金融數據基礎上才能很好地運行。由于每位交易者的側重點不同,所以其需求也各不相同。
常見的原始數據需求,如日期、開/收盤價、最高/最低價、交易量、交易金額、財務報表、業績預告、業績快報、IPO、配股、分紅、拆股和股改等信息屬于傳統的結構化投資數據。
一些個人需要的非原始數據,如社交媒體數據、新聞媒體數據、渠道公告數據、電商數據等屬于非傳統的結構化數據。
無論哪種結構化數據,只有經過不斷挖掘、優化、組合、創新并不斷回測,才有可能在實盤量化投資交易中盈利。
通聯數據所提供的優礦量化平臺,作為國內最早推出的量化分析工具,已經得到了各種金融機構的認可,如券商、公募基金及個人愛好者等。優礦支持調用全量底層數據、400+量化因子、風險模型等。本章主要介紹數據的提取及回測方法。
3.1.2 回測平臺的使用方法與技巧
用戶需要在回測平臺進行注冊才能使用,步驟如下。
首先,登錄優礦官網免費注冊一個賬號,如圖3-1所示。

圖3-1
其次,輸入手機號、驗證碼、密碼后,單擊“注冊優礦”按鈕,如圖3-2所示。

圖3-2
注冊成功后,即可進入主界面,單擊“研究數據”模塊,我們可以看到很多常用的金融數據,而且這些金融數據絕大部分是可以免費查看的。這些經濟數據對學習量化投資策略能起到非常重要的作用,如圖3-3所示。

圖3-3
3.2 調用金融數據庫中的數據
下面開始講解如何調用一些常用的金融數據。單擊“開始研究”模塊,在左側單擊“新建”下拉按鈕,選擇“新建Notebook”選項,即可新建一個Notebook,如圖3-4所示。

圖3-4
單擊對應的Notebook,即可進入Python代碼的編輯界面(見圖3-5)。當打開優礦的Notebook時,我們會發現,它和IPython Notebook或Jupyter Notebook的翻譯環境基本都是相同的,那是因為優礦中的Notebook是基于IPython Notebook開發的,所以操作基本一致,從而可以方便用戶進行操作。

圖3-5
單擊NoteBook左上角的“代碼”下拉按鈕,將模式設置為代碼模式,即可開始調用數據,如圖3-6所示。

圖3-6
3.2.1 歷史數據庫的調取
打開回測平臺的主界面并單擊“研究數據”模塊,尋找我們需要的數據。例如,查看滬深股票日行情數據:單擊“滬深股票”→“行情”→“日行情”,然后單擊“滬深股票日行情”右側的“展開詳情”,如圖3-7所示。

圖3-7
我們既可以通過單擊左側的下拉按鈕來尋找數據,也可以直接在上方的搜索框中輸入關鍵字進行搜索,如圖3-8所示。

圖3-8
在“展開詳情”中展示了參數的名稱、類型及描述信息,如圖3-9所示。例如,我們想要調取某只股票的某個時間段的行情,只要規范寫入代碼就可以了。

圖3-9
在返回值中,我們可選的行情不僅包括基本的最高價、最低價、開盤價、收盤價、成交量、漲跌幅,還包括動態市盈率、市凈率、VWAP等數據,主要內容如表3-2所示。
表3-2

應將所有選擇返回的項傳給field參數。單擊“復制代碼”按鈕,如圖3-10所示。

圖3-10
單擊“開始研究”模塊并新建“Notebook”,將代碼粘貼到文本框中,注意在“Notebook”內填寫代碼,如圖3-11所示。

圖3-11
例如,調取601006大秦鐵路與000727華東科技在2019年3月1日的收盤價與總市值,返回的是一個DataFrame。在輸入股票代碼時需要注意,由于是通聯內部自由編碼的,所以要在原股票代碼的基礎上加上后綴,例如,對深市股票000727華東科技加上后綴為000727.XSHE,對滬市股票601006大秦鐵路加上后綴為601006.XSHG,如圖3-12所示。

圖3-12
當然還可以直接輸入原始股票代碼傳入ticker參數,如圖3-13所示。

圖3-13
可以通過beginDate與endDate參數獲取DataAPI中某一個時間段的數據,如圖3-14所示。

圖3-14
例如,調取000727華東科技與601006大秦鐵路從2019年2月26日至2019年3月1日的收盤價與總市值數據。在輸入日期時需要注意書寫格式,如圖3-15所示。

圖3-15
3.2.2 數據庫的分析方法與技巧
DataAPI支持提取多只股票在某一時間段的數據,單擊“研究數據”模塊,在搜索框中輸入“因子”進行搜索,如圖3-16所示。

圖3-16
在搜索因子后,通聯數據顯示欄顯示的“獲取多只股票歷史上某一天的因子數據”和“獲取一只股票歷史上某一時間段的因子數據”就是我們需要的DataAPI。由于數據量過大導致沒有因子DataAPI可以直接調用多只股票歷史上某一時間段的因子數據,所以我們在使用優礦的因子DataAPI時,首先應該考慮我們的需求更適合使用哪個DataAPI。
例如,“獲取一只股票歷史上某一時間段的因子數據”應該使用如圖3-17所示的DataAPI。

圖3-17
例如,“獲取多只股票歷史上某一天的因子數據”應該使用如圖3-18所示的DataAPI。

圖3-18
例如,“獲取多只股票歷史上某一段時間段的因子數據”則可以編寫循環語句來多次調用,而且應該使用如圖3-19所示的DataAPI。

圖3-19
3.3 回測與實際業績預期偏差的調試方法
股票回測是股票模型創建中必不可少的一步,其過程為根據個人設定的基礎指標經過篩選、組合建立好策略模型之后,利用某一時間段的歷史行情數據,嚴格按照設定的組合進行選股,并模擬真實市場行情交易的規則進行模型買入、模型賣出,得出該時間段的盈利率、最大回撤率等數據。
實際業績預期偏差是指在回測中表現十分優秀的策略,一旦到實盤測試時就虧損累累。其原因在于回測中包含一定的偏差,我們要做的就是盡量篩選并將它們剔除。
交易策略一旦確定那么就需要獲取歷史數據,然后根據歷史數據進行測試。目前獲得歷史數據的方法有很多,但是根據渠道不同,歷史數據的質量、時間間隔及深度等都不相同。交易者在選擇數據時需要關注的是歷史數據中幸存者偏差、精確度、清潔度、可用性及交易成本等方面。
在歷史數據中有些錯誤是不容易被辨別出來的,所以需要利用數據供應商提供的數據來進行對比和檢查。我們需要利用一個軟件平臺來進行回測。
例如,以優礦來實現,如圖3-20所示。

圖3-20
3.4 設置回測參數
3.4.1 start和end回測起止時間
策略回測的起止時間是策略的全局變量。start表示回測起始日期,end表示回測終止日期。
quartz會自動截取start之后的第一個交易日和end之前的最后一個交易日進行回測。
日線數據只能回測到2007年1月1日,分鐘線數據只能回測到2009年1月1日,在此之前的數據只能自行獲取。需要注意的是,在設置start和end時需要考慮max_history_window引入的提前量,例如當max_history_window = 30時,start最早僅可為2007-02-15。
時間類型包括str或datetime,注意str只支持“YYYY-MM-DD”和“YYYYMMDD”兩種格式。
不同資產類型支持的回測區間范圍如表3-3所示。
表3-3

示例代碼如下:
start = '2019-03-01' # 在2019年3月1日開始回測 end = '2019-03-08' # 在2019年3月8日結束回測
3.4.2 universe證券池
策略回測的證券池,即策略邏輯作用的域,下單與歷史數據獲取都只限于universe中的證券。它支持全部A股、全部可在二級市場交易的ETF與LOF。
有兩種獲取證券池的方式:固定的資產列表(靜態證券池)、DynamicUniverse(動態證券池)。
示例代碼如下:
universe = ['000001.XSHE', '600000.XSHG'] # 靜態證券池 universe = DynamicUniverse('HS300') # 動態證券池
1.固定的資產列表
靜態證券池可以指定固定的個別資產或資產列表,示例代碼如下:
universe = ['000001.XSHE', 'IFM0'] # 指定平安銀行和股指期貨為策略證券池
2.DynamicUniverse
獲取動態證券池的示例代碼如下:
DynamicUniverse(<板塊代碼、行業或指數實例>)
在使用板塊成分股、行業成分股或指數成分股作為策略的交易對象時,策略框架會根據實際情況,調整當天股票池的內容。
參數:<板塊代碼、行業、指數實例>,即預設的板塊代碼、行業和指數實例名稱。
參數類型:str或預設的行業與指數實例。
參數用法如下。
· 預設板塊成分股:支持7個預設的指數板塊,包括’SH50’上證50、'SH180’上證180、'HS300’滬深300、'ZZ500’中證500、'CYB’創業板、'ZXB’中小板、'A’全A股,也支持通過DataAPI.IdxGet()函數獲取指數的secID值。滬深300指數板塊示例代碼如下:
DynamicUniverse('HS300') # 表示滬深300的字符串
· 預設行業和指數實例。在Notebook中輸入開頭字符后會有自動代碼提示功能,可以幫助查找具體的行業(以IndSW.開頭)和指數(以IdxCN.開頭)名稱。當前使用成分股作為股票池的完整行業列表和指數列表,詳細信息請讀者閱讀動態股票池支持的行業列表和動態股票池支持的指數列表。
行業實例代碼如下:
# 行業實例,IndSW表示申萬行業,YinHangL2表示銀行二級行業分類 DynamicUniverse(IndSW.YinHangL2)
指數實例代碼如下:
# 指數實例,IdxShangZhengZongZhi表示上證綜指 DynamicUniverse(IdxCN.IdxShangZhengZongZhi)
· 也可以混合使用,示例代碼如下:
# 混合使用 DynamicUniverse('HS300', IndSW.YinHangL2, IdxCN.IdxShangZhengZongZhi)
返回動態證券池類型的示例代碼如下:
universe = DynamicUniverse('HS300') # 使用滬深300成分股動態證券池
支持動態證券池和普通列表取并集,示例代碼如下:
# 包含滬深300成分股動態證券池和平安銀行 universe = DynamicUniverse('HS300') + ['000001.XSHE']
3.apply_filter
將篩選條件作用于每個交易日的動態證券池上,從而進一步縮小策略標的范圍,當前支持使用優礦因子庫中的所有因子對證券池進行篩選,代碼如下。
DynamicUniverse(<板塊代碼或行業、指數實例>).apply_filter(<因子篩選條件表達式>)
參數:<因子篩選條件表達式>。表達式寫法:Factor.<factor_name>.<篩選方法>。
用法:factor_name是因子名,可以通過優礦因子庫查看所有支持篩選的因子。
優礦因子庫目前提供了5種篩選方法,如表3-4所示。
表3-4

表達式既支持單個篩選條件,也支持多個篩選條件,最多可支持5個篩選條件。
在表達式中可以使用兩種二元運算:交(&)表示同時滿足兩個篩選條件,并(|)表示滿足任意一個篩選條件。運算方向為從左到右。
當篩選條件多于兩個時,可以通過括號嵌套的方式來確定運算順序。例如,篩選出PE值最大的100只或PB值排名為95%~100%的股票,并且RSI值大小為70~100的股票池,可使用如下表達方式:
(Factor.PE.nlarge(100) | Factor.PB.pct_range(0.95, 1)) & Factor.RSI.value _range(70, 100)
返回動態證券池類型的示例代碼如下:
# 獲得滬深300成分股中PE值最小的100只股票列表 universe = DynamicUniverse('HS300').apply_filter(Factor.PE.nsmall(100))
3.4.3 benchmark參考基準
策略參考基準,即量化投資策略回測結果的比較標準,通過比較可以大致看出策略的好壞。策略的一些風險指標如Alpha、beta等也要通過benchmark計算得出。
策略參考基準支持如下3種賦值方式。
· 將預設板塊作為基準:支持5個常用指數板塊,包括’SHCI’上證綜指、'SH50’上證50、'SH180’上證180、'HS300’滬深300、'ZZ500’中證500。示例代碼如下:
benchmark = 'HS300' # 策略參考基準為滬深300
· 將指數作為基準:當前支持的完整的指數列表。示例代碼如下:
benchmark = '399006.ZICN' # 策略參考基準為創業板指
· 將個股作為基準:當前支持所有A股股票。示例代碼如下:
benchmark = '000001.XSHE' # 策略參考基準為平安銀行
3.4.4 freq和refresh_rate策略運行頻率
策略回測,本質上是指使用歷史行情和其他依賴數據對策略的邏輯進行歷史回放。freq和refresh_rate共同決定了回測使用的數據和調倉頻率。
優礦支持日線策略和分鐘線策略兩種模式。
日線策略:每天會執行一次handle_data。執行時間為開盤前,此時僅可獲得當天的盤前信息,以及截止到前一天的行情、因子等數據,不會獲得當天的盤中行情等數據。
分鐘線策略:首先在開盤前會執行一次handle_data,然后在盤中的調倉對應時間的分鐘結束后執行一次handle_data(不包含收盤時間)。
freq表示使用的數據為日線行情數據或分鐘線行情數據。refresh_rate表示調倉間隔的時間,即每次觸發handle_data的間隔時間。它們的類型如下。
· freq:str。
· refresh_rate :int或(a, b)結構。
freq和refresh_rate的用法如下。
1.日線策略
freq,取值為d,其中d表示策略中使用的數據為日線級別的數據,只能進行日線級別的調倉。
refresh_rate有以下3種取值方式。
· 使用整數1,表示每個交易日進行調倉的策略,示例代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-02-01' # 在2019年2月1日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'd' refresh_rate = 1 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.current_date
每個交易日都有調倉,下面展示了部分調倉日期:
2019-01-03 00:00:00 2019-01-09 00:00:00 2019-01-16 00:00:00 2019-01-23 00:00:00
· 使用Weekly(1),表示每周第一個交易日進行調倉,示例代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-02-01' # 在2019年2月1日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'd' refresh_rate = Weekly(1) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.current_date
下面展示了每周第一個交易日的調倉日期:
2019-01-03 00:00:00 2019-01-09 00:00:00 2019-01-16 00:00:00 2019-01-23 00:00:00
· 使用Monthly(1, -1),表示每個月第一個和最后一個交易日進行調倉,示例代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-03-01' # 在2019年3月1日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'd' refresh_rate = Monthly(1, -1) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.current_date
下面展示了每個月第一個和最后一個交易日調倉的日期:
2019-01-02 00:00:00 2019-01-31 00:00:00 2019-02-01 00:00:00 2019-02-28 00:00:00 2019-03-01 00:00:00
2.分鐘線策略
freq,取值為m,其中m表示策略中使用的數據為分鐘線數據,可以進行分鐘線級別的調倉。
refresh_rate有以下4種取值方式。
· 使用(1, 2),表示每個交易日每間隔2分鐘進行調倉的策略,示例代碼如下:
start = '2019-01-04' # 在2019年1月4日開始回測 end = '2019-01-04' # 在2019年1月4日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'm' refresh_rate = (1, 2) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.now
每個交易日的每2分鐘都有調倉,下面展示了部分調倉時間:
2019-01-04 09:30:00 2019-01-04 09:32:00 2019-01-04 09:34:00 ... 2019-01-04 14:56:00 2019-01-04 14:58:00
· 使用(2, ['10:30', '14:30']),表示每2個交易日指定特定時間,使用分鐘線數據進行調倉的策略,示例代碼如下:
start = '2019-01-04' # 在2019年1月4日開始回測 end = '2019-01-10' # 在2019年1月10日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'm' refresh_rate = (2, ['10:30', '14:30']) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.now
下面展示了全部調倉時間,每2個交易日,在10:30和14:30進行調倉:
2019-01-04 10:30:00 2019-01-04 14:30:00 2019-01-06 10:30:00 2019-01-06 14:30:00 2019-01-10 10:30:00 2019-01-10 14:30:00
· 使用(Weekly(1, -1), ['10:30', '14:30']),表示每周第一個和最后一個交易日,指定特定時間,使用分鐘線數據進行調倉的策略,示例代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-01-10' # 在2019年1月10日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'm' refresh_rate = (Weekly(1, -1), ['10:30', '14:30']) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.now
下面展示了全部調倉時間,指定每周第一個和最后一個交易日,在10:30和14:30進行調倉:
2019-01-06 10:30:00 2019-01-06 14:30:00 2019-01-09 10:30:00 2019-01-09 14:30:00
· 使用(Monthly(1), 120),表示每月第一個交易日,每隔120分鐘,使用分鐘線數據進行調倉的策略,示例代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-03-01' # 在2019年3月1日結束回測 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 freq = 'm' refresh_rate = (Monthly(1), 120) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.now
下面展示了全部調倉時間,表示每月第一個交易日,每隔120分鐘,使用分鐘線數據進行調倉:
2019-01-03 09:30:00 2019-01-03 11:30:00 2019-02-03 09:30:00 2019-02-03 11:30:00 2019-03-01 09:30:00 2019-03-01 11:30:00
3.5 賬戶設置
3.5.1 accounts賬戶配置
回測框架的交易賬戶配置函數,支持多個交易品種、多個交易賬戶同時進行回測,示例代碼如下:
accounts = { 'security_account': AccountConfig(account_type='security', capital_base= 10000000, position_base = {}, cost_base = {}, commission = Commission(buycost= 0.001, sellcost=0.002, unit='perValue'), slippage = Slippage(value=0.0, unit= 'perValue')) } # 股票(包含場內基金)賬戶配置 accounts = { 'futures_account': AccountConfig(account_type='futures', capital_base= 10000000, commission = Commission(buycost=0.001, sellcost=0.002, unit= 'perValue'), slippage = Slippage(value=0.0, unit='perValue'), margin_rate = 0.1) } # 期貨賬戶配置 accounts = { 'otcfund_account': AccountConfig(account_type='otc_fund', capital_base= 10000000, commission = Commission(buycost=0.001, sellcost=0.002, unit= 'perValue'), slippage = Slippage(value=0.0, unit='perValue'), dividend_method = 'cash_dividend') } # 場外基金(不包含貨幣基金)賬戶配置
accounts賬戶配置的用法有如下3種。
· 單個賬戶配置,示例代碼如下:
start = '2018-01-01' # 回測起始時間 end = '2019-01-01' # 回測結束時間 universe = DynamicUniverse('HS300') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'security_account': AccountConfig(account_type='security', capital_base= 10000000, position_base = {'600000.XSHG':1000}, cost_base = {'600000.XSHG': 10.05}, commission = Commission(buycost=0.001, sellcost=0.002, unit='perValue'), slippage = Slippage(value=0.0, unit='perValue')) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('security_account')
· 多個賬戶配置,commission、slippage表示可以對多賬戶進行全局配置,示例代碼如下:
start = '2018-01-01' # 回測起始時間 end = '2019-01-01' # 回測結束時間 universe = DynamicUniverse('HS300') + ['IFM0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 # 對兩個賬戶進行全局的交易費用和滑點設置 commission = Commission(buycost=0.001, sellcost=0.002, unit='perValue') slippage = Slippage(value=0.0, unit='perValue') accounts = { 'security_account1': AccountConfig(account_type='security', capital_ base=10000000, position_base = {'600000.XSHG':1000}, cost_base = {'600000. XSHG':10.05}, commission = commission, slippage = slippage), 'security_account2': AccountConfig(account_type='security', capital_ base=20000000, position_base = {'600000.XSHG':2000}, cost_base = {'600000. XSHG':10.05}, commission = commission, slippage = slippage) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 account1 = context.get_account('security_account1') account2 = context.get_account('security_account2')
· 股票、期貨混合賬戶配置,示例代碼如下:
start = '2018-01-01' # 回測起始時間 end = '2019-01-01' # 回測結束時間 universe = DynamicUniverse('HS300') + ['IFM0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'security_account': AccountConfig(account_type='security', capital_ base=10000000, position_base = {'600000.XSHG':1000}, cost_base = {'600000. XSHG':10.05}, commission = Commission(buycost=0.001, sellcost=0.002, unit='perValue'), slippage = Slippage(value=0.0, unit='perValue')), 'futures_account': AccountConfig(account_type='futures', capital_base= 10000000, commission = Commission(buycost=0.001, sellcost=0.002, unit='perValue'), slippage = Slippage(value=0.0, unit='perValue'), margin_rate = 0.1) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 account1 = context.get_account('security_account') account2 = context.get_account('futures_account')
3.5.2 AccountConfig賬戶配置
對單個交易賬戶進行配置。策略在初始化時會根據賬戶配置,需要創建對應的交易賬戶。AccountConfig賬戶配置參數如下。
· 必選參數:account_type、capital_base。
· 可選參數:position_base、cost_base、commission、slippage。
· 期貨專用參數:margin_rate。
· 場外基金專用參數:dividend_method。
1.account_type
account_type表示設置交易賬戶的類型。
參數類型:str。包括4個值,即’security’表示股票和場內基金、'futures’表示期貨、'otc_fund'表示場外基金(不含貨幣基金), 'index’表示指數。
示例代碼如下:
account_type = 'security'
2.capital_base
capital_base表示設置交易賬戶的初始資金。
參數類型:float或int。
示例代碼如下:
capital_base = 100000
3.position_base
position_base表示設置交易賬戶的初始持倉(僅適用于配置股票賬戶)。
參數類型:dict。包括兩個值,即key為股票代碼、value為數量。
示例代碼如下:
# 初始持倉:1000股平安銀行,2000股浦發銀行 position_base = {'000001.XSHE':1000, '600000.XSHG':2000}
4.cost_base
cost_base表示設置交易賬戶的初始成本(僅適用于配置股票賬戶)。
參數類型:dict。包括兩個值,即key為股票代碼、value為成本。
示例代碼如下:
# 初始持倉成本:平安銀行為12.30元,浦發銀行為11.50元 cost_base = {'000001.XSHE':12.30, '600000.XSHG':11.50}
5.commission
commission表示交易手續費。
參數說明如下。
· buycost表示買入成本。
參數類型:float。
· sellcost表示賣出成本。
參數類型:float。
· unit表示手續費單位。
參數類型:str。
unit參數包括如下兩個值。
? perValue:按成交金額的百分比收取手續費。
? perShare:按成交的股數收取手續費(僅用于配置期貨賬戶)。
示例代碼如下:
# 按成交金額的百分比收取買入0.3‰,賣出2‰的費用 commission = Commission(buycost = 0.0003, sellcost = 0.002, unit = 'perValue')
6.slippage
slippage用于設置交易滑點標準,并處理市場沖擊問題。
參數說明如下。
· value:策略進行交易時的滑點值。
參數類型:float。
· unit:計算滑點的方式,分為固定滑點和百分比滑點兩種計算方式。
參數類型:str。
unit參數包括如下兩個值。
? perValue:百分比滑點。按股價百分比進行滑點調整,滑點設置后買入價格調整為“股價×(1+滑點值)”,賣出價格調整為“股價×(1-滑點值)”。
? perShare:固定滑點。按每股股價進行滑點調整,最小單位是0.01,表示0.01元;滑點設置后買入價格調整為“股價+滑點值”,賣出價格調整為“股價-滑點值”。
示例代碼如下:
# 將滑點設置成百分比滑點0.001 slippage = Slippage(value=0.001, unit='perValue')
7.margin_rate
margin_rate用于設置保證金率,僅用于期貨策略。
參數類型:float或dict。支持如下兩種設置方法。
全局設置方法:為所有品種設置同一個保證金率(通常在只回測一個品種的時候,這種方法比較常見)。
根據品種設置:為某個或某些品種設置特定的保證金率。
示例代碼如下:
margin_rate = 0.1 margin_rate = {'IF': 0.16, 'RB': 0.1}
8.dividend_method
dividend_method用于設置基金分紅方式,僅用于場外基金策略。
參數類型:str。包括兩個值,即’cash_dividend’表示現金分紅,'reinvestment’表示紅利再投。
示例代碼如下:
dividend_method='cash_dividend'
3.6 策略基本方法
1.initialize策略初始化函數
策略初始化函數示例代碼如下:
def initialize(context)
策略初始化函數用于配置策略運行環境context對象的屬性或自定義各種變量。在策略運行周期中只執行一次。可以通過給context添加新的屬性,從而自定義各種變量。
context在策略運行(回測或模擬交易)啟動時被創建,持續整個策略的生命周期。策略在運行時可以讀取context的已有系統屬性或自定義屬性。
2.handle_data策略運行邏輯
策略運行邏輯的示例代碼如下:
def handle_data(context)
3.post_trading_day盤后處理函數
在每天運行策略結束時,可以使用post_trading_day函數進行盤后操作,比如進行當日交易總結、預計算因子值等操作。
post_trading_day()函數的參數為context,示例代碼如下:
start = '2019-01-01' # 回測起始時間 end = '2019-01-05' # 回測結束時間 universe = ['600000.XSHG'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000, position_base = {'600000.XSHG':1000}, cost_base = {'600000.XSHG': 10.05}) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') current_universe = context.get_universe('stock', exclude_halt=True) for stk in current_universe: stock_account.order_to(stk, 100) def post_trading_day(context): print context.now
3.7 策略運行環境
context表示策略運行環境,包含運行時間、行情數據等內容,還可以用于存儲策略中生成的臨時數據。策略框架會在啟動時創建context的對象實例,并以參數形式傳遞給initialize(context)和handle_data(context),用于策略調度。
在回測時,context包含運行時間、回測參數、回測運行時數據等。在模擬交易時,包含運行時間、模擬交易參數、實時運行數據等。
3.7.1 now
now表示獲取策略運行時的當前時刻,示例代碼如下:
context.now
返回類型:datetime。
用法:只能在handle_data方法中使用,并且不允許修改。
例如,獲取分鐘線策略運行時的當前時刻,代碼如下:
start = '2019-01-04' # 在2019年1月4日開始回測 end = '2019-01-04' # 在2019年1月4日結束回測 freq = 'm' refresh_rate = (1, 2) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.now
每個交易日的每2分鐘都有調倉,下面展示了部分調倉時間:
2019-01-04 09:30:00 2019-01-04 09:32:00 2019-01-04 09:34:00 ... 2019-01-04 14:56:00 2019-01-04 14:58:00
3.7.2 current_date
current_date表示獲取策略運行的當前日期,示例代碼如下:
context.current_date
context.current_date和context.now的區別為:當進行日線頻率回測時,兩者結果完全一致,當進行分鐘線頻率回測時,context.now包含小時、分鐘等一個交易日內的時間信息,而context.current_date不包含。
返回類型:datetime。
用法:只能在handle_data方法中使用,并且不允許修改。
例如,獲取策略運行時的當前日期,代碼如下:
start = '2019-01-01' # 在2019年1月1日開始回測 end = '2019-02-01' # 在2019年2月1日結束回測 freq = 'd' refresh_rate = 1 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.current_date
下面展示了部分調倉日期:
2019-01-03 00:00:00 2019-01-04 00:00:00 2019-01-05 00:00:00 ... 2019-01-25 00:00:00 2019-01-26 00:00:00
3.7.3 previous_date
previous_date表示獲取當前回測日期的前一交易日數據,示例代碼如下:
context.previous_date
返回類型:datetime。
用法:只能在handle_data方法中使用,并且不允許修改。同current_date一致。
3.7.4 current_minute
current_minute表示獲取當前運行時的分鐘值,如果在分鐘線策略中使用,建議用context.now替換。示例代碼如下:
context.current_minute
返回類型:str,如10:00。
用法:只能在handle_data方法中使用,并且不允許修改。
輸出結果的格式如下:
09:30
3.7.5 current_price
current_price表示獲取當前的參考價格,即最后成交價。在開盤前運行,獲得的是前一天的收盤價;在盤中運行,獲得的是最后一次的成交價。示例代碼如下:
context.current_price(symbol)
參數為symbol,即想要獲取的價格的證券,參數需要在之前定義的universe中存在。
參數類型:str。
返回類型:float,表示最后一刻的價格。
例如,獲取平安銀行前一天的收盤價,代碼如下:
start = '2019-01-01' # 回測起始時間 end = '2019-01-04' # 回測結束時間 universe = ['000001.XSHE'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') print context.current_price('000001.XSHE')
輸出結果如下:
9.38 9.19 9.28
3.7.6 get_account
get_account表示獲取交易賬戶。例如,獲取賬戶名稱為account_name的交易賬戶,代碼如下:
context.get_account(account_name)
參數:account_name,表示策略初始化時設置的賬戶名稱。
參數類型:str。
返回交易賬戶對象。
示例代碼如下:
start = '2019-01-01' # 回測起始時間 end = '2019-01-04' # 回測結束時間 universe = ['000001.XSHE'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'account_name': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('account_name')
3.7.7 get_universe
get_universe表示獲取當前交易日的證券池,是策略初始化參數中universe的子集。在這種配置情況下,context.get_universe()僅體現資產的上市狀態,只要資產在策略運行當天處于上市狀態,就可通過context.get_universe()獲取當前交易日的證券池。支持多種資產類型。示例代碼如下:
context.get_universe(asset_type, exclude_halt=False)
參數說明如下。
· asset_type,表示資產類型。
參數類型:str。
參數值包括’stock’表示股票列表、'index’表示指數成分股列表、'exchange_fund’表示場內基金列表、'otc_fund’表示場外基金列表、'futures’表示期貨合約列表、'base_futures’表示普通期貨合約列表、'continuous_futures’表示連續期貨合約列表。
· exclude_halt,表示去除資產池中的停牌股票,僅適用于股票,默認值為False。
參數類型:布爾型。
返回類型:list,符合篩選條件的當天上市狀態的證券池,返回的列表中可能有部分資產處于停盤等不可交易狀態。
例如,獲取上證50股票剔除停牌股票后的股票池,代碼如下:
start = '2019-01-01' # 回測起始時間 end = '2019-01-03' # 回測結束時間 universe = DynamicUniverse('SH50') # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 current_universe = context.get_universe('stock', exclude_halt=True) print current_universe
部分輸出結果如下:
['600000.XSHG', '600016.XSHG', '600019.XSHG', '600028.XSHG', '600029. XSHG', '600036.XSHG'...'603993.XSHG']
又如,分別獲取滬銅1810、滬深300期貨當月對應的期貨合約列表、普通期貨合約列表、連續期貨合約列表的代碼如下:
start = '2018-01-01' # 回測起始時間 end = '2019-01-01' # 回測結束時間 universe = ['CU1810', 'IFL0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'futures_account': AccountConfig(account_type='futures', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 print context.get_universe('futures') print context.get_universe('base_futures') print context.get_universe('continuous_futures')
部分輸出結果如下:
['CU1810', 'IFL0'] ['CU1810'] ['IFL0'] ...
3.7.8 transfer_cash
transfer_cash用于實現賬戶間的資金劃轉,示例代碼如下:
context.transfer_cash(origin, target, amount)
參數說明如下。
· origin:資金流出的賬戶名稱。
參數類型:str。
· target:資金流入的賬戶名稱。
參數類型:str。
· amount:劃轉的資金量。
參數類型:float。
示例代碼如下:
start = '2019-01-01' # 回測起始時間 end = '2019-01-10' # 回測結束時間 universe = ['000001.XSHE', 'IFM0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig('security', capital_base=1e6), 'futures_account': AccountConfig('futures', capital_base=1e6) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): stock_account = context.get_account('stock_account') futures_account = context.get_account('futures_account') if context.current_date.strftime('%Y-%m-%d') == '2017-01-05': context.transfer_cash(origin=stock_account, target=futures_account, amount=1e5) assert stock_account.cash, futures_account.cash == (900000, 1100000) assert stock_account.portfolio_value + futures_account.portfolio _value == 2000000 if context.current_date.strftime('%Y-%m-%d') == '2017-01-06': context.transfer_cash(origin=futures_account, target=stock_account, amount=2e5) assert stock_account.cash, futures_account.cash == (1100000, 900000) assert stock_account.portfolio_value + futures_account.portfolio_ value == 2000000
3.8 獲取和調用數據
3.8.1 history
history用于獲取指定證券的歷史行情、因子等時間序列數據,示例代碼如下:
context.history(symbol, attribute=['closPrice'], time_range=1, freq='1d', style='sat', rtype='frame')
參數說明如下。
· symbol:需要獲取的數據的證券列表,支持單個證券或證券列表,必須是初始化參數universe涵蓋的證券范圍。
參數類型:str或list。
· attribute:需要獲取的屬性,支持單個屬性或屬性列表。
參數類型:str或list。
資產類型可選參數說明如表3-5(日線數據)和表3-6(分鐘線數據)所示。
表3-5

表3-6

· time_range:需要回溯的歷史K線條數,和freq屬性相對應。日線數據默認最大值為30,分鐘線數據默認最大值為240,可以使用max_history_window設置最大限度取值范圍。
參數類型:int。
· freq:K線圖周期。
參數類型:str。
參數用法如下。
? 日線K線圖:1d。
? 分鐘線K線圖:1m、5m、15m、30m、60m。
· style:數據返回的格式。參數值包括ast、sat、tas 3種。a表示attribute, s表示symbol, t表示time,它們分別對應3個維度呈現的順序。例如,ast表示返回的字典中的鍵是attribute,其值是列為symbol、行為time的DataFrame,以此類推。
參數類型:str。
不同資產對象支持的參數如表3-7(日線數據)和表3-8(分鐘線數據)所示。
表3-7

表3-8

可以同時獲取多個品種資產對應的所有支持數據,當包含期貨品種時,數據返回類型必須為style = 'sat'。
· rtype:返回值的數據類型。
參數類型:str。包括兩個值,即’frame'、'array'。
返回類型:dict。key為資產符號,value的格式由rtype來決定。
以日線數據可以獲取單個品種資產對應的所有支持的數據為例,資產類型可以是股票(含場內基金)、期貨、場外基金、指數。獲取日線數據時需要將回測初始化參數中的freq的值設置為d, refresh_rate的值設置為整數,代碼如下:
# 取平安銀行向前10個交易日的日線數據 start = '2019-01-01' # 回測起始時間 end = '2019-02-01' # 回測結束時間 universe = ['000001.XSHE'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') data = context.history(['000001.XSHE'], ['openPrice', 'highPrice', 'lowPrice', 'closePrice', 'preClosePrice', 'turnoverVol', 'turnoverValue', 'adjFactor'], 10, freq='1d', rtype='frame', style='sat') print data
部分輸出結果如下:
{'000001.XSHE': closePrice turnoverValue turnoverVol lowPrice highPrice \ 2018-12-17 10.29 5.846795e+0857127487.0 10.10 10.33 2018-12-18 10.12 5.471576e+0853774430.0 10.10 10.32 2018-12-19 9.94 6.000902e+0859800701.0 9.90 10.18 2018-12-20 9.71 9.642029e+0899028479.0 9.63 9.97 2018-12-21 9.45 9.444603e+08100061676.0 9.33 9.70 2018-12-24 9.42 4.771869e+0850911767.0 9.31 9.45 2018-12-25 9.34 5.452356e+0858661545.0 9.21 9.43 2018-12-26 9.30 3.932151e+0842114060.0 9.27 9.42 2018-12-27 9.28 5.863438e+0862459327.0 9.28 9.49 2018-12-28 9.38 5.415710e+0857660400.0 9.31 9.46 openPrice adjFactor preClosePrice 2018-12-17 10.16 1.0 10.17 2018-12-18 10.20 1.0 10.29 2018-12-19 10.14 1.0 10.12 2018-12-20 9.92 1.0 9.94 2018-12-21 9.68 1.0 9.71 2018-12-24 9.40 1.0 9.45 2018-12-25 9.29 1.0 9.42 2018-12-26 9.35 1.0 9.34 2018-12-27 9.45 1.0 9.30 2018-12-28 9.31 1.0 9.28 } ...
以日線數據同時獲取多個品種資產的數據,并且只能選擇多種資產共用的參數為例,代碼如下:
# 取平安銀行和期貨主力合約向前10個交易日的日線數據 start = '2019-01-01' # 回測起始時間 end = '2019-02-01' # 回測結束時間 universe = ['000001.XSHE', 'IFM0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') data = context.history(['000001.XSHE', 'IFM0'], ['openPrice', 'highPrice', 'lowPrice', 'closePrice', 'preClosePrice', 'turnoverVol', 'turnoverValue', 'adjFactor'], 10, freq='1d', rtype='frame', style='sat') print data
以分鐘線數據獲取單個品種資產對應的所有支持的數據為例,可以是股票(含場內基金)、期貨、指數。獲取分鐘線數據時需要將回測初始化參數中的freq的值設置為m, refresh_rate的值設置為(a, b)結構,如需幫助可以查看freq和refresh_rate,代碼如下:
# 取平安銀行向前10條1分鐘K線的分鐘線數據 start = '2019-01-01' # 回測起始時間 end = '2019-01-05' # 回測結束時間 universe = ['000001.XSHE'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'm' refresh_rate = (1, 30) # 執行handle_data的時間間隔 max_history_window = (10, 300) # 分鐘線默認最大向前獲取240條K線,如果要獲取更多,請設置max_history_window=(日線 條數,分鐘線條數) accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') data = context.history(['000001.XSHE'], ['openPrice', 'highPrice', 'lowPrice', 'closePrice', 'turnoverVol', 'turnoverValue'], 10, freq='1m', rtype='frame', style='sat') print data
部分輸出結果如下:
{'000001.XSHE': closePrice highPrice lowPrice openPrice turnoverValue \ tradeTime 2019-01-04 14:21 9.68 9.69 9.66 9.663890507.74 2019-01-04 14:22 9.67 9.69 9.67 9.692936305.80 2019-01-04 14:23 9.69 9.70 9.68 9.684796156.30 2019-01-04 14:24 9.68 9.69 9.67 9.692680228.00 2019-01-04 14:25 9.68 9.70 9.68 9.682173928.00 2019-01-04 14:26 9.69 9.70 9.69 9.694548130.00 2019-01-04 14:27 9.70 9.70 9.68 9.692600399.00 2019-01-04 14:28 9.71 9.71 9.69 9.693516762.00 2019-01-04 14:29 9.73 9.73 9.70 9.704719750.60 2019-01-04 14:30 9.72 9.73 9.72 9.725949170.00 turnoverVol tradeTime 2019-01-04 14:21402082.0 2019-01-04 14:22303220.0 2019-01-04 14:23495200.0 2019-01-04 14:24276700.0 2019-01-04 14:25224400.0 2019-01-04 14:26469000.0 2019-01-04 14:27268300.0 2019-01-04 14:28362460.0 2019-01-04 14:29485660.0 2019-01-04 14:30611900.0 }
取平安銀行和期貨主力合約向前10條15分鐘K線的分鐘線數據,示例代碼如下:
# 取平安銀行和期貨主力合約向前10條15分鐘K線的分鐘線數據 start = '2019-01-01' # 回測起始時間 end = '2019-01-05' # 回測結束時間 universe = ['000001.XSHE', 'IFM0'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'm' refresh_rate = (1, 15) # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base=10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') data = context.history(['000001.XSHE', 'IFM0'], ['openPrice', 'highPrice', 'lowPrice', 'closePrice', 'turnoverVol', 'turnoverValue'], 10, freq='15m', rtype='frame', style='sat') print data
1.max_history_window
在使用context.history獲取數據時,默認對日線支持30個交易日數據,分鐘線支持240條K線數據,當回溯長度超出范圍時需要手動指定。因為回溯時間變長會影響回測速度,所以盡量不要取過長的回溯長度。
max_history_window的用法如下:
max_history_window = 40 # 設置日線數據回溯長度為向前40個交易日 # 設置分鐘線數據回溯長度為向前300條K線、20個交易日的K線長度 max_history_window = (20, 300)
2.獲取因子數據
可以直接使用context.history獲取因子數據。
用法:如下示例注冊了PE、PB兩個因子來獲取因子數據:
start = '2019-01-01' # 回測起始時間 end = '2019-03-01' # 回測結束時間 universe = ['000001.XSHE'] # 證券池,支持股票、基金、期貨 benchmark = 'HS300' # 策略參考基準 # 策略類型,'d’表示日間策略使用日線回測,'m’表示日內策略使用分鐘線回測 freq = 'd' refresh_rate = 1 # 執行handle_data的時間間隔 accounts = { 'stock_account': AccountConfig(account_type='security', capital_base= 10000000) } def initialize(context): # 初始化策略運行環境 pass def handle_data(context): # 核心策略邏輯 stock_account = context.get_account('stock_account') data = context.history(['000001.XSHE'], ['PE', 'PB'], 5, freq='1d', rtype='frame', style='sat') print data
返回的部分結果如下:
{'000001.XSHE': PB PE 2019-02-21 0.9061 7.9641 2019-02-22 0.9204 8.0903 2019-02-25 1.0010 8.7983 2019-02-26 0.9731 8.5530 2019-02-27 0.9890 8.6932} {'000001.XSHE': PB PE 2019-02-22 0.9204 8.0903 2019-02-25 1.0010 8.7983 2019-02-26 0.9731 8.5530 2019-02-27 0.9890 8.6932 2019-02-28 0.9858 8.6651}
3.8.2 get_symbol_history
get_symbol_history用于獲取指定證券的歷史行情、因子等時間序列數據,示例代碼如下:
context.get_symbol_history(symbol, time_range=1, attribute= ['closePrice'], freq='1d', style='sat', rtype='frame')
參數說明如下。
· symbol:需要獲取的數據的證券列表,支持單個證券或證券列表,必須是初始化參數universe涵蓋的證券范圍。
參數類型:str。
· time_range:需要回溯的歷史K線條數,和freq屬性相對應。日線數據默認最大值為30,分鐘線數據默認最大值為240,可以使用max_history_window設置最大限度取值范圍。
參數類型:int。
· attribute:需要獲取的屬性,支持單個屬性或屬性列表。
參數類型:str或list。
資產類型可選參數說明如表3-9(日線數據)和表3-10(分鐘線數據)所示。
表3-9

表3-10

· freq:K線圖周期。
參數類型:str。
參數用法如下。
? 日線K線圖:1d。
? 分鐘線K線圖:1m、5m、15m、30m、60m。
· style:數據返回的格式。參數值包括ast、sat、tas 3種。a表示attribute, s表示symbol, t表示time,它們分別對應3個維度呈現的順序。例如,ast表示返回的字典中的鍵是attribute,其值是列為symbol、行為time的DataFrame,以此類推。
參數類型:str。
不同資產對象支持的參數如表3-11(日線數據)和表3-12(分鐘線數據)所示。
表3-11

表3-12

可以同時獲取多個品種資產對應的所有支持數據,當包含期貨品種時,數據返回類型必須為style = 'sat'。
· rtype:返回值的數據類型。
參數類型:str。包括兩個值,即’frame'、'array'。
返回類型:dict。key為資產符號,value的格式由rtype決定。
3.8.3 get_attribute_history
get_attribute_history用于獲取指定證券的歷史行情、因子等時間序列數據,示例代碼如下:
context.get_attribute_history(attribute, time_range=1, symbol=None, freq= '1d', style='sat', rtype='frame')
參數說明如下。
· attribute:需要獲取的屬性,支持單個屬性或屬性列表。
參數類型:str。
可選參數說明如表3-13(日線數據)和表3-14(分鐘線數據)所示。
表3-13

表3-14

· time_range:需要回溯的歷史K線條數,和freq屬性相對應。日線數據默認最大值為30,分鐘線數據默認最大值為240,可以使用max_history_window設置最大限度取值范圍。
參數類型:int。
· symbol:需要獲取的數據的證券列表,支持單個證券或證券列表,必須是初始化參數universe涵蓋的證券范圍。
參數類型:str或list。
· freq:K線圖周期。
參數類型:str。
參數用法如下。
? 日線K線圖:1d。
? 分鐘線K線圖:1m、5m、15m、30m、60m。
· style:數據返回的格式。參數值包括ast、sat、tas 3種。a表示attribute, s表示symbol, t表示time,它們分別對應3個維度呈現的順序。例如,ast表示返回的字典中的鍵是attribute,其值是列為symbol、行為time的DataFrame,以此類推。
參數類型:str。
參數用法如表3-15(日線數據)和表3-16(分鐘線數據)所示。
表3-15

表3-16

可以同時獲取多個品種資產對應的所有支持數據,當包含期貨品種時,數據返回類型必須為style = 'sat'。
· rtype:返回值的數據類型。
參數類型:str。包括兩個值,即’frame'、'array'。
返回類型:dict。key為資產符號,value的格式由rtype決定。
3.8.4 DataAPI
DataAPI是獲取優礦提供的數據的主要方式,包含股票、基金、期貨、指數、債券、基本面、宏觀等多種數據。可以在Notebook中調用DataAPI對象的某個方法來獲取特定的數據。
- 數據存儲架構與技術
- Word 2010中文版完全自學手冊
- 復雜性思考:復雜性科學和計算模型(原書第2版)
- 企業大數據系統構建實戰:技術、架構、實施與應用
- 深入淺出MySQL:數據庫開發、優化與管理維護(第2版)
- 從0到1:JavaScript 快速上手
- 重復數據刪除技術:面向大數據管理的縮減技術
- 數據科學實戰指南
- Spark分布式處理實戰
- Deep Learning with R for Beginners
- SOLIDWORKS 2018中文版機械設計基礎與實例教程
- Machine Learning for Mobile
- 數據產品經理寶典:大數據時代如何創造卓越產品
- Mastering Java for Data Science
- Kafka權威指南(第2版)