精华帖子

成交量加权净委买比例

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

本文将要带大家使用dai加工实时的股票分钟频因子——成交量加权净委买比例。以下涉及到的流数据暂未开放,后期我们会为大家提供流数据获取服务。

数据定义

这里我们给出一些公式来了解该指标的算法,在给出公式之前,我们来看一下我们使用的数据表格结构:

时间 买一量 卖一量 成交量
t1 b1 a1 v1
t2 b2 a2 v2
tn bn an vn

我们回顾一下,在加工时序加权净委买比率是涉及到的公式:

我们对上述公式变形:

其中求和符号为分钟内的快照求和,求和符号中为快照截面因子。不熟悉快照数据分钟因子构造的可以参考**我之前写的文章**。

所以数据加工思路为:

  • 计算买一量增量、卖一量增量、成交量增量
  • 分别计算分子和分母的截面值(求和符号内的算式);
  • 分别计算分子分母的分钟内聚合求和(套上求和符号)。

因子加工代码

首先导入第三方库,在推送股票快照数据:

import dai
import pandas as pd
 
dai.pull_data_to_table(datasource='cn_stock_level2_snapshot', lookback_time=8*24*60*60, table_name='stock_data', overwrite=True)

计算买一量、卖一量、成交量时序差分:

instrument = '000001.SZ'
 
sql = f"""
-- 取出需要的因子
WITH t1 AS (
    SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) as date, 
    instrument, 
    datetime, 
    LAG(bid_volume1) OVER (PARTITION BY instrument ORDER BY datetime) AS lag_bid_volume1, 
    LAG(ask_volume1) OVER (PARTITION BY instrument ORDER BY datetime) AS lag_ask_volume1, 
    ask_volume1, 
    bid_volume1, 
    LAG(volume) OVER (PARTITION BY instrument ORDER BY datetime) AS lag_volume, 
    volume
    FROM stock_data
    WHERE instrument = '{instrument}'
    ORDER BY datetime
)
 
SELECT date, 
instrument, 
(bid_volume1 - lag_bid_volume1) AS delta_bid, 
(ask_volume1 - lag_ask_volume1) AS delta_ask, 
(volume - lag_volume) AS delta_volume
FROM t1
"""
 
stock_data = dai.stream_factor(sql, 'test', True, "date ASC")

我们需要对流计算引擎进行冷启动, 以防引擎获取的数据为空表格:

for _ in range(1000):
    data = stock_data.df()
    if len(data) <= 50:
        continue
    else:
        break

data = stock_data.df()

接下来我们使用pandas计算分母分子的快照截面因子, 然后再分别求时序值:

# 分子分母都可以通过先求解截面数据, 再求时序数据
data['up'] = (data['delta_bid'] - data['delta_ask']) / (data['delta_bid'].abs() + data['delta_ask'].abs()) * data['delta_volume']

由于分母为成交量时序差分算式,所以我们不需要额外求分母的截面,因为我们在sql中计算出了成交量差分, 所以接下来我们要做的是将分子分母在时序上分钟内聚合求和, 最后相除即可得到因子:

factor_data = (data.groupby(['date', 'instrument']).apply(lambda x: x['up'].sum()) / data.groupby(['date', 'instrument']).apply(lambda x: x['delta_volume'].sum())).reset_index()
factor_data.columns = ['date', 'instrument', 'vavg_net_buy_quote_volume_ratio']

结果展示

{link}