在掘金终端的使用过程中,一些数据的提取和储存不太方便。小编针对数据的提取和储存问题,提供一些解决方法和使用范例,欢迎大家一起学习讨论。
list[dict]类型数据,以tick里面的quotes为例
tick数据是一类比较特殊的数据,返回字段中的quotes代表五档行情,是一个list[dict]的结构。其中quotes[0]-quotes[4]代表1-5档行情,每一档行情里面又分为"bid_p"、"bid_v"、"ask_p"、"ask_v"四个字段,对应的格式为字典。
先看一下quotes的结构
[{'bid_p': 1747.31005859375, 'bid_v': 500, 'ask_p': 1748.0, 'ask_v': 100},
{'bid_p': 1747.0, 'bid_v': 100, 'ask_p': 1748.3800048828125, 'ask_v': 100},
{'bid_p': 1746.8599853515625, 'bid_v': 600, 'ask_p': 1748.4000244140625, 'ask_v': 1200},
{'bid_p': 1746.010009765625, 'bid_v': 59, 'ask_p': 1748.449951171875, 'ask_v': 100},
{'bid_p': 1746.0, 'bid_v': 400, 'ask_p': 1748.47998046875, 'ask_v': 100}]
每一档行情对应的字段可以通过quotes[i][字段名]
获取。以获取买一价为例,可写出如下代码:
def init(context):
# 订阅
subscribe(symbols='SHSE.600519', frequency='tick', count = 1)
def on_tick(context,tick):
print(tick['quotes'][0]['bid_p'])
if __name__ == '__main__':
run(strategy_id='在这里输入你的策略id',
filename='main.py',
mode=MODE_BACKTEST,
token='在这里输入你的token',
backtest_start_time='2020-12-01 08:00:00',
backtest_end_time='2020-12-02 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=2000000000,
backtest_commission_ratio=0.0002,
backtest_slippage_ratio=0.0001
)
如果我想输出到本地该怎么办?
要知道,tick数据是一条一条触发的,而不是一下子全返回的,直接在on_tick
里面用to_csv()
无法持续更新写入。所以,要设置一个全局变量(dataframe格式),用append
函数一条一条追加写入,等到回测结束后,再利用to_csv()
转化为csv。
以输出买入5档行情价格为例。
def init(context):
# 用来装输出的数据
context.out = pd.DataFrame()
# 订阅
subscribe(symbols='SHSE.600519', frequency='tick', count=1)
def on_tick(context,tick):
# 每个tick返回的quotes对象就是行情数据,股票从list[0]-list[4]代表买一到买五
quotes = [tick['quotes'][0]['bid_p'], tick['quotes'][1]['bid_p'], tick['quotes'][2]['bid_p'], tick['quotes'][3]['bid_p'], tick['quotes'][4]['bid_p']]
print(quotes)
context.out = context.out.append([quotes], ignore_index=True)
def on_backtest_finished(context, indicator):
context.out.columns = ['bid_p1', 'bid_p2', 'bid_p3', 'bid_p4', 'bid_p5']
print(context.out)
context.out.to_csv('quotes.csv')
print('数据提取完毕')
if __name__ == '__main__':
run(strategy_id='在这里输入你的策略id',
filename='main.py',
mode=MODE_BACKTEST,
token='在这里输入你的token',
backtest_start_time='2020-12-01 08:00:00',
backtest_end_time='2020-12-02 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=2000000000,
backtest_commission_ratio=0.0002,
backtest_slippage_ratio=0.0001
)
同样的,这种方法也适用于schedule()定时任务提取数据输出。
def init(context):
# 获取全部A股代码
context.stockall = get_instruments(exchanges='SHSE, SZSE', fields='symbol,listed_date, delisted_date', df=True)
# 用来储存结果
context.out = pd.DataFrame()
# 设置定时任务:每个月调仓一次
schedule(schedule_func=algo, date_rule='1m', time_rule='09:40:00')
def algo(context):
# 获取数据:EV,PB,BEGOTIABLEMV
fin = get_fundamentals_n(table='trading_derivative_indicator', symbols=context.stockall['symbol'].tolist(), end_date=context.now, fields='EV,PB,NEGOTIABLEMV', df=True, count=1).iloc[0]
# 输出
context.out = context.out.append([fin], ignore_index=True)
def on_backtest_finished(context, indicator):
print(context.out)
context.out.to_csv('outcome.csv') # 输出到csv
if __name__ == '__main__':
run(strategy_id='在这里输入你的策略id',
filename='main.py',
mode=MODE_BACKTEST,
token='在这里输入你的token',
backtest_start_time='2019-01-01 08:00:00',
backtest_end_time='2019-10-31 15:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=10000000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)
有哪些接口会返回这类数据呢?
1. get_history_constituents():
返回值:list[dict]. 每一天对应list里面一个元素,list[0]表示指定开始日期对应的数据,数据结构为字典,有两个key值:constituents和trade_day。其中constituents对应的还是一个dict,格式为:{个股代码:个股权重}
例:data = get_history_constituents(index='SHSE.000001', start_date='2017-07-10',end_date='2017-07-11')[0]['constituents'][SHSE.600478]
2. get_continuous_contracts():
返回值:list[dict],list里面的每一个元素对应一个交易日的主力合约。每个元素是一个dict格式,有symbol和trade_date两个key值
例:data = get_continuous_contracts(csymbol='SHFE.AG', start_date='2017-07-01', end_date='2017-07-01')[0]
3.order类函数
返回值:list[dict],list里面只有一个元素,该元素是dict格式,包括strategy_id、cl_ord_id等多个key值。
例:data = order_volume(symbol='SHSE.600000', volume=10000, side=OrderSide_Buy, order_type=OrderType_Limit, position_effect=PositionEffect_Open, price=11)[0]['strategy_id']
来源:掘金量化 作者;四两
————————————————————————————————————
推荐阅读: