精华帖子

委买委卖增额、增量系列因子

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

这一章我们来构造一系列的增额因子:委买增额(买一变化金额)、委卖增额(卖一变化金额)、委买增量(买一变化量)、委卖增量(卖一变化量)。

数据定义

委卖增额

  • 对每个快照计算变化金额, 计算方式如下:

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

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

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

  • 将分钟内的快照变化金额相加得到分钟的增额因子。

委买增额

  • 对每个快照计算变化金额, 计算方式如下:

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

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

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

  • 将分钟内的快照变化金额相加得到分钟的增额因子。

委买增量和委卖增量的条件和上述两个因子的条件是对应一致的,但是不乘价格。

因子加工代码

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)

# 初始化引擎
sql = f"""
SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) as date, instrument, datetime, 
bid_price1, bid_volume1, ask_price1, ask_volume1
FROM stock_table
WHERE instrument in {instruments}
"""
engine = dai.stream_factor(sql, 'test', True, 'datetime ASC')

# 提前定义好聚合的函数
def calc(df):
    df = df.sort_values('date')
    buy_quote_value_diff = np.nansum(np.where(
        df['bid_price1']==df['bid_price1'].shift(1), 
        df['bid_price1'] * (df['bid_volume1'] - df['bid_volume1'].shift(1)), 
        np.where(
            df['bid_price1'] > df['bid_price1'].shift(1), 
            df['bid_price1'] * df['bid_volume1'], 
            - df['bid_price1'].shift(1) * df['bid_volume1'].shift(1)
        )
    ))

    sell_quote_value_diff = np.nansum(np.where(
        df['ask_price1']==df['ask_price1'].shift(1), 
        df['ask_price1'] * (df['ask_volume1'] - df['ask_volume1'].shift(1)), 
        np.where(
            df['ask_price1'] > df['ask_price1'].shift(1), 
            df['ask_price1'].shift(1) * df['ask_volume1'].shift(1), 
            - df['ask_price1'] * df['ask_volume1']
        )
    ))

    buy_quote_volume_diff = np.nansum(np.where(
        df['bid_price1']==df['bid_price1'].shift(1), 
        df['bid_volume1'] - df['bid_volume1'].shift(1), 
        np.where(
            df['bid_price1'] > df['bid_price1'].shift(1), 
            df['bid_volume1'], 
            - df['bid_volume1'].shift(1)
        )
    ))

    sell_quote_volume_diff = np.nansum(np.where(
        df['ask_price1']==df['ask_price1'].shift(1), 
        df['ask_volume1'] - df['ask_volume1'].shift(1), 
        np.where(
            df['ask_price1'] > df['ask_price1'].shift(1), 
            df['ask_volume1'].shift(1), 
            - df['ask_volume1']
        )
    ))

    result = pd.DataFrame(
        {
            "date":[df['date'].iloc[-1]], 
            "instrument": [df['instrument'].iloc[-1]], 
            "buy_quote_value_diff": [buy_quote_value_diff], 
            "sell_quote_value_diff": [sell_quote_value_diff], 
            "buy_quote_volume_diff":[buy_quote_volume_diff], 
            "sell_quote_volume_diff":[sell_quote_volume_diff]
        }
    )
    return result
    
# 加工实时数据
while True:
    time.sleep(59)
    data = engine.df()
    if len(data)==0:
        continue
        
    stream_data = data.groupby(['date', 'instrument']).apply(calc).reset_index(drop=True)

结果展示

{link}