量化交易入門筆記-資料獲取函式 一
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
注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!