精华帖子

基金分钟数据加工

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

本文将要带大家使用dai加工实时的基金分钟频数据, 进一步使用plotly对实时数据进行可视化操作, 加工因子需要各位对SQL语句有一定的了解,各位请参考dai的使用文档. 以下涉及到的流数据暂未开放,后期我们会为大家提供流数据获取服务。

数据定义

  • 抽取价格数据,将字段datetime转化为精确到分钟的日期格式;
  • 取每分钟最后一个快照数据的价格作为当前分钟的收盘价;
  • 分钟内快照数据最高价为当前分钟最高价,最低价为当前分钟最低价;

代码

导入第三方库,将数据流产生的实时数据推送到fund_data这张表中

import dai
 
dai.pull_data_to_table(datasource='cn_fund_level2_snapshot',table_name='fund_data',overwrite=True,lookback_time=8*24*60*60)

接下来使用dai.stream_factor来加工因子:

sql = """
WITH t1 AS (
    SELECT date_trunc('minute', to_timestamp(datetime * 1.0 / 1000 + 8 * 60 * 60)) AS date, instrument, price FROM fund_data
    WHERE instrument = '588190.SH'
), 
t2 AS (
    SELECT date, instrument, FIRST_VALUE(price) OVER (PARTITION BY date, instrument) AS open, 
    LAST_VALUE(price) OVER (PARTITION BY date, instrument) AS close, 
    price
    FROM t1
)
 
SELECT date, instrument, AVG(close) AS close, AVG(open) AS open, MAX(price) AS high, MIN(price) AS low
FROM t2
GROUP BY date, instrument
"""
fund_data = dai.stream_factor(sql, 'test', True, 'date ASC')

这里嵌套了两个CTE, 第一层定义的t1, 作用是获取快照价格并将datetime转化为分钟时间, t2的作用是利用聚合函数获取开盘价和收盘价,最后由于在t2的步骤中close和open是对字段dateinstrument聚合的结果, 所以同一分钟内、同只股票上的结果是一样的。

接下来我们需要对引擎进行冷启动操作:

for _ in range(10000):
    # 引擎冷启动
    data = fund_data.df()
    if len(data) != 0:
        break

最后我们对分钟数据进行可视化操作,这里加工的是高开低收数据, 所以我们选择使用K线图来展示数据:

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

fig = go.Figure(data=go.Candlestick(
    increasing_line_color='red', 
    decreasing_line_color='green'
))

fig.update(layout_xaxis_rangeslider_visible=False)

f = go.FigureWidget(fig)
display(f)

while True:
    data = fund_data.df()
    update(f, data)
    time.sleep(60)

结果展示


{link}