精华帖子

成交价加权净委买比例

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

这一节我们来编写成交价加权净委买比例的分钟因子。该因子涉及到快照数据cn_stock_level2_snapshot表格,但目前流数据表暂未开放,后期我们会为大家提供流数据获取服务。

数据定义

成交量加权净委买比例的因子加工方法是类似的,为了大家能够详细的理解该因子,我们还是从头来解读一下该因子的加工流程。

首先我们需要的数据表如下所示:

日期 一档委买量 一档委卖量 快照成交量 快照成交额
d1 b1 a1 v1 amount1
d2 b2 a2 v2 amount2
d3 b3 a3 v3 amount3
dn bn an vn amountn

这里先给出因子计算公式,然后我们一一解释其中的含义:

这是一个加权和的形式,我们需要明白加权和满足以下形式:

其中:

我们回到因子的计算公式,如果我们套到加权和的表达式中可以发现:

我们定义分母部分为快照成交均价。所以这个因子名中有“成交价加权”这个字样。其中分子部分为成交均价。而加权的目标是:

這個比值就是净委买比例,所以因子名为成交价加权净委买比例。

由于我们是将快照因子加工成分钟因子,所以这个求和是在分钟内求和, 分钟求和的方法具体参考“**分钟盘口平均委买量“**这篇文章。

因子加工代码

import dai
import pandas as pd

dai.pull_data_to_table(datasource='cn_stock_level2_snapshot', lookback_time=12*24*60*60, table_name='stock_data', overwrite=True)

我们需要借助pandas库以及dai.query来得到我们的计算结果,所以我们需要提前准备好我们的字段:

sql = """
WITH t1 AS (
    SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000)) as date, datetime, instrument, 
    LAG(amount, 1) OVER (PARTITION BY instrument ORDER BY datetime) AS lag_amount,
    amount, 
    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 = '300750.SZ'
)
SELECT date, instrument, bid_volume1 - lag_bid_volume1 AS delta_bid,
ask_volume1 - lag_ask_volume1 AS delta_ask, 
amount - lag_amount AS delta_amount, 
volume - lag_volume AS delta_volume
FROM t1
"""
engine = dai.stream_factor(sql, 'test', overwrite=True, order_by="date ASC")

进一步使用pandas来计算截面的成交均价和净委买比例

data =engine.df()
data['snapshot_avg_price'] = data['delta_amount'] / data['delta_volume']
data['snapshot_ratio'] = (data['delta_bid'] - data['delta_ask']) / (data['delta_bid'].abs() + data['delta_ask'].abs())

接下来需要在分钟内求和, 之前我们在使用stream_factor抽取数据时我们已经将datetime字段加工成了分钟时间,所以我们直接对分钟时间聚合即可得到分钟因子:

sql = """
SELECT date, instrument, SUM(snapshot_ratio) / SUM(snapshot_avg_price) AS pavg_net_buy_quote_volume_ratio
FROM data
GROUP BY date, instrument
QUALIFY COLUMNS (*) IS NOT NULL
ORDER BY date
"""
df = dai.query(sql).df()

结果展示

标签

股票因子
{link}