基金分钟数据加工
由bq7zuymm创建,最终由bq7zuymm 被浏览 33 用户
本文将要带大家使用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是对字段date
和instrument
聚合的结果, 所以同一分钟内、同只股票上的结果是一样的。
接下来我们需要对引擎进行冷启动操作:
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)
结果展示