Matlab实现CAPM估计:从数据清洗到Newey-West标准误

发布时间:2026/9/14 5:28:39

Matlab实现CAPM估计:从数据清洗到Newey-West标准误 简介这套基于Matlab的资本资产定价模型CAPM估计程序面向金融计量与投资学方向的研究者、学生及量化分析入门者可直接用于估计贝塔系数、检验资产收益与市场组合的关系完成经典定价模型的实证分析。压缩包内仅包含1个m文件文件体积仅1KB属于轻量级源码适合快速调用或嵌入自定义框架学习。目前已有35人学习/下载。通过该源码读者可看到利用Matlab实现CAPM估计的核心计算流程包括数据读取、回归估计与结果输出等关键步骤适合作为课程作业、论文复现或自学金融编程的参考模板。代码结构简洁便于逐行理解资本资产定价的实证逻辑稍加修改即可适配不同市场数据。1. 为什么用Matlab估计资本资产定价模型值得把程序写全金融学教科书里资本资产定价模型CAPM被压缩成一个公式和一个beta。真到自己拿数据跑的时候Excel得到的斜率和论文里带标准误的估计结果之间隔着数据处理、频率选择、无风险利率口径和残差异方差四道坎。用Matlab估计CAPM表面上是写一段回归源码实际上是把这些坎挨个拆开。下面这份程序骨架能直接落到你的“基于Matlab实现估计资本资产定价程序”项目里读取Excel、计算超额收益、回归、Newey-West标准误再到滚动beta。适合金融工程学生、量化研究实习以及想搞清楚“为什么同样数据beta不一样”的从业者。2. 资本资产定价模型里beta的统计含义与估计前提2.1 从CAPM等式到样本回归alpha为什么不能丢CAPM说的是期望收益与市场风险溢价的关系E(R_i) - R_f beta * ( E(R_m) - R_f )这里的beta是资产对市场组合敏感性的度量。实证中拿不到期望值通常把等式转成时间序列回归R_i,t - R_f,t alpha beta * (R_m,t - R_f,t) epsilon_t多出来的alpha是样本期内的定价偏差也叫Jensen’s alpha。如果CAPM成立alpha在统计上应接近0。代码里不能为了省事把截距项去掉否则当资产实际有稳定超额收益时这部分会被强行塞进beta里估计值发生偏移。2.2 OLS估计beta与协方差法等价但前提条件更看得见回归斜率beta的最小二乘解是beta Cov(R_i - R_f, R_m - R_f) / Var(R_m - R_f)所以直接用cov函数算也行。但回归程序的价值在读完整的结果alpha、beta的t统计量、R方、残差。这些可以用于检验定价偏差、识别异常波动。OLS有三条基本前提误差期望为0、同方差、无自相关。金融日收益率的残差往往在牛市和熊市波动大小不同冲击也会连续几天出现所以只靠普通标准误容易把beta的统计量看高。2.3 频率选择影响标准误日频、周频、月频对照表数据频率影响的不只是样本量还影响残差性质。常用的对照口径如下频率三年样本量用途主要问题日频约750快速估计、风控自相关、非同步交易周频约156学术论文常用舍弃日内信息月频约36长期CAPM检验样本少置信区间宽我一般在项目里先用日频做初版写报告时改成周频或月频复核。日频样本多标准误修正能处理部分自相关和异方差月频样本太少时就算修正标准误置信区间依然很宽beta差异可能不显著。理解了这一点再去改程序参数就不会盲目追求多数据。3. 用Matlab准备数据Excel表格到可回归的超额收益序列3.1 数据表结构和日期处理估计CAPM的输入不复杂但字段放的位置有讲究。我常用的Excel表格是四列第一列Date格式是Excel序列日期第二列是股票收盘价第三列是市场指数收盘价比如沪深300或标普500第四列是无风险利率RF单位是年化百分数比如2.5表示2.5%。用readtable读进来后日期列通常会被读成double需要手工转成datetime% prepare_data.m % Excel表头Date, AssetPrice, MarketIndex, RF data readtable(input_data.xlsx); % 如果日期列是Excel序列号转成真实日期 if isnumeric(data.Date) data.Date datetime(data.Date, ConvertFrom, excel); end data sortrows(data, Date); % 确保日期升序ConvertFrom,excel把Excel从1900年起算的序列号转成真实日期。sortrows很重要因为有些数据源会把日期打乱不排序直接diff就会得到错误的收益率。如果是csv文件readtable可能会自动把字符串日期识别成datetime这时跳过if块里的转换即可但sortrows仍要做。3.2 计算日收益率与无风险利率折算价格序列转日收益率常见两种写法。简单收益率的实现assetRet [nan; diff(data.AssetPrice) ./ data.AssetPrice(1:end-1)]; mktRet [nan; diff(data.MarketIndex) ./ data.MarketIndex(1:end-1)]; % 无风险利率从年化百分数折算到每日 rfDaily data.RF / 100 / 252; % 超额收益资产收益减去当日无风险收益 assetExRet assetRet - rfDaily; mktExRet mktRet - rfDaily;diff是向后差分第一个位置没有前一交易日所以手动补一个NaN。分母用前一日价格得到的是单期简单收益率。252是股票市场常用的年化交易日天数也有用365的但国债逆回购这类按实际天数计息的产品才更适合365股票CAPM估计里252是更稳的选择。如果数据源给的是对数价格的日频率也可以换一行% assetRet [nan; diff(log(data.AssetPrice))];对数收益率的好处是可以直接按时间累加但普通CAPM回归用简单收益率和用对数收益率得到的beta差别通常在0.01以内不必纠结。3.3 清理缺失值并防止日期错位数据里可能有停牌NaN、除权跳空和交易所非共同交易日。先把缺失的行删掉注意不能用按列各自删的写法tmp table(data.Date, assetExRet, mktExRet, ... VariableNames, {Date, AssetEx, MktEx}); tmp rmmissing(tmp);rmmissing会整行删除保证同一日期的资产收益和市场收益对上。真正要避免的是分别对assetExRet和mktExRet各自删除NaN那样会改变序列长度日期就错位了。再往下回归之前我会加一个保护if height(tmp) 30 error(有效数据不足无法估计); end30是经验值日频至少一个季度以上才有意义。到这里数据已经变成两列干净的日频超额收益序列可以直接进入CAPM估计程序。4. 最小二乘与Newey-West标准误一份可直接改写的估计源码4.1 用fitlm快速拿到回归统计量数据准备好后第一版程序可以一口气算完% capm_estimate.m 最小可用版本 y tmp.AssetEx; % 资产超额收益 x tmp.MktEx; % 市场超额收益 mdl fitlm(x, y); % 默认带截距 alpha mdl.Coefficients.Estimate(1); beta mdl.Coefficients.Estimate(2); alpha_t mdl.Coefficients.tStat(1); beta_t mdl.Coefficients.tStat(2); rsq mdl.Rsquared.Ordinary;fitlm的调用形式是fitlm(预测变量, 响应变量)。这里x和y都是列向量alpha对应截距beta对应市场因子斜率。mdl.Rsquared.Ordinary是普通R方记录市场因子能解释资产收益波动的比例。这个版本适合先验证数据有没有问题但标准误默认是普通OLS标准误金融序列里常偏小。4.2 矩阵解法看回归内部beta和残差怎么出来的为了后面能嵌入Newey-West修正把fitlm内部展开n length(y); X [ones(n,1), x]; % 第一列截距第二列市场超额 par X \ y; resid y - X * par; alpha par(1); beta par(2);X反斜杠是Matlab里解最小二乘的标准写法数值上比inv(X*X)*X*y稳定。残差里包含了样本期内的个股异质收益也是后面异方差和自相关检验的对象。这一步得到的结果与fitlm完全一致只是结构更开放方便继续接自定义标准误。4.3 Newey-West标准误手动实现不依赖黑盒日频收益率的残差通常同时存在条件异方差和序列相关。Newey-West用加权重叠的自协方差项来修正标准误。手动实现时把中间量看清楚更重要S (X*X) / n; % 解释变量平均叉积 u X .* resid; % 每个观测对得分矩阵的贡献 Gamma0 (u * u) / n; % 零阶自协方差 lag floor(4 * (n/100)^(2/9)); % Newey-West (1994) 经验滞后 Omega Gamma0; for j 1:lag w 1 - j / (lag 1); % Bartlett权重 Gj (u(1:end-j,:) * u(1j:end,:)) / n; Omega Omega w * (Gj Gj); end VCV inv(S) * Omega * inv(S) / n; se sqrt(diag(VCV)); beta_se se(2); alpha_se se(1);lag是自相关能影响标准误的最大阶数floor(4*(n/100)^(2/9))是Newey和West在1994年给出的经验公式。n250时大约给到4阶n750时给到5到6阶已覆盖常见日频数据。Bartlett权重让离当前观测越远的协方差贡献越小。最终VCV是HAC方差协方差矩阵开方后就是修正标准误。若装了Econometrics Toolbox也可以用hac函数做交叉验证但这段手动代码足够日常使用。需要说明Matlab R2016b及以上支持X .* resid的隐式扩展低版本请改成bsxfun(times, X, resid)。结果表可以按下面格式整理估计值 普通标准误 NW标准误 alpha -0.0002 0.0003 0.0006 beta 1.0520 0.0180 0.0342具体数字以你的样本为准但报告里同时列出普通标准误和NW标准误是稳妥做法。5. 无风险利率口径、月度重采样与alpha怎么读才对5.1 无风险利率选择隔夜、1年期国债还是3个月国库券CAPM里的Rf是“无风险资产收益率”实际操作按研究目的选。做A股日频常用1年期国债到期收益率或银行间质押回购利率做美股常用3个月国库券收益率。程序里别只看数字要确认它到底是年化还是单期。最常见错误是把年化2.5直接当成日收益率减掉那会让超额收益整体偏小一个数量级。我一般会在脚本开头顶部定义参数组% config: 无风险利率口径 rfAnnualPct 2.5; % 年化百分数 rfDaily rfAnnualPct / 100 / 252; rfMonthly rfAnnualPct / 100 / 12;如果数据表里RF本身就是日频小数就不要除252。加一个注释在表头比事后猜更安全。5.2 用timetable把日频数据重采样到月频再估beta改成月频时不能直接对日频超额收益做last那会变成“取最后一天超额收益”完全错误。正确的路径是先把价格重采样到月末再一次差分priceTT timetable(data.Date, data.AssetPrice, data.MarketIndex, data.RF); priceTT sortrows(priceTT); monthlyTT retime(priceTT, monthly, last); % 每月最后一个交易日 monthlyPrices monthlyTT.Variables; assetM diff(monthlyPrices(:,1)) ./ monthlyPrices(1:end-1,1); mktM diff(monthlyPrices(:,2)) ./ monthlyPrices(1:end-1,2); rfM monthlyTT.RF / 100 / 12; % 月末无风险利率做近似删去首行NaN后用assetM - rfM就能得到月频超额收益。retime的monthly边界取自然月的最后日历日如果那天不是交易日Matlab会取该月最后一个可用观测这正好是金融数据的常规处理方式。RF这里用的是月末值近似更严谨的做法是对月内日度RF取平均但多数情况下对beta影响很小。5.3 alpha显著性CAPM有效性的一条检验线回归结果的alpha要看t统计量不是只看正负。判断alpha显著不为0一般用 |t| 2 的粗略标准。比如上节示例中alpha的NW修正t值约-0.36说明该股样本期内的超额收益没有显著偏离0这不等于alpha就是0只是证据不足。beta的t值通常很大但如果用了月频数据、样本量只有36beta置信区间会很宽。真正写报告时建议将普通标准误和NW标准误一起列出让读者清楚是否依赖修正。配合一个参数速查表参数文件内位置建议值无风险利率年化值rfAnnualPct按数据源年度均值交易日天数252股票用252债券回购用实际天数重采样频率retime的monthly论文口径尽量用月频NW滞后阶数lag变量不手工改按公式6. 滚动窗口验证beta稳定性以及四个容易翻车的坑6.1 滚动窗口源码beta的稳定性比单点beta更有价值。用月频数据做36个月窗口步长一个月先构造月频超额收益再做循环% rolling_beta.m assetExM assetM - rfM; mktExM mktM - rfM; assetExM(1) []; mktExM(1) []; window 36; nobs length(assetExM); betaRoll nan(nobs-window1, 1); for t 1:(nobs-window1) segY assetExM(t:twindow-1); segX [ones(window,1), mktExM(t:twindow-1)]; b segX \ segY; betaRoll(t) b(2); end plot(1:length(betaRoll), betaRoll);循环里每次都重新构造设计矩阵窗口移动一个观测。生成的曲线能直接看出beta是稳定在1附近还是跟着市场周期大起大落。如果要画置信带把第4章的NW标准误按同样窗口再算一遍存成上下界即可。6.2 程序能跑之外的四个坑第一日期错位。用Excel合并两个价格序列时如果一个表多了几天直接用矩阵减法会把不同日期的数据相减。解决方法是只保留两个序列共同日期用rmmissing或innerjoin整行去除。第二用价格水平做回归。价格是非平稳序列价格对指数回归经常得到非常高的R方但那是伪回归得到的beta没有经济意义。CAPM回归的响应变量必须是收益率或超额收益率。第三忽略无风险利率的频率。无风险利率按年化给日频要除252月频要除12。利率高企或波动剧烈时错误口径对alpha的影响会被放大对beta的影响相对小但仍会污染标准误。第四把普通标准误当成修正标准误上报。日频数据的残差几乎都有自相关建议在结果表里同时列出两者。如果差异超过30%说明数据里存在明显依赖需要检查重采样或异常值。6.3 兜底的验证技巧我建议每次跑完程序后只做三个检查打印前5行tmp确认日期连续看残差的自相关函数前10阶绝对值是否快速衰减把预测收益率和实际收益率画在一张图上直观判断是否存在系统性偏移。这三项不用任何额外工具箱加起来不到十行代码能拦住绝大多数“算出来但不敢用”的结果。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/14 5:23:39

NiFi MySQL增量同步模板实战:日期边界与空值处理全解析

简介:这是基于Apache NiFi 1.21.0的MySQL到MySQL增量同步流程模板,专为需要做单表CDC实时同步的大数据开发、ETL工程师准备。模板由作者在实际项目中提炼而成,导入NiFi后即可直接运行,省去从零搭建数据同步流程的重复工作。模板核…

2026/9/14 5:23:39

仿QQ音乐Web项目开发实践:Grid布局、数据驱动渲染与localStorage

简介:面向网页前端初学者与课程设计学生的QQ音乐界面模仿作品,涵盖首页、排行榜、登录弹窗、听歌报告四个核心页面。项目以HTMLCSS为基础,结合适量JavaScript实现2D/3D动态轮播、时间倒计时、图片动态缩放、动态导航栏及背景音乐嵌入等功能&a…

2026/9/14 5:23:39

Haar小波变换心电信号去噪:Matlab实现与阈值参数调优指南

简介:资源为基于Haar小波变换的心电信号去噪Matlab实现,面向信号处理领域的本科、硕士教研学习,也可作为生物医学工程课程设计或毕业设计的参考。心电信号易受基线漂移、工频干扰等噪声影响,借助Haar小波分解与重构可有效去除噪声…

2026/9/14 6:23:42

Minara Harness:金融投研中可审计多Agent协作的HTML基础设施

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 6:23:42

2026独立站建站工具选型:Shopify替代方案与迁移避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 6:18:42

Agent-S 智能体框架:AI 学会像人用电脑的完整指南

Agent-S 智能体框架:AI 学会像人用电脑的完整指南 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 当你想让 AI 自动处理一份 Excel 报表&#x…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码