引言
大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档。在现代金融市场中,投资已成为个人和机构追求财富增长的重要手段。本文将系统梳理股票投资的基本概念,重点解析技术面和基本面数据,并介绍如何使用Python进行量化分析。
一、量化选股策略概述
1. 为什么需要选股
在经济学的有效市场理论模型中,证券市场根据有效性可以分为四种类型:无效市场、弱式有效市场、半强式有效市场和强式有效市场。不同类型的市场对投资者的策略提出了不同的要求。
- 无效市场:当前股价未反映历史价格信息,投资者可以通过技术分析过去的价格信息以获取未来股价的变化倾向,从而在交易中获利。
- 弱式有效市场:技术分析失效,基本面分析仍然有效。
- 半强式有效市场:基本面分析失效,内幕消息仍然有效。
- 强式有效市场:所有信息都已反映在股价中,投资者只能获得市场平均收益。
量化选股策略:
- 证券市场在短期内的无效会使得一些有价值的股票出现较低的价格,而长期的有效会使得这些低价的股票回归到其应有的高价格,精准地选取到这些股票就能使交易者在这种低买高卖中获取超额收益。
- 通过量化交易的方式,尽量帮助人们摆脱情绪对交易造成的消极影响,更客观地帮助投资者选取可能带来超额收益的股票。
2. 单/多因子选股模型
① 效用模型与风险模型
作者在这里先对下面的概念一一进行讲解:
(1)效用函数
在经济学中,为了简化问题,假设每个人都有一个效用函数(utility function) ( u ),它的输入是一个财富总额,输出是这么多的财富可以给这个人带来多少效用。效用,简单来讲就是指金钱和物质给一个人带来的在生活中的满足感和便利性。每个人的效用函数是不一样的,但是抛开个体差异,一般来讲,大多数人的效用函数都满足两个性质。
性质1:如果 ( $ x \leq y $ ),那么 ( $ u(x) \leq u(y) $ )。即钱多总比钱少好。
性质2:如果 ( $ d \geq 0 $ ),并且 ( $ x \leq y $ ),那么 ( $ u(x+d) - u(x) \geq u(y+d) - u(y) $ )。即给两个人同样数额的钱,其中较穷的那个人获得的效用更多。效用函数符合该性质的投资者被称为风险厌恶者。
效用函数是经济学中用来衡量个人对财富或消费的满意程度的工具。它通常表示为 ( u(x) ),其中 ( x ) 是财富或消费的数量。效用函数的主要性质包括:
- 单调性:如果 ( x \leq y ),那么 ( u(x) \leq u(y) )。这意味着财富越多,效用越高。
- 边际效用递减:如果 ( d \geq 0 ),并且 ( x \leq y ),那么 ( u(x+d) - u(x) \geq u(y+d) - u(y) )。这意味着随着财富的增加,每增加一单位财富所带来的效用增加是递减的。
举例:
- 假设有两个投资者,投资者A和投资者B,他们的效用函数分别为 ( u_A(x) ) 和 ( u_B(x) )。假设 ( u_A(x) = \sqrt{x} ) 和 ( u_B(x) = x^2 )。
- 对于投资者A,如果 ( x = 4 ),那么 ( u_A(4) = \sqrt{4} = 2 )。如果 ( x = 9 ),那么 ( u_A(9) = \sqrt{9} = 3 )。显然,( u_A(4) < u_A(9) ),符合效用函数的单调性。
- 对于投资者B,如果 ( x = 2 ),那么 ( u_B(2) = 22 = 4 )。如果 ( x = 3 ),那么 ( u_B(3) = 32 = 9 )。显然,( u_B(2) < u_B(3) ),也符合效用函数的单调性。
(2)期望效用假说
期望效用假说(expected utility hypothesis):如果一个投资者的效用函数是 ( u ),面对 ( n ) 种选项,并且这些选项的财富值结果可以用随机变量 ( X_1, X_2, …, X_n ) 表示,那么该投资者会选择 ( E[u(X)] ) 最大的那个选项。
期望效用假说是决策理论中的一个重要概念,它假设投资者在面对不确定性时,会选择期望效用最大的选项。具体来说,如果一个投资者的效用函数是 ( u ),面对 ( n ) 种选项,并且这些选项的财富值结果可以用随机变量 ( X_1, X_2, …, X_n ) 表示,那么该投资者会选择 ( E[u(X)] ) 最大的那个选项。
举例:
假设投资者A面对两个选项:
- 选项1:有50%的概率获得100元,50%的概率获得0元。
- 选项2:有100%的概率获得40元。
投资者A的效用函数是 ( u_A(x) = \sqrt{x} )。
- 选项1的期望效用:( E[u_A(X_1)] = 0.5 \times \sqrt{100} + 0.5 \times \sqrt{0} = 0.5 \times 10 + 0.5 \times 0 = 5 )。
- 选项2的期望效用:( E[u_A(X_2)] = \sqrt{40} \approx 6.32 )。
根据期望效用假说,投资者A会选择选项2,因为 ( E[u_A(X_2)] > E[u_A(X_1)] )。
(3)损失厌恶
假设有个项目,一半的概率失败,一半概率成功。如果失败的话,投资者损失十万元,成功的话投资者获利十万元。根据效用函数的第二个性质,对于大部分人来说,效用是亏损的。在行为经济学中,这个现象叫做损失厌恶。
转换为数学语言,假设一项投资 ( A ) 的回报可以用随机变量 ( X ) 表示,这项投资的回报预期是 ( E[X] )。再假设一个投资者具备效用函数 ( u ),并且现有财富是 ( x_0 )。那么,该投资者投资于 ( A ) 后的财富值可以用随机变量 ( x_0 + X ) 表示,并且他进行该投资的效用是 ( u(x_0 + X) ),这项投资带给他的额外效用是 ( u(x_0 + X) - u(x_0) )。因此,投资于 ( A ) 带给投资者的预期效用收益是 ( E[u(x_0 + X) - u(x_0)] )。若 ( E[X] = 0 ),则该投资为零收益投资,那么 ( E[u(x_0 + X)] \leq u(x_0) )。
进一步来说,投资的风险就是它的收益的不确定性。任何投资都可以被写为预期收益 ( E[X] ) 和零收益投资 ( X - E[X] ) 两部分的加和。其中零收益部分带来预期效用下降,所以需要足够大的 ( E[X] ) 来弥补;这里,( E[X] ) 被定义为这项投资的风险溢价(risk premium),只有当风险溢价高于风险所带来的效用折损时,投资者才愿意进行投资。
- 损失厌恶是指人们在面对损失时的痛苦感大于面对同等金额收益时的快乐感。这种现象可以用效用函数来解释。假设一项投资 ( A ) 的回报可以用随机变量 ( X ) 表示,这项投资的回报预期是 ( E[X] )。再假设一个投资者具备效用函数 ( u ),并且现有财富是 ( x_0 )。那么,该投资者投资于 ( A ) 后的财富值可以用随机变量 ( x_0 + X ) 表示,并且他进行该投资的效用是 ( u(x_0 + X) ),这项投资带给他的额外效用是 ( u(x_0 + X) - u(x_0) )。因此,投资于 ( A ) 带给投资者的预期效用收益是 ( E[u(x_0 + X) - u(x_0)] )。若 ( E[X] = 0 ),则该投资为零收益投资,那么 ( E[u(x_0 + X)] \leq u(x_0) )。
- 风险溢价是指投资者为了承担风险而要求的额外收益。任何投资都可以被写为预期收益 ( E[X] ) 和零收益投资 ( X - E[X] ) 两部分的加和。其中零收益部分带来预期效用下降,所以需要足够大的 ( E[X] ) 来弥补;这里,( E[X] ) 被定义为这项投资的风险溢价(risk premium),只有当风险溢价高于风险所带来的效用折损时,投资者才愿意进行投资。
举例:
损失厌恶
假设投资者B面对一个项目,一半的概率失败,一半概率成功。如果失败的话,投资者损失十万元,成功的话投资者获利十万元。
- 失败的概率:50%
- 成功的概率:50%
- 损失:-10万元
- 收益:10万元
投资者B的效用函数是 ( u_B(x) = x^2 )。
- 预期效用:( E[u_B(X)] = 0.5 \times (-10)2 + 0.5 \times 102 = 0.5 \times 100 + 0.5 \times 100 = 50 + 50 = 100 )。
虽然预期效用是正的,但投资者B可能会因为损失厌恶而拒绝这个项目,因为损失带来的痛苦感大于收益带来的快乐感。
风险溢价
假设投资者C面对两个投资选项:
- 选项1:预期收益 ( E[X_1] = 5 ),标准差 ( \sigma_1 = 2 )。
- 选项2:预期收益 ( E[X_2] = 10 ),标准差 ( \sigma_2 = 5 )。
投资者C的效用函数是 ( u_C(x) = x - 0.1 \times x^2 )。
- 选项1的预期效用:( E[u_C(X_1)] = 5 - 0.1 \times 5^2 = 5 - 2.5 = 2.5 )。
- 选项2的预期效用:( E[u_C(X_2)] = 10 - 0.1 \times 10^2 = 10 - 10 = 0 )。
根据风险溢价的概念,投资者C会选择选项1,因为虽然选项2的预期收益更高,但其风险也更大,导致预期效用反而更低。
(4)分散风险
经济学中的风险指的是未来的不确定性;而从概率学的角度来说,一个随机变量的分布越散开,它的确定性就越低。因此,有一个简易的衡量风险的标准,就是收益变量的标准差 ( \sigma_X )。一般来讲,在保持 ( E[X] ) 不变的情况下,我们希望 ( \sigma_X ) 越低越好。
假设投资者D面对两个投资组合:
- 组合1:包含两只股票,每只股票的预期收益 ( E[X_1] = 5 ),标准差 ( \sigma_1 = 2 )。
- 组合2:包含五只股票,每只股票的预期收益 ( E[X_2] = 5 ),标准差 ( \sigma_2 = 1 )。
投资者D的效用函数是 ( u_D(x) = x - 0.1 \times x^2 )。
- 组合1的预期效用:( E[u_D(X_1)] = 5 - 0.1 \times 5^2 = 5 - 2.5 = 2.5 )。
- 组合2的预期效用:( E[u_D(X_2)] = 5 - 0.1 \times 5^2 = 5 - 2.5 = 2.5 )。
虽然两个组合的预期效用相同,但组合2的标准差更低,风险更小,因此投资者D会更倾向于选择组合2。
(5)对投资者的假设
对于一个投资者,如果任意两个投资回报率的随机变量 ( X ) 和 ( Y ) 满足 ( E[X] \geq E[Y] ) 并且 ( \sigma_X < \sigma_Y )(也就是说预期收益更大但是风险更小),该投资者会选择 ( X ),那么我们说这个投资者是理智的。
② MPT 模型
现代资产配置理论(Modern Portfolio Theory, MPT)由 Markowitz 在1952年提出,核心思想是以最小化标准差并最大化预期收益为目标来进行资产配置。
有效前沿:在固定预期收益的情况下,找到标准差最小的资产组合。有效前沿的形状像一枚子弹尖,因此也称为马科维兹子弹。
③ CAPM 模型
资本资产定价模型(Capital Asset Pricing Model, CAPM)建立在MPT之上,用简单的数学公式表述了资产的收益率与风险系数 ( \beta ) 以及系统性风险之间的关系。
CAPM 公式:对于某一风险资产 ( S ),有 ( E[r_S] = r_f + \beta_S (E[r_M] - r_f) ),其中 ( r_S ) 是 ( S ) 的收益变量,( r_M ) 是市场组合的收益变量,( r_f ) 是市场的无风险利率,( \beta_S = \frac{Cov(r_S, r_M)}{Var(r_M)} ) 是组合 ( S ) 对于市场风险的敏感度。
3. 常见的因子分类
① 基于日频数据的量化因子构建
日频数据是构建量化因子最常用的数据类型。常用的日频基础数据包括:
- 价量数据
- 价格衍生数据
- 基本面数据(如财报数据)
量化因子计算的常见操作过程:处理以交易日为时间序列、不同标的为截面维度的数据类型。
② 基于高频数据的量化因子构建
高频数据虽然拥有更高的数据密度与不同的数据结构,但就单个标的来看,依然可以将其定义为一种时间序列数据进行处理。
高频初始量化指标计算过程:利用交易所的 LEVEL2 行情产品,构建不同种类的高频初始量化指标计算过程。
4. 常见的因子有效性检验方法
因子在量化投资中扮演着非常重要的角色。常见的因子有效性检验方法包括:
- 学术角度:使用 P 值确定统计显著性。
- 投资实践角度:关注因子预测股票收益的能力及稳定性。
5. 行业与市值中性化
因子中性化,也被称为正交化,是一种剔除已有常见因子影响的方法。常用的方法包括:
- 市值中性化:剔除股票市值对因子的影响。
- 行业中性化:剔除因子在不同行业间的差异。
6. Python多因子选股策略实践
多因子选股模型是一个用来选择股票投资组合的策略,它考虑了多个与预期收益相关的因子。以下是一个使用Python实现一个简单的多因子选股模型的基本示例:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 读取和准备数据
df = pd.read_csv('stock_data.csv')
X = df[['PE', 'PB', 'ROE']] # 特征因子
y = df['Returns'] # 目标变量
# 拆分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 构建线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 查看模型系数,确定因子权重
print('Factor weights:', model.coef_)
# 使用模型预测测试数据的收益
y_pred = model.predict(X_test)
# 创建一个DataFrame来存储股票的预测收益
predicted_returns = pd.DataFrame({
'Stock': X_test.index,
'Predicted return': y_pred
})
# 根据预测的收益选择股票
selected_stocks = predicted_returns[predicted_returns['Predicted return'] > 0.1]
print('Selected stocks:', selected_stocks)
代码注释:
- 以上代码中,作者展示了一个线性回归的多因子模型,通过PE、PB、ROE三个因子来预测股票收益,并利用模型系数作为因子权重。
- 这个模型仅仅是一个基本的多因子模型,并且采用了线性回归作为预测模型,在实际情况下,可以根据需求调整和改进,增加更多因子,使用更复杂的模型,例如神经网络、随机森林等,或者使用更复杂的特征工程技术,例如PCA、特征选择等。
- 此外,这个模型没有进行任何形式的模型验证,例如交叉验证、超参数调优等,可进一步针对性优化。
最后,投资需谨慎,本文仅供作者学习使用,切勿作为实践案例进行使用;若造成损失,作者可不负责哦!🙂
相关链接
- 项目地址:AlgoQuant-CookBook
- 相关文档:专栏地址
- 作者主页:GISer Liu-CSDN博客
如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.