精华帖子

分钟盘口平均委买量

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

本文将使用dai利用快照数据加工分钟频因子并进行可视化处理,需要用到十档委买单数量,所以我们需要使用的表格为cn_stock_level2_snapshot。以下涉及到的流数据表需要权限才可使用,开通权限请咨询小Q。

数据定义

这里我们需要花一些篇幅来介绍一下我们是如何将快照数据处理成分钟数据的。

本篇文章加工的是分钟频因子, 加工分钟频因子会出现两种情况。不妨设图中的每隔时点t1,t2,…,tn为每个分钟的开始时刻(类似于09:30:00这样, 秒为0,每个分钟的开始时刻又为上一个分钟的结束时刻)。

  • 历史快照因子加工。也就是图中t1至t2的区间,这段时间我们计算出每隔快照上的因子值,之后将同一分钟的快照因子值根据某一规则聚合成该分钟的一个因子值;
  • 实时快照因子加工。也就是图中tn到当前时刻的这段时间,与历史快照因子加工不同的是, 我们计算因子值之后在tn到当前时刻的这段时间内进行聚合得到分钟内的因子值。

==所以在历史时刻我们得到的因子值是一个恒定不变的值, 但是实时数据是一个变化的值, 因为当前时刻在变化,直到当前时刻变为一分钟的结束时刻,因子值才不会改变。==

在明白了分钟因子的构造方法后,我们来解读一下分钟盘口平均委买量的因子计算过程:

  • 首先,个股快照截面上, 将买入方向前十档委托单的数量相加, 得到该快照的总委买量;
  • 最后,在个股分钟内将所有快照下的总委买量进行平均运算即可得到分钟盘口买入数量.

该指标作用如下:

  • 用于衡量短期个股的买入意愿, 如果该指标在某一段时间内持续增加,可能预示市场有较强的买入意愿;
  • 高水平的委托买入单通常表示市场流动性较好,交易者可以更容易地买入较大数量的证券而不显著影响市场价格;
  • 通过观察该指标的变化,可以帮助交易者识别潜在的市场风险。例如,突然的买入委托量增加可能预示着重大信息即将公布,交易者可以提前做好准备。

因子加工代码

导入第三方库

import dai
import time
import plotly.graph_objects as go
from IPython.display import display
from plotly.subplots import make_subplots

j接下来将l2数据推送到stock_table这张表中

dai.pull_data_to_table(datasource='cn_stock_level2_snapshot', table_name='stock_table', overwrite=True, lookback_time=5*60*60)

假设当前时间是10:00, 那么dai会推送5:00到10:00的数据给你, 这就是lookback_time的作用。

我们以平安银行这只股票为例, 接下来要编写加工因子的SQL:

instruments = "('000001.SZ')"
sql = f"""
WITH table_1 AS (
    SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) as date, instrument, 
    bid_volume1 + bid_volume2 + bid_volume3 + bid_volume4 + bid_volume5 + bid_volume6 + bid_volume7 + bid_volume8 + bid_volume9 + bid_volume10 AS total_bid_volumne
    FROM stock_table
    WHERE instrument in {instruments}
)
SELECT date, instrument, AVG(total_bid_volumne) AS avg_bid_volume
FROM table_1
GROUP BY date, instrument
"""
df = dai.stream_factor(sql, 'test', overwrite=True, order_by='date ASC')           # 调用数据时需要使用df.df()的返回值

我们在SQL中使用了一层CTE, 也就是代码中的table_1, 针对不熟悉SQL的伙伴,我们来解读一下代码:

  • 首先将时间戳转化为精确到分钟的时间数据,故用到了date_trunc函数;
  • 在快照截面数据上将十档委买量进行加总。
  • 接下来我们要对一分钟之内的总委买量求平均, 值得注意的是, 当存在多标的时我们需要对不同标的下的分钟内进行平均操作, 所以需要对instrument和date两个字段进行分组.

需要注意的是dai.stream_factor只是一个计算引擎,如果要返回实时数据,需要调用其df()方法:

df.df()

最后我们需要对实时数据进行可视化操作:

# 绘制表格
def update_data(fig, new_data, window_size:int=20):
    """
    往表格添加新的因子数据
    :params fig: 画布
    :params new_data: 新的数据点
    """
    factor = new_data['avg_bid_volume'].iloc[-1]
    date = new_data['date'].iloc[-1]
     
    # 只留20个数据点
    if len(fig.data[0].x)==window_size and len(fig.data[0].y)==window_size:
        x = fig.data[0].x[1:] + (date, )
        y = fig.data[0].y[1:] + (factor, )
        fig.data[0].x = x
        fig.data[0].y = y
    else:
        f.data[0].x += (date, )
        f.data[0].y += (factor, )
 
# 定义画布
fig = make_subplots(rows=1, cols=1)
fig.add_trace(go.Scatter(x=(), y=(), mode='lines+markers', name='平均委买量'), row=1, col=1)
 
# 更新布局
fig.update_layout(title_text='平均委买量', height=600)
 
f = go.FigureWidget(fig)
display(f)
 
while True: 
    update_data(f, df.df())          # 第一次运行df.df()会较慢, 请耐心等候
    time.sleep(59)                   # 休眠59秒

结果展示

{link}