在掘金终端的使用过程中,一些数据的提取和储存不太方便。小编针对数据的提取和储存问题,提供一些解决方法和使用范例,欢迎大家一起学习讨论。
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') # 输出到csvif __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']
来源:掘金社区 作者:四两
声明:本公众号致力于量化投资相关的干货文章分享,仅供交流探讨,不构成任何投资建议!著作权归作者所有,若涉及侵犯您的权益,敬请原作者见谅,并后台留言联系小编进行协商或删除处理,谢谢。
END
点击“阅读原文”掘金量化实盘申请