高频因子投研系列一 --- 日内分钟激增时刻信息降频(1)
由yangduoduo05创建,最终由yangduoduo05 被浏览 5 用户
【因子理论基础】
在股票市场中,成交量的边际变化隐含着非常重要的信息,特别是在技术分析领域,成交量被认为是股票市场的原动力。俗语“量在价先”深刻的反应了成交量的变化对于股票价格波动的预测具有指示性作用。
成交量的大小,可以衡量股票市场或者个股的活跃程度,并由此来观察买卖双方进入或退出市场的状况。本文中我们将尝试从成交量的边际变动出发,挖掘其对股票收益的潜在影响。
【因子定义逻辑】
我们以利好信息为例,当一个利好信息公布后,可能会引起相应个股成交量的突然放大。如果在成交量激增的同时,价格却未发生变动,或者未能引起价格的波动,则表明这一利好消息没能得到市场广泛的认可。相反,如果成交量激增的同时,价格出现大幅上涨,则表明市场对于此利好信息反应过于趋同,有可能出现反应过度。
因此,当市场获得新的利好信息后,一方面我们希望此信息可以被市场广泛的认可和接受,推动股票价格稳步上涨;而另一方面我们不希望成交量的激增引起的价格变动太过剧烈,这样可能代表了投资者反应过度,导致股票短时间内涨幅过大,或者风险大幅加剧。正如Arnold,Pelster和Subrahmanyam(2022)指出,“那些吸引人们注意的股票,更容易诱发人们去承担过度的风险”。
综合以上两个方面,我们希望成交量激增能带来股票价格的适度变化与波动。或者说,我们希望那些认可利好消息的人,去适度地承担风险。
【因子构建思路】
1.确定成交量激增时刻
2.计算成交量激增时刻后股票的走势变化
3.降频至日频
【因子sql】
sql1 = f"""
WITH t1 AS (
SELECT
date,
instrument,
amount,
--计算成交量差分
amount - LAG(amount) over(partition by instrument) as amount_l1,
--计算成交量日内差分的均值和标准差
AVG(amount_l1) over(partition by trading_day,instrument) as amount_l1_avg,
STDDEV(amount_l1) over(partition by trading_day,instrument) as amount_l1_std,
-大于均值+3倍标准差定义为激增时刻
amount_l1_avg + amount_l1_std*3.2 as cap,
IF(amount>cap,1,0) as cap_t,
--激增时刻后续的信息
LEAD(close,1) over(partition by trading_day,instrument ORDER BY date)/close as ret_f1,
LEAD(close,2) over(partition by trading_day,instrument ORDER BY date)/LEAD(close,1) over(partition by trading_day,instrument ORDER BY date) as ret_f2,
LEAD(close,3) over(partition by trading_day,instrument ORDER BY date)/LEAD(close,2) over(partition by trading_day,instrument ORDER BY date) as ret_f3,
LEAD(close,4) over(partition by trading_day,instrument ORDER BY date)/LEAD(close,3) over(partition by trading_day,instrument ORDER BY date) as ret_f4,
LEAD(close,5) over(partition by trading_day,instrument ORDER BY date)/LEAD(close,4) over(partition by trading_day,instrument ORDER BY date) as ret_f5,
--计算激增时刻后续收益率及收益率标准差
(ret_f1 + ret_f2 + ret_f3 + ret_f4 + ret_f5)/5 as m,
((((ret_f1 - m)**2 + (ret_f2 - m)**2 + (ret_f3 - m)**2 + (ret_f4 - m)**2 + (ret_f5 - m)**2)/5)**0.5)*cap_t as std,
(close/open)*cap_t as ret,
FROM {datasource}),
t2 AS(
--降频
SELECT date::DATE::DATETIME AS date, instrument,
AVG(std) AS f1,
AVG(ret) AS f2,
FROM t1
GROUP BY date::DATE, instrument)
SELECT
--标准化融合,减去截面均值因为希望这一值不要过大也不要过小
*,
(f1-AVG(f1) over(partition by date))*-1 as fac1,
(f2-AVG(f2) over(partition by date))*-1 as fac2,
c_zscore(fac1) + c_zscore(fac2)*0.8 as factor_,
NANAVG(factor_) OVER (partition by instrument ORDER BY date ROWS BETWEEN 15 PRECEDING AND CURRENT ROW) AS factor1_,
c_zscore(factor1_) as factor1,
from
t2
"""
【因子思考】
这是一个非常经典的使用“未来信息的因子“。
通常来说,在构建因子时我们需注意不要使用未来信息,这是构建因子的常识。然而在高频因子低频化中,在降频前使用未来信息确是可行且合理的。
每日的分钟数据为240条,假设我们有第一日的数据day1 t1 至第二日的收盘时刻数据 day2 t240, 理论上每日收盘时我们会获得day1 t1 ~ day1 t240的数据,只要在day1不使用day2的数据,实盘中都不存在未来数据的情况。也就是说t1 可以使用t2的数据,注意的是在sql中需要pb trading_day
LEAD(close,1) over(partition by trading_day,instrument ORDER BY date)/close as ret_f1,
那么这样做有设么好处呢?
因子的本质其实就是寻找与未来收益相关性高的信息。然而如果因子计算时仅使用“历史信息”其实很难与未来产生过强的相关性,那么不如反其道而行之。
通过寻找和未来最相关的时刻,通过一些条件筛选,降频。最终直接获得与未来时刻高相关的特征。这也是这期本因子的由来。 其实使用的数据是分钟未来收益率的标准差。但是未来分钟收益率的标准差并非在所有时刻都是有效信息。所以先计算出标准差信息,通过特殊时刻将“有用数据”过滤下来。最终进行降频等一系列操作。
【因子魔改思路】
原因子中仅对分钟收益率标准差 及分钟收益率在时间上进行过滤。寻找激增时刻最好的最均衡的涨幅节奏。
那么在盘口中是否存在最合理的盘口结构呢?
感兴趣的欢迎留言
HINT:什么样的盘口结构适合稳定增长?是否可以过滤出来这些时刻的盘口结构?如何设计降频方案?
\