1. 程式人生 > >量化交易入門筆記-資料獲取函式 一

量化交易入門筆記-資料獲取函式 一

history()函式

history()獲取歷史資料,可查詢多個標的單個數據欄位,返回資料格式為 DataFrame 或 Dict(字典),其語法格式如下:

history(count, 
        unit='1d', 
        field='avg', 
        security_list=None, 
        df=True, 
        skip_paused=False, 
        fq='pre')

在獲取天資料時,不包括當天的資料,即使是在收盤後

關於停牌:因為獲取多隻股票的原因,為了保持資料格式的一致,預設沒有跳過停牌的日期,停牌的資料使用停牌前的資料填充

引數解析:

  • count : 表示返回結果集的行數

  • unit : 表示單位時間的長度,幾天或者幾分鐘

    • Xd : 幾天
    • Xm : 幾分鐘

    **當X>1時,fields只支援['open', 'close', 'high', 'low', 'volume', 'money']這幾個標準欄位 **

  • field : 表示獲取的資料型別,支援 SecurityUnitData 裡所有的基本屬性,包括:

    • open : 開盤價
    • close : 收盤價
    • high : 最高價
    • low : 最低價
    • volume : 成交量
    • money : 成效額
    • factor : 前復權因子
    • high_limit : 漲停價
    • low_limit : 跌停價
    • avg : 平均價 (money/volume)
    • pre_close : 前一個單位時間的結束時的價格
    • paused : 布林值。用來判斷是否停牌
  • security_list : 用來獲取資料的股票列表,其值如果為None,則預設從context.universe中選擇股票

  • df : 如果是True,則返回 pandas.DataFrame,否則返回dict;預設為 True

  • skip_paused : 用來設定是否跳過不交易日期(包括停牌、未上市或者退市後的日期)。如果不跳過,停牌時會使用停牌前的資料填充。上市前或者退市後資料都為nan。需要注意的是,該引數的預設為False,即不跳過不交易日期

  • fq : 表示復權選項。值為"pre",表示前復權;值為 None ,表示不復權,返回實際價格;值設定為 ”pos",表示後復權

示例:

import pandas as pd

# 顯示中國平安 000009 最後5個交易日每天的收盤價資訊
df = history(5, 
             unit='1d', 
             field='close', 
             security_list='000009.XSHE', 
             df=True, 
             skip_paused=False, 
             fq='pre')
df
000009.XSHE
2018-09-25 4.77
2018-09-26 4.69
2018-09-27 4.59
2018-09-28 4.64
2018-10-08 4.50
import pandas as pd

# 同時顯示多隻股票的第天的收盤價資訊
df = history(5, 
             unit='1d', 
             field='close', 
             security_list=['000001.XSHE',
                           '000002.XSHE',
                           '000009.XSHE'], 
             df=True, 
             skip_paused=False, 
             fq='pre')
df
000001.XSHE 000002.XSHE 000009.XSHE
2018-09-25 10.55 24.64 4.77
2018-09-26 10.71 24.67 4.69
2018-09-27 10.74 24.45 4.59
2018-09-28 11.05 24.30 4.64
2018-10-08 10.45 22.05 4.50
import pandas as pd

df = history(3,
            unit='1d',
            field='open',
            security_list=['000001.XSHE',
                          '000002.XSHE',
                          '000009.XSHE'],
            df=True,
            skip_paused=False,
            fq='pre')

print('顯示平安銀行過去3天的每天的開盤價')
print(df['000001.XSHE'])
print('顯示昨天平安銀行的開盤價')
print(df['000001.XSHE'][-1])
print('顯示三隻股票的昨日開盤價')
print(df.iloc[-1])
print('顯示每隻股票過去3天的平均價格')
print(df.mean())

顯示平安銀行過去3天的每天的開盤價
2018-09-27    10.65
2018-09-28    10.78
2018-10-08    10.70
Name: 000001.XSHE, dtype: float64
顯示昨天平安銀行的開盤價
10.7
顯示三隻股票的昨日開盤價
000001.XSHE    10.70
000002.XSHE    22.95
000009.XSHE     4.59
Name: 2018-10-08 00:00:00, dtype: float64
顯示每隻股票過去3天的平均價格
000001.XSHE    10.710000
000002.XSHE    24.026667
000009.XSHE     4.630000
dtype: float64

再看如果輸出的是dict型別的資料的情況:

import pandas as pd

df = history(3,
            unit='1d',
            field='high',
            security_list=['000001.XSHE',
                          '000009.XSHE'],
            df=False,
            skip_paused=False,
            fq='pre')

print('兩隻股票近三日的最高價資訊', df)
print('顯示平安銀行近三日的最高價資訊', df['000001.XSHE'])
print('顯示平安銀行近三日的最高價的和', df['000001.XSHE'].sum())
print('顯示平安銀行近三日的最高價的平均值', df['000001.XSHE'].mean())

兩隻股票近三日的最高價資訊 {'000009.XSHE': array([ 4.7 ,  4.65,  4.59]), '000001.XSHE': array([ 10.84,  11.27,  10.79])}
顯示平安銀行近三日的最高價資訊 [ 10.84  11.27  10.79]
顯示平安銀行近三日的最高價的和 32.9
顯示平安銀行近三日的最高價的平均值 10.9666666667

attribute_history()函式

attribute_history()獲取歷史資料,可查詢單個標的多個數據欄位,返回資料格式為 DataFrame 或 Dict(字典)

語法如下:

attribute_history(
    security,
    count,
    unit='id',
    fields=['open', 'close', 'high', 'low', 'volume', 'money'],
    skip_paused=True,
    df=True,
    fq='pre'
)

在獲取天資料時,不包括當天的資料,即使是在收盤後。預設跳過了停牌日期

示例:(這裡採用顯性的引數名賦值方法)

import pandas as pd

df = attribute_history(
    security='000009.XSHE',
    count=5,
    unit='1d',
    fields=['open', 'close', 'high', 'low', 'volume', 'money'],
    skip_paused=True,
    df=True,
    fq='pre')
df
open close high low volume money
2018-09-25 4.68 4.77 4.77 4.64 12286364 57765550.48
2018-09-26 4.71 4.69 4.75 4.63 15451984 72594583.00
2018-09-27 4.70 4.59 4.70 4.58 9656945 44753925.93
2018-09-28 4.60 4.64 4.65 4.59 7561961 34951199.58
2018-10-08 4.59 4.50 4.59 4.48 9551775 43298882.77

下面是返回資料的常用常法:

# 適用於DataFrame和dict
df['open']  # 過去5天的每天的開盤價
df['close'][-1]  # 昨天的收盤價
df['open'].mean()  # 過去5天的每天的開盤價的平均價

# 只適用於DataFrame
df['open']['2018-09-28']  # 行的索引可以是整數,也可以是日期形式
df['open'][datetime.date(2018, 9, 28)]
df['open'][datetime.datetime(2018, 9, 28)]
df.iloc[-1]  # 按行取資料,指昨天的資料
df.iloc[-1]['open']  # 昨天的開盤價
df.loc['2018-09-28']['open']
df = df[df['avg'] > 6]  # 顯示均價大於6的資料
df['close'] = df['open']/df['factor']  # 開盤價/復權因子=原始開盤價
df['close'] = df['close']/df['facotr']  # 收盤價/復權因子=原始收盤價

get_current_data()函式

在回測時,有些資料在一個單位時間(天/分鐘)是知道的,例如漲跌停價、是否停牌、當天的開盤價等,這些資料可以通過本函式獲得

語法如下:

get_current_data(security_list=None)

**如果security_list 是 None,代表使用 universe 中的股票 **

該函式返回一個 dict 物件,key 是股票程式碼,value 資料具體如下:

  • high_limit : 漲停價
  • low_limit : 跌停價
  • paused : 是否停止 或者暫停交易,當停牌、未上市或退市 後返回 True
  • is_st : 是否包含 ST, *ST
  • day_open : 當天開盤價,分鐘回測時可用,天回測時,由於是在集合競價下單,並不知道開盤價,rnn8所以不能使用
  • name : 股票現在的名稱
  • industry_code : 股票現在所屬的行業程式碼

**需要注意的是,為了回事,返回的 dict 裡面的資料是按需獲取的,dict 初始是空的。當使用 current_data[security]時,該 security 的資料才會被獲取。另外,返回的結果只在當天有效,不能存起來到隔天使用

例項程式碼:

set_universe(['000001.XSHE'])

def handle_data(context, data):
    current_data = get_current_data()
    print(current_data)
    print(current_data['000001.XSHE'])
    print(current_data['000001.XSHE'].paused)  # 查詢股票當天是否停牌
    print(current_data['000001.XSHE'].high_limit)  # 獲取當天的漲停價

get_bars()函式

獲取歷史資料(包含快照資料),可查詢單個標的多個數據欄位,返回資料格式為 numpy.ndarray

即返回K(bar)線圖的快照資料,語法如下:

get_bars(security, 
         count,
         unit='1d',     
         fields=['date', 'open','high','low','close'],  
         include_now=False, 
         end_dt=None, 
         fq_ref_date=None)

獲取各種時間週期的 bar 資料, bar 的分割方式與主流股票軟體相同, 而且支援返回當前時刻所在 bar 的資料

引數

  • security: 股票程式碼
  • count: 大於0的整數,表示獲取bar的個數。如果行情資料的bar不足count個,返回的長度則小於count個數。
  • unit: bar的時間單位, 支援如下週期:‘1m’, ‘5m’, ‘15m’, ‘30m’, ‘60m’, ‘120m’, ‘1d’, ‘1w’, ‘1M’。‘1w’ 表示一週,‘1M’ 表示一月。
  • fields: 獲取資料的欄位, 支援如下值:‘date’, ‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’
  • include_now: 取值True 或者False。 表示是否包含當前bar, 比如策略時間是9:33,unit引數為5m, 如果 include_now=True,則返回9:30-9:33這個分鐘 bar。
  • end_dt:查詢的截止時間,支援的型別為datetime.datetime或None。為None在回測模擬環境下預設為context.current_dt,在研究環境下預設為datetime.now(),支援的格式為。
  • fq_ref_date:復權基準日期,為None時為不復權資料。注意在回測及模擬交易中,預設為None,即不復權資料;在研究環境中,預設復權基準日期為當天

返回

一個 numpy.ndarray 物件。可以通過 array[‘close’] 的方式直接訪問列資料。

示例

array = get_bars('000001.XSHG', 5, unit='1d',fields=['open','close'],include_now=False)
array['close']

array([ 2724.8 ,  2724.42,  2723.26,  2722.92,  2724.05])

其實,其他資料獲取函式也可以做這一點,即獲得K線的快照資料

例如:

array = get_bars('000001.XSHG', 
                 5, unit='1m',
                 fields=['date', 'open', 'close', 'high', 'low', 'volume', 'money'],
                 include_now=False)

df = attribute_history(
    security='000001.XSHG',
    count=5,
    unit='1m',
    fields=['open', 'close', 'high', 'low', 'volume', 'money'],
    skip_paused=True,
    df=True,
    fq='pre')

print(array)
print(df)

[ (datetime.datetime(2018, 10, 9, 13, 22), 2725.47, 2724.8, 2725.72, 2724.05, 25296600.0, 257562398.9)
 (datetime.datetime(2018, 10, 9, 13, 23), 2724.63, 2724.42, 2724.98, 2724.31, 25518400.0, 241811255.9)
 (datetime.datetime(2018, 10, 9, 13, 24), 2724.15, 2723.26, 2724.39, 2722.94, 27154900.0, 256055358.1)
 (datetime.datetime(2018, 10, 9, 13, 25), 2722.95, 2722.92, 2723.45, 2722.73, 29886300.0, 261758003.0)
 (datetime.datetime(2018, 10, 9, 13, 26), 2722.7, 2724.05, 2724.29, 2722.15, 32145400.0, 331564478.1)]
                        open    close     high      low    volume        money
2018-10-09 13:22:00  2725.47  2724.80  2725.72  2724.05  25296600  257562398.9
2018-10-09 13:23:00  2724.63  2724.42  2724.98  2724.31  25518400  241811255.9
2018-10-09 13:24:00  2724.15  2723.26  2724.39  2722.94  27154900  256055358.1
2018-10-09 13:25:00  2722.95  2722.92  2723.45  2722.73  29886300  261758003.0
2018-10-09 13:26:00  2722.70  2724.05  2724.29  2722.15  32145400  331564478.1

都返回了前五分鐘的K線快照資料,只是返回的資料型別不一樣罷了,在使用中可以靈活呼叫

get_price()函式

該函式在章節《Pandas庫》中已經有過講解,這裡不再作詳述

現將這幾個函式作一個對比

  • get_price 獲取歷史資料,可查詢多個標的多個數據欄位,返回資料格式為 DataFrame
  • history ♠ 獲取歷史資料,可查詢多個標的單個數據欄位,返回資料格式為 DataFrame 或 Dict(字典)
  • attribute_history ♠ 獲取歷史資料,可查詢單個標的多個數據欄位,返回資料格式為 DataFrame 或 Dict(字典)
  • get_current_data ♠ 獲取當前時間資料
  • get_bars 獲取歷史資料(包含快照資料),可查詢單個標的多個數據欄位,返回資料格式為 numpy.ndarray

注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!