成交价加权净委买比例
由bq7zuymm创建,最终由bq7zuymm 被浏览 17 用户
这一节我们来编写成交价加权净委买比例的分钟因子。该因子涉及到快照数据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()