成交量加权净委买比例
由bq7zuymm创建,最终由bq7zuymm 被浏览 25 用户
本文将要带大家使用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']