【掘金使用技巧4】list[dict]类型数据的提取与储存

发布于: 雪球转发:0回复:0喜欢:0

在掘金终端的使用过程中,一些数据的提取和储存不太方便。小编针对数据的提取和储存问题,提供一些解决方法和使用范例,欢迎大家一起学习讨论。

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']

来源:掘金量化    原文链接:网页链接