以下是 Alpha#40 策略在 DolphinDB 中的实现代码及详细解释:
1. 计算十日滚动标准差和相关系数
// 按股票代码分组,计算滚动指标
factorData = select
date,
symbol,
mstd(high, 10) as std_dev, // 10日最高价标准差
mcorr(high, volume, 10) as corr_coef // 10日最高价与成交量相关系数
from
stock_data
context by symbol
order by date;
关键点:
mstd(high, 10)
:计算过去10日(包括当前日)的最高价标准差。mcorr(high, volume, 10)
:计算过去10日最高价与成交量的滚动相关系数。context by symbol
:按股票分组,每组独立计算时间窗口。
2. 横截面排序并生成 Alpha 值
// 按日期横截面排序并计算 Alpha
alpha40 = select
date,
symbol,
(-1 * rank(std_dev)) * corr_coef as alpha40 // 排名取反后乘以相关系数
from
factorData
context by date;
关键点:
rank(std_dev)
:在每个交易日(context by date
)内,对所有股票的std_dev
进行升序排名(最小值排名为1)。-1 * rank(...)
:将排名取反(使得低标准差股票排名更负)。- 最终 Alpha 值 = 排名 * 相关系数。
完整代码
// 步骤1:计算滚动标准差和相关系数
factorData = select
date,
symbol,
mstd(high, 10) as std_dev,
mcorr(high, volume, 10) as corr_coef
from
stock_data
context by symbol
order by date;
// 步骤2:横截面排序生成 Alpha
alpha40 = select
date,
symbol,
(-1 * rank(std_dev)) * corr_coef as alpha40
from
factorData
context by date;
验证逻辑
-
数据输入:假设原始表
stock_data
包含以下列:date
(日期)、symbol
(股票代码)、high
(当日最高价)、volume
(成交量)。
-
输出结果:表
alpha40
包含三列:date
:日期symbol
:股票代码alpha40
:当日计算的 Alpha#40 因子值
与 BigQuant 的对比
BigQuant 函数 | DolphinDB 实现 | 说明 |
---|---|---|
m_stddev(high, 10) | mstd(high, 10) | 10日滚动标准差 |
横截面排序 | rank(std_dev) context by date | 按日对所有股票排序 |
相关系数 | mcorr(high, volume, 10) | 10日滚动相关系数 |
注意事项
-
时间窗口对齐:
mstd
和mcorr
的窗口包含当前日及前9日(共10日),若需要排除当前日,可调整窗口参数为10, 1
(窗口长度10,起点1)。- 例如:
mstd(high, 10, 1)
表示从当前日前1日开始的前10日数据。
-
缺失值处理:
- 若数据存在缺失值,需提前填充或过滤:
// 用前值填充缺失 update stock_data set high = prev(high) where high == NULL context by symbol;
- 若数据存在缺失值,需提前填充或过滤:
-
性能优化:
- 若数据量较大,建议使用分区表(如按日期分区)提升查询效率:
db = database("dfs://stockDB", VALUE, 2020.01.01..2023.12.31) stock_data = loadTable(db, "stock_data") // 从分区表读取
- 若数据量较大,建议使用分区表(如按日期分区)提升查询效率:
通过以上代码,你可以在 DolphinDB 中完整实现 Alpha#40 因子计算逻辑。如果需要进一步回测或实时计算,可将结果表 alpha40
与其他交易信号结合使用。