当前位置: 首页 > article >正文

保姆级教程:用Python和baostock复现Fama-French三因子模型,手把手教你分析A股

用Python实战Fama-French三因子模型从理论到A股分析全流程解析在量化投资领域Fama-French三因子模型犹如一盏明灯为理解股票收益提供了清晰的框架。不同于传统CAPM模型的单一市场视角这一诺奖级理论通过引入市值和账面市值比因子显著提升了解释力。本文将带您用Python和baostock数据完整走通从数据获取到模型应用的闭环特别针对A股市场特性进行适配优化。1. 环境准备与数据源配置工欲善其事必先利其器。复现经典模型首先需要搭建稳定的工具链# 核心工具栈安装 !pip install baostock statsmodels pandas numpy matplotlib seaborn --upgrade关键数据源选择依据baostock提供稳定免费的A股历史行情相比其他接口更适配本土市场央财因子数据国内权威计算的因子数据避免自行构建的计算偏差数据周期建议选择3-5年窗口期既能捕捉市场特征又避免过度拟合注意baostock需注册获取token每日调用限额5000次批量处理时建议添加延时2. 因子数据深度处理原始数据往往需要清洗才能用于建模。央财提供的五因子数据包含我们需要的三大核心因子字段名含义计算方式单位mkt_rf市场风险溢价市场组合收益 - 无风险利率%smb市值因子小市值组合 - 大市值组合收益%hml账面市值比因子高BM组合 - 低BM组合收益%# 数据加载与预处理示例 factors pd.read_csv(fivefactor_daily.csv, index_coltrddy, parse_dates[trddy], usecols[trddy,mkt_rf,smb,hml,rf]) # 处理异常值 factors factors[(factors.abs() 3).all(axis1)] # 剔除3σ以外的极端值 factors factors.asfreq(D).fillna(methodffill) # 交易日对齐3. 个股数据处理技巧以中国平安(601318.SH)为例需特别注意A股特有的数据处理要点复权处理关键参数adjustflag1前复权adjustflag2后复权adjustflag3不复权推荐用于学术研究# baostock数据获取最佳实践 def get_stock_data(code, start, end): bs.login() rs bs.query_history_k_data_plus( code, fieldsdate,close,volume, start_datestart, end_dateend, frequencyd, adjustflag3 # 保持原始价格 ) df rs.get_data().set_index(date) df.index pd.to_datetime(df.index) bs.logout() return df.astype(float) zgpa get_stock_data(sh.601318, 2020-01-01, 2023-06-30)4. 收益率计算与特征工程对数收益率在金融建模中具有数学优势# 收益率计算对比 price zgpa[close] simple_ret price.pct_change() # 简单收益率 log_ret np.log(price/price.shift(1)) # 对数收益率 # 可视化对比 plt.figure(figsize(10,4)) plt.plot(simple_ret.cumsum(), label简单收益率) plt.plot(log_ret.cumsum(), label对数收益率) plt.legend(); plt.title(收益率计算方式对比)关键发现短期来看两种计算方法差异不大长期累计时对数收益率更稳定多因子模型通常采用对数收益率5. 模型构建与结果解读使用statsmodels进行回归分析时需要特别关注金融数据的特性# 合并数据集 data pd.merge(factors, log_ret.to_frame(return), left_indexTrue, right_indexTrue) data[excess_return] data[return] - data[rf] # 计算超额收益 # 三因子模型回归 model sm.OLS( data[excess_return], sm.add_constant(data[[mkt_rf, smb, hml]]) ) results model.fit(cov_typeHAC, cov_kwds{maxlags: 5}) # 考虑自相关回归结果关键指标解读系数经济含义中国平安(2020-2023)统计显著性constα超额收益-0.0002p0.12mkt_rf市场风险暴露0.92***p0.001smb小市值风险暴露-0.31**p0.03hml价值股风险暴露0.45***p0.001*** p0.01, ** p0.05中国平安呈现显著的价值股特征对市值因子呈负暴露6. 多股票对比分析建立自动化分析流程可提升研究效率def analyze_stock(code, start, end): # 获取数据 stock_data get_stock_data(code, start, end) log_ret np.log(stock_data[close]/stock_data[close].shift(1)) # 合并因子 merged pd.merge(factors, log_ret.to_frame(return), left_indexTrue, right_indexTrue) merged merged.dropna() # 模型回归 model sm.OLS( merged[return] - merged[rf], sm.add_constant(merged[[mkt_rf,smb,hml]]) ) results model.fit() return pd.Series({ alpha: results.params[const], beta: results.params[mkt_rf], smb_beta: results.params[smb], hml_beta: results.params[hml], rsquared: results.rsquared }) # 示例对比不同行业股票 stocks { 消费:sh.600519, # 茅台 金融:sh.601318, # 平安 科技:sh.600588, # 用友 医药:sh.600276, # 恒瑞 } results pd.DataFrame({name: analyze_stock(code, 2020-01-01,2023-06-30) for name, code in stocks.items()})行业对比发现消费股呈现低市场风险暴露(β≈0.8)科技股具有显著的小市值特征(SMBβ0)金融股普遍呈现价值股特性(HMLβ0.4)7. 策略回测与绩效评估完整的量化研究需要验证模型的实际效果# 回测框架关键指标计算 def backtest(returns, factors, window252): params: returns: 个股收益率序列 factors: 因子数据 window: 滚动窗口长度 results [] for i in range(window, len(returns)): # 滚动回归 train_data pd.merge( returns.iloc[i-window:i], factors.iloc[i-window:i], left_indexTrue, right_indexTrue ) model sm.OLS( train_data.iloc[:,0] - train_data[rf], sm.add_constant(train_data[[mkt_rf,smb,hml]]) ) res model.fit() # 预测下一期 current_factors factors.iloc[i] pred res.predict([1, current_factors[mkt_rf], current_factors[smb], current_factors[hml]]) results.append(pred[0] current_factors[rf]) # 转回总收益 return pd.Series(results, indexreturns.index[window:]) # 执行回测 pred_ret backtest(log_ret, factors) actual_ret log_ret[pred_ret.index] # 计算IC信息系数 ic pred_ret.corr(actual_ret) print(f信息系数(IC): {ic:.2%})绩效评估矩阵指标计算公式中国平安行业平均年化收益率(1总收益)^(252/天数)-18.2%6.5%最大回撤最大峰值到谷值跌幅-23.4%-28.1%夏普比率年化收益/年化波动0.820.65预测IC预测与实际收益相关系数0.150.088. 常见问题与解决方案Q1因子数据频率如何选择日频数据噪声较大但样本充足月频数据更稳定但可能丢失短期特征推荐做法先用月频验证理论再用日频优化Q2如何处理缺失数据# 缺失数据处理方案 factors factors.fillna(methodffill) # 前向填充 factors factors.dropna() # 或直接删除 # 交易日对齐技巧 factors factors.reindex(pd.date_range(start, end, freqD))Q3回归结果不显著怎么办检查因子共线性factors[[mkt_rf,smb,hml]].corr()尝试扩展时间窗口考虑加入行业虚拟变量在实战中我发现A股市场的市值效应呈现明显的阶段性特征。2015年前小盘股超额收益显著但近年来随着注册制改革这种效应正在减弱。建议每半年重新检验一次因子有效性动态调整模型参数。

相关文章:

保姆级教程:用Python和baostock复现Fama-French三因子模型,手把手教你分析A股

用Python实战Fama-French三因子模型:从理论到A股分析全流程解析 在量化投资领域,Fama-French三因子模型犹如一盏明灯,为理解股票收益提供了清晰的框架。不同于传统CAPM模型的单一市场视角,这一诺奖级理论通过引入市值和账面市值比…...

基于MCP协议与Substack官方API构建AI数据助手

1. 项目概述:用AI助手深度管理你的Substack内容生态 如果你和我一样,同时运营着几个Substack新闻通讯,那你肯定对那种在多个后台、数据仪表盘之间来回切换的繁琐感深有体会。查看最新的文章阅读量、追踪付费订阅者的增长趋势、对比不同栏目的…...

FPGA实战:手把手教你用OV7725摄像头采集RGB565图像(附Verilog代码)

FPGA实战:从零构建OV7725摄像头RGB565采集系统 引言 在嵌入式视觉系统中,OV7725 CMOS摄像头因其高性价比和丰富的功能接口,成为FPGA图像处理入门的首选传感器。但实际开发中,工程师常面临三大痛点:SCCB配置不稳定、时序…...

AI Agent CLI工具生态:从结构化数据到自动化工作流的设计与实践

1. 项目概述:AI Agent的“瑞士军刀”清单如果你正在使用Claude Code、Cursor或者OpenClaw这类AI编程助手,并且已经厌倦了在它们和外部服务(比如Notion、飞书、Linear)之间来回切换、复制粘贴的繁琐操作,那么你很可能已…...

别再死记硬背PBR公式了!从光到颜色的物理基础,彻底搞懂渲染为啥要这么算

从光到像素:PBR渲染背后的物理直觉与视觉科学 站在夜晚的街道上,远处的路灯为什么看起来和近处一样亮?为什么显示器能用三种光混合出千万种颜色?这些日常现象背后,隐藏着PBR渲染最核心的物理原理。当我们摆脱公式记忆&…...

GenAI与LLM发展时间线:从业者的知识图谱与趋势洞察工具

1. 项目概述:一个AI从业者的“编年史”工具箱如果你和我一样,在过去几年里深度卷入了生成式AI和大型语言模型的浪潮,那你一定有过这样的时刻:刚读完一篇关于GPT-4架构分析的论文,转头就看到新闻说某个团队又发布了新的…...

开发者如何构建个人编码计划管理工具:从设计到部署全栈实践

1. 项目概述:一个为开发者量身定制的编码计划管理工具最近在GitHub上看到一个挺有意思的项目,叫“echome123/coding-plan”。光看这个名字,你可能会觉得它又是一个普通的待办事项应用,但如果你点进去,会发现它其实是一…...

解决无限递归文件夹删除难题:架构师的深度剖析与实战指南

在日常开发和运维工作中,我们经常会遇到需要删除文件夹的情况。但是,当遇到无限递归文件夹(即文件夹内包含循环指向自身的子文件夹)时,传统的删除方法往往会失效,甚至导致系统资源耗尽。这种问题在文件同步…...

六自由度灵巧手机械特性与混合力控策略解析

1. Inspire RH56DFX灵巧手机械特性解析Inspire RH56DFX作为一款商业化六自由度灵巧手,其机械结构设计具有典型的耦合连杆特征。这种设计在提供较高负载能力(单指最大输出力10N)的同时,也带来了独特的运动学特性。通过实验测量&…...

【黑马点评日记】:用户签到功能详解——从Bitmap入门到避坑指南

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

gpt-image-2怎么用?一篇讲清楚最实用的使用方法

最近在(c.877ai.cn)库拉这类AI模型聚合平台上第一时间把GPT-Image-2的API接入跑通了,发布两周踩了不少坑。今天从架构原理、核心功能、API接入、实战技巧四个维度,全方位拆解GPT-Image-2的使用方法。无论你是前端开发者、设计师还…...

【LeetCode刷题日记】一口气搞定三道层序遍历!从N叉树到二叉树,BFS核心思想一网打尽

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

Lazytainer:基于模糊匹配的Docker容器智能管理工具实战

1. 项目概述:一个为容器化工作流“减负”的智能工具如果你和我一样,日常工作中需要频繁地与Docker容器打交道,那么你一定对下面这些场景深有感触:为了调试一个服务,你得先docker ps找到容器ID,再docker exe…...

视觉触觉融合的机器人可变形物体追踪技术

1. 视觉触觉模仿学习在可变形物体追踪中的技术解析在机器人操作领域,可变形物体(如电缆、布料等)的追踪一直是个棘手问题。这类物体具有近乎无限的自由度,传统方法往往需要精确建模物体动力学特性,难以适应不同几何形状…...

从Airflow到Flyte:新一代云原生MLOps编排平台的核心优势与实践

1. 从Airflow到Flyte:为什么我们需要新一代的MLOps编排器?如果你在数据科学或机器学习工程领域摸爬滚打超过三年,大概率用过或者至少听说过Airflow。它几乎是过去十年里任务编排领域的代名词,用Python写DAG,用Celery做…...

GPIO端口扩展器在翻盖手机中的设计与应用

1. GPIO端口扩展器在翻盖手机中的核心价值翻盖手机的设计一直面临着空间和成本的严格限制。作为硬件工程师,我们经常需要在有限的主板面积上实现尽可能多的功能。GPIO端口扩展器正是解决这一矛盾的利器。通过IC或SPI接口,单个GPIO扩展器可以提供8-16个额…...

HTML函数工具是否支持雷蛇等游戏外设_RGB同步汇总【汇总】

HTML无法直接控制雷蛇等外设RGB灯光,需通过Razer Chroma SDK Web API、WebSocket本地代理或Electron封装调用原生模块实现;其他品牌如罗技、海盗船、华硕亦需各自SDK与手动启用API权限。如果您希望在网页开发中通过HTML函数工具实现雷蛇等游戏外设的RGB灯…...

AdamW与Muon优化器在FFN中的谱崩溃对比研究

1. 项目背景与问题定义在深度神经网络训练过程中,优化器的选择直接影响模型收敛速度和最终性能。AdamW和Muon作为两种主流的自适应优化算法,在各类神经网络结构中表现出不同的特性。本项目聚焦于它们在Feed-Forward Network(FFN)层…...

SenCache:扩散模型推理加速技术解析

1. 项目概述SenCache是一种针对扩散模型(Diffusion Models)的推理加速技术,其核心思想是通过分析模型对不同输入区域的敏感性差异,实现计算资源的动态分配。这项技术特别适合需要实时生成高质量图像的场景,比如游戏内容…...

Gemini CLI扩展开发:构建标准化AI工作流提升开发效率

1. 项目概述:一个为Gemini CLI深度定制的命令集 如果你和我一样,日常开发工作重度依赖命令行,并且最近开始尝试用Gemini CLI来提升效率,那你可能已经发现了一个痛点:原生的 gemini 命令虽然强大,但面对一…...

OpenClaw VS Code扩展:AI辅助编码与安全审计的深度集成实践

1. 项目概述:OpenClaw VS Code 扩展如果你和我一样,每天大部分时间都泡在 VS Code 里,同时又在探索如何让 AI 更深度地融入开发工作流,那么 OpenClaw 这个 VS Code 扩展绝对值得你花时间研究。它不是一个简单的聊天机器人插件&…...

ClawSwap SDK:一站式DEX聚合器集成方案与实战指南

1. 项目概述:一个为去中心化交易聚合而生的SDK最近在开发一个需要深度集成去中心化交易(DEX)功能的项目,我花了不少时间研究市面上的各种工具。在这个过程中,我发现了WarTech9/clawswap-sdk这个仓库。简单来说&#xf…...

Python 正则表达式实战:从入门到精通

Python 正则表达式实战:从入门到精通 引言 大家好,我是一名正在从Rust转向Python的后端开发者。在日常开发中,字符串处理是必不可少的环节,而正则表达式就是处理字符串的一把利器。作为从Rust过来的开发者,我发现Pyt…...

GameVault Inspector:开源游戏库元数据自动化同步工具实战指南

1. 项目概述与核心价值最近在折腾游戏库管理的时候,发现了一个挺有意思的开源项目,叫game-vault-inspector。乍一看名字,你可能会觉得它是个游戏“金库”的检查工具,实际上,它瞄准的是一个更具体、更“硬核”的痛点&am…...

基于模块化设计的AI聊天机器人框架:从核心原理到生产部署

1. 项目概述:一个开箱即用的AI聊天机器人框架最近在GitHub上闲逛,发现了一个叫marcusschiesser/ai-chatbot的项目,点进去一看,好家伙,又是一个AI聊天机器人。这年头,基于大语言模型(LLM&#xf…...

Rust FFI与C交互:跨语言编程实践

Rust FFI与C交互:跨语言编程实践 引言 大家好,我是一名正在从Rust转向Python的后端开发者。在实际项目中,我们经常需要与其他语言进行交互,特别是C语言。Rust提供了强大的FFI(Foreign Function Interface&#xff09…...

轻量级SFT框架SWE-Lego:高效解决软件工程任务

1. 项目背景与核心价值去年在参与一个大型企业级代码审查系统开发时,我们团队遇到了一个典型困境:传统的监督微调(SFT)方法在解决复杂软件工程问题时,要么需要庞大的计算资源,要么难以保持专业领域的准确性。正是这次经历让我开始…...

LLSA:高效稀疏注意力机制在长序列处理中的应用

1. 从密集到稀疏:注意力机制的计算效率革命在自然语言处理和计算机视觉领域,注意力机制已经成为现代深度学习架构的核心组件。传统注意力机制(如Transformer中的自注意力)虽然功能强大,但其计算复杂度随着序列长度呈二…...

QClaw自动化脚本:一键集成Crazyrouter路由与GPT-5.4模型

1. 项目概述:一键切换QClaw路由的自动化脚本如果你正在使用QClaw,并且对内置的qclaw/modelroute路由方案感到性能或稳定性上有所不足,想要尝试更灵活、功能更强大的第三方路由服务,那么你很可能已经听说过crazyrouter.com。这是一…...

LLSA稀疏注意力机制:从原理到工程实践

1. 从密集到稀疏:注意力机制的效率革命在自然语言处理领域,注意力机制早已成为Transformer架构的核心组件。但传统自注意力机制那O(n)的复杂度,就像一场永远无法避免的交通拥堵——随着序列长度增加,计算资源消耗呈平方级增长。三…...