问答交流

【新版】如何用SQL表达换手率5日累计值

由jayjaypp创建,最终由jliang 被浏览 25 用户

如何用SQL表达以下旧版因子

#换手率5日累计值

sum(turn_0,5)

#3日前 5日收盘价均线值

mean(close_3,5)

#统计10日内上涨次数

sum( where(return_0>1 , 1 , 0 ), 10)

#5日内大单买入额与收益的相关性

correlation(hf_buy_value_large_order , return_0 , 5 )

\

使用新版:表达式和SQL

-- DAI SQL 算子/函数: https://bigquant.com/wiki/doc/dai-PLSbc1SbZX#h-%E5%87%BD%E6%95%B0
-- 数据&字段: 数据文档 https://bigquant.com/data/home / cn_stock_prefactors https://bigquant.com/data/datasources/cn_stock_prefactors
-- 数据使用: 表名.字段名, 对于没有指定表名的列,会从 expr_tables 推断


# 换手率5日累计值,使用 m_sum 时间序列上 arg 在该窗口内的和
m_sum(turn, 5) AS f1

#3日前5日收盘价均线值
# m_avg 时间序列上 arg 在该窗口内的平均值
# m_lag 时间序列上 arg 向下偏移 n 行后的值
m_avg(m_lag(close, 3), 5) AS f2

# 统计10日内上涨次数,这里定义了一个中间变量(下划线开始的,不会输出)
if(close > open, 1, 0) AS _f3
# 保证类型为 INT
m_sum(_f3, 10)::INT AS f4

#5日内大单买入额与收益的相关性
m_corr(cn_stock_money_flow.inflow_l, close / open, 5) AS f5

可视化模块-输入特征

  • 如上使用是表达式输入
  • 其中 turn、close等字段没有指定表名,因为我们指定了一个默认数据表 cn_stock_prefactors,这是一个常用的预计算因子表
  • 其中大单流入来自 cn_stock_money_flow,通过 表名.字段名,我们可以非常的引用和连接平台任何数据\n


SQL

运行 print(m1.data.read()["sql"]) 我们可以看到对应的SQL,其中 where 里的条件是因为用的AI模版里的,没有删除,可根据需要修改。对出初学者,加你先使用表达式模式

SELECT
    m_sum(turn, 5) AS f1,
    m_avg(m_lag(close, 3), 5) AS f2,
    if(close > open, 1, 0) AS _f3,
    m_sum(_f3, 10) AS f4,
    m_corr(cn_stock_money_flow.inflow_l, close / open, 5) AS f5,
    date,
    instrument
FROM cn_stock_prefactors
    JOIN cn_stock_money_flow USING(date, instrument)
QUALIFY
    list_days > 260
    AND st_status = 0
    AND COLUMNS(*) IS NOT NULL
ORDER BY date, instrument

\

构建一个AI策略

https://bigquant.com/codesharev2/feed64e9-150f-4264-9956-1799251f7326

\

评论
  • 很棒,那么什么时候需要 保证类型为 INT
  • 你看得很仔细,哈哈。不指定为INT,读出来的 dataframe 这一列是 object 类型,很奇怪。下周让计算引擎工程师看看原因。应该可以不用显示指定。
  • 计算f4,先定义 _f3,若 _f3出现空值null,是否就会导致 f4变成 object 类型?那这样很多二次计算的因子需要指定为INT
  • 我们看看是否有更好的办法解决这个问题。你是工程师?技术看起来理解很好。是否有兴趣加入开发者兴趣小组