WhaleQuant第四章——量化选股策略

2024-01-28 04:28

本文主要是介绍WhaleQuant第四章——量化选股策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 第四章
    • 4.0 学习资源
    • 4.1 行业与市值中性化——程序1
    • 4.2 Python多因子选股策略实践

第四章

4.0 学习资源

学习链接

1. 市场有效性理论:

  • 描述了证券市场的四种有效性类型:无效市场、弱式有效市场、半强式有效市场和强式有效市场。
  • 讨论了有效市场理论对投资者选股策略的影响,特别是在短期和长期市场中,市场无效性可能为投资者提供超额收益的机会。

2. 效用模型与风险模型:

  • 介绍了效用函数(Utility Function)和期望效用假说(Expected Utility Hypothesis),以及它们在投资者决策中的应用。
  • 讨论了损失厌恶(Loss Aversion)现象,即投资者对损失的厌恶程度大于对同等金额收益的喜好。

3. 现代资产配置理论(MPT):

  • 描述了MPT的核心思想,即通过最小化标准差并最大化预期收益来进行资产配置。
  • 解释了有效前沿(Efficient Frontier)、夏普比率(Sharpe Ratio)和资本市场线(Capital Allocation Line)的概念。

4. 资本资产定价模型(CAPM):

  • 介绍了CAPM模型,它基于MPT,描述了资产收益率与市场风险之间的关系。
  • 讨论了系统性风险(Systematic Risk)和非系统性风险(Unsystematic Risk)的区别。

5. 套利定价理论(APT)与多因子模型:

  • APT模型将资产收益归因于多个因子,而不仅仅是市场风险。
  • 多因子模型(MFM)是APT模型的扩展,它通过多个因子来解释股票的预期收益。

6. 量化因子构建:

  • 介绍了基于日频数据和高频数据的量化因子构建方法。
  • 讨论了如何通过计算机语言来描述和实现量化计算过程。

7. 因子有效性检验:

  • 介绍了如何通过统计方法(如p值)来检验因子的有效性。
  • 讨论了市值中性化和行业中性化的概念,以及它们在因子分析中的应用。

8. 多因子选股模型实践:

  • 提供了一个使用Python实现的简单多因子选股模型示例,该模型通过线性回归来预测股票收益,并根据预测结果选择股票。
  • 这一章节为投资者提供了一套系统的方法论,用于在量化投资中构建和评估选股策略。通过理解和应用这些理论,投资者可以更科学地进行资产配置,提高投资决策的效率和效果。

4.1 行业与市值中性化——程序1

import numpy as np
import pandas as pd
import statsmodels.api as sm# 假设我们有一个包含市值因子和收益的数据框 DataFrame
# 数据框的列包括:'日期'、'股票代码'、'市值'、'收益'等# 假设我们已经从数据源加载了数据,存储在变量 data 中# 选择所需的列
data = data[['日期', '股票代码', '市值', '收益']]# 根据日期进行分组
groups = data.groupby('日期')# 定义一个函数来执行市值中性化
def market_neutralize(group):# 提取市值和收益的数据列market_cap = group['市值']returns = group['收益']# 添加截距项X = sm.add_constant(market_cap)# 执行线性回归,拟合收益率与市值的关系model = sm.OLS(returns, X)results = model.fit()# 提取回归系数beta = results.params['市值']# 计算市值中性化后的收益neutralized_returns = returns - beta * market_cap# 将市值中性化后的收益添加到数据框中group['市值中性化收益'] = neutralized_returnsreturn group# 对每个日期的数据进行市值中性化
neutralized_data = groups.apply(market_neutralize)

但这段代码缺少data数据。下面重新写一个获取数据的版本,并且字段为英文:

import baostock as bs
import pandas as pd
import statsmodels.api as sm
from IPython.display import display# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)# 获取股票数据
rs = bs.query_history_k_data_plus("sh.600000","date,code,close,volume",start_date='2022-07-01', end_date='2022-12-31',frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)# 将获取的数据转为DataFrame
data_list = []
while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())
data = pd.DataFrame(data_list, columns=rs.fields)# 选择所需的列
data = data[['date', 'code', 'close', 'volume']]# 根据日期进行分组
groups = data.groupby('date')# 定义一个函数来执行市值中性化
def market_neutralize(group):# 提取市值和收益的数据列market_cap = group['close'].astype(float)returns = group['volume'].astype(float)# 添加截距项X = sm.add_constant(market_cap)# 执行线性回归,拟合收益率与市值的关系model = sm.OLS(returns, X)results = model.fit()# 提取回归系数beta = results.params['close']# 计算市值中性化后的收益neutralized_returns = returns - beta * market_cap# 将市值中性化后的收益添加到数据框中group['market_neutralized_volume'] = neutralized_returnsreturn group# 对每个日期的数据进行市值中性化
neutralized_data = groups.apply(market_neutralize)# 打印市值中性化后的数据
display(neutralized_data)# 登出系统
bs.logout()

在这里插入图片描述

将结果绘制出来(将因子放大1e9倍显示):

import seaborn as sns
import matplotlib.pyplot as plt# 使用 pivot 方法来重塑数据
transposed_data = neutralized_data.pivot(columns='code', values='market_neutralized_volume')
# 将数据放大1e9倍
transposed_data *= 1e9
# 使用 seaborn 绘制热图
plt.figure(figsize=(12, 20))
sns.heatmap(transposed_data, cmap='coolwarm', linewidths=0.5, annot=True, fmt=".2f")
plt.title('Market Neutralized Volume')
plt.xlabel('Stock Code')
plt.ylabel('Date')
plt.show()

在这里插入图片描述

4.2 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# 生成随机数据
np.random.seed(42)
n_samples = 1000data = {'PE': np.random.uniform(5, 20, n_samples),'PB': np.random.uniform(0.5, 3, n_samples),'ROE': np.random.uniform(0.05, 0.25, n_samples),'Returns': np.random.normal(0.1, 0.5, n_samples)
}df = pd.DataFrame(data)# 保存生成的数据到 CSV 文件
df.to_csv('stock_data.csv', index=False)# 读取和准备数据
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': pd.RangeIndex(start=0, stop=len(X_test)),'Predicted return': y_pred
})# 根据预测的收益选择股票
selected_stocks = predicted_returns[predicted_returns['Predicted return'] > 0.1]print('Selected stocks:', selected_stocks)

在这里插入图片描述

这篇关于WhaleQuant第四章——量化选股策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652469

相关文章

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M