计算部分相关系数矩阵
本文使用相关系数的矩阵表达形式,实现了计算部分相关系数矩阵的加速算法,并实证检验了三种计算相关系数矩阵方法的运行速度。
- 在计算部分相关系数矩阵时,自定义的加速算法 相比 Pandas
.corr()
方法提速约 2180 倍,比 Numpy.corrcoef()
方法提速约 115 倍。 - 在计算全部相关系数矩阵时,Numpy
.corrcoef()
方法比自定义的加速算法略快 \(10\%\),比 Pandas.corr()
方法快约 20 倍。
本文使用相关系数的矩阵表达形式,实现了计算部分相关系数矩阵的加速算法,并实证检验了三种计算相关系数矩阵方法的运行速度。
.corr()
方法提速约 2180 倍,比 Numpy .corrcoef()
方法提速约 115 倍。.corrcoef()
方法比自定义的加速算法略快 \(10\%\),比 Pandas .corr()
方法快约 20 倍。问题背景:有一个分钟级别索引的数据框,需要根据日期进行分组聚合计算。
.groupby('datetime')
无法实现按日期分组。.groupby(pd.Grouper(level='datetime', freq='D'))
会为原始数据中不存在的日期填充空值(例如,在股票数据中,周末、节假日等非交易日会被填充为空值)。.mean()
,则会出现这个问题。.transform('mean')
,则不存在这个问题。本文记录了可以正确根据日期进行分组的方法。
Pandas 中的 rolling
默认是向后(也就是向上)获取滚动窗口,如果需要向前(也就是向下)或者居中(也就是同时向上和向下)获取滚动窗口,则可以分别使用 pd.api.indexers.FixedForwardWindowIndexer
和 center=True
来实现。
本文还使用了 .shift(-1)
实现向前或者居中获取滚动窗口,并对比了这种方法与上述方法所得结果的差异。
data | forward_using_FixedForwardWindowIndexer | forward_using_shift | center_using_center | center_using_shift | |
---|---|---|---|---|---|
0 | 1.0 | 3.0 | 3.0 | 3.0 | 3.0 |
1 | 2.0 | 2.0 | 2.0 | 3.0 | 3.0 |
2 | NaN | 4.0 | 4.0 | 6.0 | 6.0 |
3 | 4.0 | 9.0 | 9.0 | 9.0 | 9.0 |
4 | 5.0 | 5.0 | NaN | 9.0 | NaN |
私募排排网的数据仅针对部分人群开放,因此在获取数据时有诸多不便。例如,网站需要用户登录才能访问、数据 CSS 样式类别名称被加密等,这些障碍使得我们无法通过常规的爬虫手段方便地获取数据。
本文尝试了多种方法爬取私募排排网的数据,包括 selenium
、浏览器工作流自动化的 Automa 插件和嵌入在浏览器开发者工具的 Web Scraper 插件。最终可行且易用的方法是使用 Web Scraper 插件,它在制作和使用爬虫程序时都十分简便。
本文是 2023 年 3 月 18 日和 3 月 25 日的量化投资策略设计与分析的课程笔记,这两节课介绍了 CTA 策略。
CTA(Commodity Trading Advisor)策略的历史可以追溯到 1965 年。
传统意义上,CTA 的投资品种仅局限于商品期货。
经过发展,CTA 扩展到了几乎所有期货品种(比如利率期货、股指期货等)。
本文是 2023 年 3 月 18 日的量化投资策略设计与分析的课程笔记,本节课介绍了常见的事件驱动策略以及实践中的注意事项。
事件驱动(Event Driven)属于量化投资之中的一个重要类别,涵盖投资机会广泛。广义上说,市场上任何发生的有可能与股票市场相关的新闻、事件、公告均有可能成为事件驱动的投资机会。常见重大事件包括:
量化投资策略设计与分析的第一次作业是基于逐笔数据构造 39 个高频因子。我对高频因子的构造经验比较少,完成这个作业后的一些经验:
groupby
、resample
、to_datetime
、reindex
、rolling
、apply
等。如果是非常大的数据集,应当用 numpy
等更快速的科学计算包,或者用C++
。用提供的某支证券为期不超过一周的高频数据复制 Table A2 中 39 种指标。
LightGBM 是一种基于决策树的梯度提升机(GBM)算法,它是一种快速、准确的机器学习算法,可以用于分类和回归问题。
本文介绍了 LightGBM 的使用方法和代码示例,并记录了自定义损失函数、打印训练过程、迭代次数参数等问题的解决方法。
本文回顾了量化投资策略设计与分析课程的一次课前练习。本练习给定的数据都比较整洁、规范,选股逻辑也比较简单清晰,是一个很好的实现选股回测的练习机会。
策略描述
请把给定的股票数据,根据行业分类(申万一级行业),分别对每一行业的股票按 PB 由低到高分为 5 组,每月第一个交易日买入那些上月 PB 处于所在行业排名最低 20% 分位组(即 PB 由低到高排序的第一组)的股票,持有 1 个月,每月换仓一次,计算该投资组合的持仓年化收益率和夏普比率,并画出累计净值曲线。
本文总结了研报 舆情因子和 BERT 情感分类模型 - 华泰证券 的主要内容。
假设 1-4 可推出:普通最小二乘估计是最小方差线性无偏估计(BLUE)。
假设 1-3 与假设 5 可推出:普通最小二乘估计具有一致性。
假设 6 并不影响普通最小二乘估计是最小方差线性无偏估计,它是为了便于在有限样本下对回归系数进行统计检验。
本文计算了普通最小二乘估计的方差,并证明了高斯 - 马尔可夫定理。
普通最小二乘估计的方差:
高斯 - 马尔可夫定理(Gauss-Markov Theorem)
在线性回归模型中,如果线性模型满足高斯马尔可夫假定,则回归系数的最佳线性无偏估计(BLUE, Best Linear Unbiased Estimator)就是普通最小二乘法估计。
本文证明了普通最小二乘估计的无偏性和一致性。
无偏性:
一致性
本文推导了线性回归的普通最小二乘估计量的矩阵形式,并在一元线性回归的情境下给出了求和形式的表达式。 $$ Y=X \widehat{\beta}+e $$
在一元线性回归的情境下:
对单列数据进行滚动计算,可以使用常规的.rolling()
。
如果需要对多列数据进行滚动计算,可以考虑下面两种方法:
numpy_ext
,使用其中的rollling_apply()
方法。.rolling()
中加入参数method='table'
。本文以方正金工发表的一篇研报中提出的计算“更优波动率”为例,实现了对多列数据进行滚动计算,并对上述两种方法总结如下:
numpy_ext.rollling_apply()
需要引入外部包numpy_ext
,该方法接受需要进行滚动计算的多个 Series,并返回计算出的一个数组。.rolling(method='table')
是 Pandas 内置的函数(需要升级到较新的版本),指定method='table'
后,就可以对数据框中的多列进行滚动计算,并返回一个数据框。若返回的多列结果相同,我们只需要取出其中一列即可。.rolling(method='table')
使用了engine='numba'
,计算速度更快。在无做空限制的情形下推导均值方差模型的有效前沿曲线,本质上是求解一个带有等式约束的最优化问题。
在 AlphaNet-V1 加入多步长的特征提取层,将池化层替换为门控循环单元(GRU),并尝试预测收益率和超额收益的方向。最后将随机森林模型作为 baseline 进行比较。
借鉴卷积神经网络的思想,通过自定义运算符函数,构造类似卷积层的特征提取层。结合批标准化层、池化层、全连接层,搭建 AlphaNet-V1,实现从量价数据到收益率预测的自动挖掘。
相比 K 折、随机交叉验证方法,时序交叉验证方法不会用到未来信息预测历史结果,在测试集上的表现更稳健。时序交叉验证在时序数据上可以缓解过拟合问题,且训练耗时更少。
利用必要的矩阵求导法则,推导最小二乘法的矩阵形式。
多因子模型可以用时间序列回归、截面回归和 Fama-Macbeth 回归进行检验。它们的适用情景不同,所得到的结果也需要不同的解读。
多因子模型反映的是资产的预期收益率和因子暴露在截面上的关系。它回答了这样的问题:在同一时刻,为什么有的资产收益率高,有的资产收益率低?
多因子模型认为,每个因子有一个预期收益率,资产在某个因子上的暴露让该资产可以获得相应的预期收益。不同资产在各个因子上的暴露程度不同,导致了不同资产有着不同的预期收益。
如果有一个多因子模型,它能很好地解释资产收益横截面差异,那么我们只需关心:
下面梳理可以对多因子模型进行检验的三种方法。