委托量加权系列因子
由xuxiaoyin创建,最终由bq7zuymm 被浏览 96 用户
委托量加权委托价实时因子
因子定义
委托量加权委托价实时因子是一个衡量市场委托深度和价格趋势的指标。它通过计算委托量与价格的加权平均值来反映市场的真实供需关系。该因子的计算公式为:
数据定义
- 计算除撤单以外的每笔委托的价格与委托量的乘积;
 - 同一分钟内将乘积相加作为分子,将委托量相加作为分母。
 
因子加工代码
import dai
import pandas as pd
from time import sleep
# 拉取数据
dai.pull_data_to_table(datasource='cn_stock_level2_trade', lookback_time=8*24*60*60, table_name='stock_data', overwrite=True)
# SQL查询
sql = f"""
SELECT 
*, date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) AS date
FROM stock_data
WHERE instrument = '000001.SZ'
ORDER BY timestamp
"""
stock_df = dai.stream_factor(sql, 's', overwrite=True)
# 计算委托量加权委托价实时因子(需要对分钟和股票进行聚合)
def weight_buy_order(df):
    data = df[(df['price']!=0)]    # 剔除撤单的委托
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
  
# 实时分钟因子加工
while True:
    data = stock_df.df()
    if len(data) == 0:
        continue
    d = data.sort_values('datetime')
    data = d.groupby(['date', 'instrument']).apply(weight_buy_order)
    sleep(60)
结果展示
委托量加权委托价(买单)
因子定义
这个因子在之前的基础上将卖单过滤掉,重复上述计算方式即可得到买单的委托量加权委托价。
加工代码
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==66)]    # 剔除撤单的委托与卖出单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
委托量加权委托价(大买单)
因子定义
我们定义买委托额超过100万元为大买单。
加工代码
我们需要明确以下几点:
- 过滤掉卖单;
 - 过滤掉撤单;
 - 选出成交额大于100万元的委托单。
 
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==66) & (df['price']*df['volume']>=1000000)]    # 剔除撤单的委托与卖出单与大单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
委托量加权委托价(小买单)
因子定义
我们定义买委托额不超过4万元为小买单。
加工代码
- 过滤掉卖单;
 - 过滤掉撤单;
 - 选出成交额小于4万元的委托单。
 
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==66) & (df['price']*df['volume']<=40000)]    # 剔除撤单的委托与卖出单与大单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
委托量加权委托价(卖单)
因子定义
与买单相反,这次我们需要将卖单的委托筛选出来。
加工代码
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==83)]    # 剔除撤单的委托与买单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
委托量加权委托价(大卖单)
因子定义
我们定义买委托额超过100万元为大卖单。
加工代码
我们需要明确以下几点:
- 过滤掉买单;
 - 过滤掉撤单;
 - 选出成交额大于100万元的委托单。
 
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==83) & (df['price']*df['volume']>=1000000)]    # 剔除撤单的委托与卖出单与大单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
委托量加权委托价(小卖单)
因子定义
我们定义卖委托额不超过4万元为小卖单。
加工代码
- 过滤掉买单;
 - 过滤掉撤单;
 - 选出成交额小于4万元的委托单。
 
我们在weight_buy_order中进行修改即可:
def weight_buy_order(df):
    data = df[(df['price']!=0) & (df['bs_flag']==83) & (df['price']*df['volume']<=40000)]    # 剔除撤单的委托与卖出单与大单
    if len(data) == 0:
        return pd.DataFrame(
            [], 
            columns=['date', 'instrument', 'sum_buy_order_logp_times_volume']
        )
    dt = data['date'].iloc[-1]
    instrument = data['instrument'].iloc[-1]
    sum_buy_order_logp_times_volume = (data['price'] * data['volume']).sum() / data['volume'].sum()
    return pd.DataFrame(
        {
            "date": [dt], 
            "instrument": [instrument], 
            "sum_buy_order_logp_times_volume": [sum_buy_order_logp_times_volume]
        }
    )
\