精华帖子

全十档委买委卖增额、增量系列因子

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

:在此之前,我们加工过委买委卖增额、增量系列因子,该系列因子只是基于一档委买委卖量和金额做的因子,所以我们在此基础上衍生出十档的增量增额因子。

数据定义

全十档委卖增额

  • 对每个快照计算变化金额,并定义任意的正整数n(n取1到10), 因子计算方式如下:

1.如果相邻快照卖n价相同,当前快照卖n价 * (当前快照卖n价数量 - 上一快照卖n价数量);

2.如果当前快照卖n价 < 上一快照卖n价,当前快照卖n价 * 当前快照卖n价数量;

3.如果当前快照卖n价 > 上一快照卖n价,-(上一快照卖n价 * 上一快照卖n价数量)。

  • 将分钟内的快照变化金额相加得到分钟的第n档的增额因子;
  • 最后将所有档位的增额因子相加。

全十档委买增额

  • 对每个快照计算变化金额,并定义任意的正整数n(n取1到10), 计算方式如下:

1.如果相邻快照买n价相同,当前快照买n价 * (当前快照买n价数量 - 上一快照买n价数量);

2.如果当前快照买n价 > 上一快照买n价,当前快照买n价 * 当前快照买n价数量;

3.如果当前快照买n价 < 上一快照买n价,-(上一快照买n价 * 上一快照买n价数量)。

  • 将分钟内的快照变化金额相加得到分钟的增额因子。
  • 最后将所有档位的增额因子相加。

当然增量因子计算方式类似,只是需要数量不需要价格。

因子加工代码

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)

# 加载十档盘口数据
# 量和价
ask_price = [f'ask_price{i}' for i in range(1, 11)]
ask_price = ', '.join(ask_price)
bid_price = [f'bid_price{i}' for i in range(1, 11)]
bid_price = ', '.join(bid_price)
ask_volume = [f'ask_volume{i}' for i in range(1, 11)]
ask_volume = ', '.join(ask_volume)
bid_volume = [f'bid_volume{i}' for i in range(1, 11)]
bid_volume = ', '.join(bid_volume)

# 委托金额
ask_amount = [f'ask_price{i} * ask_volume{i} AS ' for i in range(1, 11)]

sql = """
SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) as date, instrument, datetime, 
""" + ask_price + ', '+ bid_price + ', ' + ask_volume + ', '+ bid_volume +f"""
FROM stock_table
WHERE instrument in {instruments}
"""
engine = dai.stream_factor(sql, 'test2', True, 'datetime ASC')

# 提前设计好分组函数
def calc(df):
    df = df.sort_values('date')

    # 这个列表存的是全十档的增额增量
    buy_quote_value_diff = []
    sell_quote_value_diff = []
    buy_quote_volume_diff = []
    sell_quote_volume_diff = []
    
    # 计算十档盘口的增额(分钟内的快照增额相加)
    for i in range(1, 11):
        out1 = np.nansum(np.where(
            df[f'bid_price{i}']==df[f'bid_price{i}'].shift(1), 
            df[f'bid_price{i}'] * (df[f'bid_volume{i}'] - df[f'bid_volume{i}'].shift(1)), 
            np.where(
                df[f'bid_price{i}'] > df[f'bid_price{i}'].shift(1), 
                df[f'bid_price{i}'] * df[f'bid_volume{i}'], 
                - df[f'bid_price{i}'].shift(1) * df[f'bid_volume{i}'].shift(1)
            )
        ))
        buy_quote_value_diff.append(out1)

        out2 = np.nansum(np.where(
            df[f'ask_price{i}']==df[f'ask_price{i}'].shift(1), 
            df[f'ask_price{i}'] * (df[f'ask_volume{i}'] - df[f'ask_volume{i}'].shift(1)), 
            np.where(
                df[f'ask_price{i}'] > df[f'ask_price{i}'].shift(1), 
                df[f'ask_price{i}'].shift(1) * df[f'ask_volume{i}'].shift(1), 
                - df[f'ask_price{i}'] * df[f'ask_volume{i}']
            )
        ))
        sell_quote_value_diff.append(out2)

        out3 = np.nansum(np.where(
            df[f'bid_price{i}']==df[f'bid_price{i}'].shift(1), 
            df['bid_volume1'] - df['bid_volume1'].shift(1), 
            np.where(
                df[f'bid_price{i}'] > df[f'bid_price{i}'].shift(1), 
                df[f'bid_volume{i}'], 
                - df[f'bid_volume{i}'].shift(1)
            )
        ))
        buy_quote_volume_diff.append(out3)

        out4 = np.nansum(np.where(
            df[f'ask_price{i}']==df[f'ask_price{i}'].shift(1), 
            df[f'ask_volume{i}'] - df[f'ask_volume{i}'].shift(1), 
            np.where(
                df[f'ask_price{i}'] > df[f'ask_price{i}'].shift(1), 
                df[f'ask_volume{i}'].shift(1), 
                - df[f'ask_volume{i}']
            )
        ))
        sell_quote_volume_diff.append(out4)

    # 将所有档位的增额因子相加。
    result = pd.DataFrame(
        {
            "date":[df['date'].iloc[-1]], 
            "instrument": [df['instrument'].iloc[-1]], 
            "buy_quote_value_diff": [np.nansum(buy_quote_value_diff)], 
            "sell_quote_value_diff": [np.nansum(sell_quote_value_diff)], 
            "buy_quote_volume_diff":[np.nansum(buy_quote_volume_diff)], 
            "sell_quote_volume_diff":[np.nansum(sell_quote_volume_diff)]
        }
    )
    return result

# 抽取因子
while True:
    data = engine.df()
    if len(data)==0:
        continue
    stream_data = data.groupby(['date', 'instrument']).apply(calc).reset_index(drop=True)

结果展示

{link}