精华帖子

盘口买卖数量、金额系列因子

由bq7zuymm创建,最终由bq7zuymm 被浏览 63 用户

这一期我们介绍四个因子:盘口买入数量、盘口买入金额、盘口卖出数量、盘口卖出金额。

数据定义

我们以盘口买入数量为例,它的计算步骤如下:

  1. 对每个快照, 将所有盘口委买10档数量求和;
  2. 一分钟区间内, 对所有快照的委买量取平均(数量加总/快照数)。

那么金额是同样的道理,在第一步我们将十档的委买(或委卖)成交额相加即可。

因子加工代码

import dai
import time
import numpy as np
import pandas as pd

# 我们以000002.SZ为例
instruments = "('000002.SZ')"
dai.pull_data_to_table(datasource='cn_stock_level2_snapshot', table_name='stock_table', overwrite=True, lookback_time=72*60*60)

# 初始化流引擎
sell_quote_volume = '+'.join([f'ask_volume{i}' for i in range(1, 11)]) + ' AS sell_quote_volume '
sell_quote_value = '+'.join([f'ask_price{i}*ask_volume{i}' for i in range(1, 11)]) + ' AS sell_quote_value '
buy_quote_value = '+'.join([f'bid_price{i}*bid_volume{i}' for i in range(1, 11)]) + ' AS buy_quote_value '
buy_quote_volume = '+'.join([f'bid_volume{i}' for i in range(1, 11)]) + ' AS buy_quote_volume '

sql = """
SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) as date, instrument, datetime,
""" + sell_quote_volume + ',' + sell_quote_value + ',' + buy_quote_value + ',' + buy_quote_volume + f"""
FROM stock_table
WHERE instrument in {instruments}
"""
engine = dai.stream_factor(sql, 'test', True, 'datetime ASC')

# 提前定义好pandas的分组函数
def calc_factor(df):
    df = df.sort_values('date')
    
    # 分钟聚合求平均
    sell_quote_volume = df['sell_quote_volume'].mean()
    sell_quote_value = df['sell_quote_value'].mean()
    buy_quote_value = df['buy_quote_value'].mean()
    buy_quote_volume = df['buy_quote_volume'].mean()

    result = pd.DataFrame(
        {
            "date":df['date'].iloc[-1], 
            "instrument": df['instrument'].iloc[-1], 
            "sell_quote_volume": [sell_quote_volume], 
            "sell_quote_value":[sell_quote_value], 
            "buy_quote_value": [buy_quote_value], 
            "buy_quote_volume": [buy_quote_volume]
        }
    )
    return result

# 实时分钟因子加工
while True:
    time.sleep(54)   # 聚合求均值时花费的时间较长,所以我们睡眠时间需要适当缩短
    data = engine.df()
    if len(data) == 0:
        continue
    stream_data = data.groupby(['date', 'instrument']).apply(calc_factor).reset_index(drop=True)

结果展示

{link}