首页 / 资讯中心 / 文章详情

用Python挖掘利率与汇率背后的宏观风险信号

用Python挖掘利率与汇率背后的宏观风险信号 ★ FEATURED ARTICLE
利率和汇率是宏观金融分析里绕不开的两个变量。我刚开始做固收研究那阵子带我的前辈提过一句搞懂利率你才能看懂债券市场的定价逻辑搞懂汇率你才能想明白资金在跨市场之间为什么这样流动。这话糙但确实点到了核心。我这份学习笔记已经写到中阶篇第6章前面的章节解决的是数据和工具问题这一章终于回归到宏观分析的主轴——利率与汇率背后到底藏着哪些可量化的风险信号以及如何用Python把这些信号挖出来、摆到桌面上。这不是一篇纯理论笔记也不是完整的量化策略教程。它是一个偏实战的分析框架面向有一定Python和pandas基础、想做宏观研究或风险管理相关工作的读者。你会看到收益率曲线的构建、利差计算、汇率趋势识别、波动率度量以及利率和汇率之间的联动分析每一段都配了可直接复用的Python代码和我在实操中踩过的坑。如果你正准备从“会画图”走向“能分析”这一章应该能帮上忙。1. 为什么利率和汇率是金融风险的“定价之锚”先说一个我去面试时被问过、后来也常拿来问别人的问题一个国家的金融市场出了风险最先有反应的指标是什么答案往往不是股票指数而是利率和汇率。这两个变量对信息的反应速度极快因为它们直接决定了资金的成本和流向。1.1 利率的本质是资金的时间价格利率说白了就是借钱的成本也代表资金的时间价值。你把钱放在银行一年银行给你的回报就是一年期存款利率企业发行债券融资投资者要求的回报率就是这只债券的到期收益率。利率水平越高说明在当前的市场上资金越“贵”借钱越不划算融资需求越容易受到抑制反过来利率走低资金变得便宜企业和个人的融资成本下降投资和消费就有被激活的可能。在Python里做利率分析我习惯把数据统一换算成年化收益率annualized yield再比较。为什么强调“年化”因为市场上不同期限的产品计息习惯不一样有的按360天、有的按365天有的用单利、有的用复利。如果不统一口径你画出来的收益率曲线可能根本不在一个坐标系里。后面第3节我会专门讲怎么处理这种口径问题。1.2 汇率的本质是货币间的相对价格汇率是两种货币的兑换比例但别把它当成一个简单的换算系数。汇率的变动反映的是持有不同货币的相对回报率和风险偏好的变化。你持有本币还是外币不仅看两者之间的利率差还要看本币资产未来会不会贬值。一旦市场预期某货币要贬值资金就会流向更稳的货币这个预期反过来又推动汇率走向那个方向形成一个自我强化的过程。分析汇率时我通常会区分名义汇率和实际汇率。名义汇率就是你在行情终端上看到的报价实际汇率是经过两国物价水平调整后的购买力比价。做趋势跟踪或风险监控主要看名义汇率做长期均衡分析比如判断某货币是否被高估或低估实际汇率更有参考价值。两者的关系就像商品的原价和折后价——名义价格是表面标签实际购买力才是真实负担。1.3 两个变量如何传导风险利率和汇率在一起构成了宏观风险的传导链条。一个常见的情景是某经济体货币政策收紧利率上行本币资产的回报率上升吸引外资流入本币升值但如果外资流入过快资产价格被推高后续又可能出现反向流动本币快速贬值同时债市因为利率上行而下跌。在这个链条里利率是“因”汇率很多时候是“果”但两者经常互为因果纠缠在一起。做风险管理的人需要意识到利率和汇率不是两个独立的因子而是一个联动系统。只看其中任何一边都可能漏掉真正的风险源。这也是我把它们放在同一章笔记里分析的原因——单变量分析是基础联动分析才是风险管理的进阶玩法。2. 分析前的数据准备环境、数据源与清洗进入代码实操前先把饭做好。金融数据分析里数据获取与清洗的时间常常占掉整个项目的一半以上。如果这一步没做好后面再精巧的模型也是白搭。2.1 环境搭建与工具清单我这套笔记全程基于Python 3.10以上版本核心依赖如下pandas2.0 numpy1.24 matplotlib3.7 scipy1.10 statsmodels0.14按需安装的还有arch库用于波动率建模和scikit-learn偶尔做特征工程但第6章的基础分析不强制要求。我的建议是直接用虚拟环境管理依赖不要一股脑装到全局环境里否则项目换机器部署时经常出现“这个库没装上”的尴尬。导库代码我通常固定成下面这组import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import stats import statsmodels.api as sm from statsmodels.tsa.stattools import adfuller import warnings warnings.filterwarnings(ignore) plt.rcParams[font.sans-serif] [SimHei, Arial Unicode MS] plt.rcParams[axes.unicode_minus] False这里提前把中文字体设置好是因为matplotlib默认字体不含中文不设置的话图上所有中文标签会变成方块。这是每个用Python做过中文图表的人都会遇到的经典问题。2.2 数据从哪来利率和汇率数据的获取渠道很多国内外都有成熟的财经数据接口。注册之后申请相应的权限就能通过Python接口拿到日频甚至分钟频数据。对于个人学习者来说我的选择标准是字段要规范统一日期格式、统一报价单位、历史覆盖要够长至少覆盖一轮完整的利率周期、接口要稳定不要今天能调用明天就挂掉。以汇率为例需要关注的核心字段包括日期datetime开盘价、最高价、最低价、收盘价前者常用于日内波动分析后者用于日频趋势判断交易量某些场景用得上比如判断趋势是否放量利率数据则相对特殊常用的包括各期限国债到期收益率、政策利率、银行间质押式回购利率、SHIBOR类市场化拆借利率。实盘分析中我会同时抓取多个期限的数据因为收益率曲线的形状比单一期限的利率水平更重要。2.3 数据清洗与对齐最容易翻车的地方拿到数据后第一件事不是开跑模型而是做对齐alignment。为什么因为利率和汇率数据的频率和节假日特征不一样。债券市场交易日、外汇市场交易日、股票市场交易日三者并不是完全重合的。某个日期如果只有利率数据而没有汇率数据直接做相关性分析就会引入偏差。我习惯用reindex把所有序列对齐到统一的日期索引上具体做法def align_data(rate_df, fx_df): 将利率和汇率数据按日期对齐缺少的交易日填充为NaN combined_index rate_df.index.union(fx_df.index).sort_values() aligned pd.concat([rate_df.reindex(combined_index), fx_df.reindex(combined_index)], axis1) # 只保留两边都有数据的交易日避免前向填充掩盖缺失 aligned aligned.dropna(howany) return aligned有些资料会教你先用ffill()做前向填充把缺失值填上再说。但我个人建议谨慎行事前向填充适合插值展示不适合做统计分析因为它会人为制造“价格没变”的假象压低真实波动率。如果是做相关性分析和回归检验宁可删掉不完整的日期也不要做无脑填充。另外还要处理异常值。金融数据里偶尔会出现“报价错误”或“交易日数据跳变”。我的办法是先用滚动窗口计算正常范围再标记超出N倍标准差的数据点人工复核后决定是剔除还是保留def flag_outliers(series, window20, n_sigma5): rolling_mean series.rolling(window).mean() rolling_std series.rolling(window).std() upper rolling_mean n_sigma * rolling_std lower rolling_mean - n_sigma * rolling_std return (series upper) | (series lower)实操心得数据清洗阶段把每一步操作都存下来方便回溯。我习惯把原始数据、清洗后数据、衍生指标分别存成三个CSV而不是覆盖原文件。时间索引统一用UTC或本地市场时间不要把不同时区的数据混在一个索引里否则会出现“日期偏移一天”的诡异bug。如果用的是别人整理好的数据集务必确认它的报价单位是“百分比”还是“小数”。利率数据尤其容易出错——是0.03还是3相差100倍做错单位整篇文章的分析结论全废。3. 用Python拆解利率从收益率曲线到期限利差利率分析里我最推荐先从收益率曲线入手。它把不同期限的利率水平放在同一张图上就像给市场拍了一张X光片期限结构的形态直接传递了市场对未来的预期。3.1 收益率曲线的构建思路所谓收益率曲线就是横轴为期限、纵轴为到期收益率的曲线。常见期限包括1个月、3个月、6个月、1年、2年、3年、5年、10年等。分析师关注的核心是曲线的斜率、曲率和整体水平。斜率长期利率减短期利率是最重要的参考指标。曲线陡峭通常意味着市场预期未来经济增长或通胀上升要求长期资金给出更高的补偿曲线平缓甚至倒挂长期利率低于短期利率则往往被解读为市场对未来增长表示担忧。注意我说的是“往往”因为收益率曲线的形态受多重因素影响不能只看单一解释。在Python里我先把不同期限的利率数据放入DataFrame然后画出曲线def plot_yield_curve(df, date_coldate, value_colyield, term_colterm): pivot_df df.pivot(indexdate_col, columnsterm_col, valuesvalue_col) # 选取某一天的期限结构 sample pivot_df.iloc[-1].dropna() sample.plot(markero, figsize(10, 5)) plt.title(fYield Curve on {pivot_df.index[-1].date()}) plt.xlabel(Term) plt.ylabel(Yield (%)) plt.grid(True) plt.show()这里有个细节不同期限的数据可能已经自动按数值排序但有些数据接口返回的是字符串类型的期限比如“1Y”“10Y”直接画图会发现横轴顺序错乱。处理办法是把期限字段转成数字df[term_num] df[term].str.replace(Y, ).astype(int)3.2 利差指标的量化利差是利率分析里最常用的衍生指标。最经典的是10年期与2年期国债收益率利差民间叫“10-2利差”。它反映的是长短期利率间的距离。计算很简单df_spread pd.DataFrame({ y2: df[y2] if y2 in df.columns else df[2Y], y10: df[y10] if y10 in df.columns else df[10Y] }) df_spread[spread_10_2] df_spread[y10] - df_spread[y2]利差指标的真正价值在于它的历史分位。比如当前10-2利差是0.2个百分点单看这个数字意义不大但如果你回看过去10年发现历史上这个利差低于0时之后12个月衰退概率很高那么当前0.2的分位水平就有了预测含义。这里要强调分位数统计用来描述历史规律是没问题的但不要把它当成必然的因果规律。宏观环境变了历史分位数的参考意义会打折扣。3.3 用Nelson-Siegel模型拟合期限结构如果只想画一条经过所有期限点的曲线用插值就行。但在比较不同日期的曲线形态时直接把散点连接起来不够“干净”因为市场噪音会让曲线抖动得很厉害。这时我习惯用Nelson-Siegel模型做参数化拟合。Nelson-Siegel模型的核心思想是用三个隐含因子来描述整条收益率曲线水平因子β0、斜率因子β1和曲率因子β2。公式长这样y(τ) β0 β1 * (1 - exp(-τ/λ)) / (τ/λ) β2 * ((1 - exp(-τ/λ)) / (τ/λ) - exp(-τ/λ))其中τ是期限λ是衰减参数。β0决定了曲线的长期水平β1影响短端β2影响中段曲率。拟合好这个模型之后你得到的不是一个又一个离散的点而是可以连续预测任意期限收益率的函数这在计算更多期限结构指标时非常好用。Python实现可以采用scipy.optimize.curve_fitfrom scipy.optimize import curve_fit def ns_curve(theta, t): beta0, beta1, beta2, lam theta factor (1 - np.exp(-t / lam)) / (t / lam) return beta0 beta1 * factor beta2 * (factor - np.exp(-t / lam)) terms np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10]) yields np.array([2.10, 2.30, 2.45, 2.60, 2.75, 2.90, 3.00, 3.10]) popt, _ curve_fit(ns_curve, terms, yields, p0[3, -0.5, 0.5, 2]) t_fine np.linspace(0.1, 10, 200) y_fitted ns_curve(popt, t_fine) plt.scatter(terms, yields, labelObserved) plt.plot(t_fine, y_fitted, labelNelson-Siegel, colorred) plt.legend() plt.show()这个模型的意义不仅在拟合本身。β0、β1、β2三个因子的时间序列本身就可以作为基本面状态的代理变量。比如β1持续下行说明市场对短期风险的担忧在上升β2出现剧烈波动说明市场对中期不确定性的分歧加大。把这三个参数导出成时间序列再去做因子分析是利率研究中一条很实用的路径。3.4 利率变化对资产价格的敏感性测算利率分析最终要落到资产定价上。债券价格与收益率是反向关系收益率上升债券价格下跌。而久期duration衡量的是利率每变动1个百分点债券价格大约变化多少百分比。从数据角度你可以直接算不同期限债券对利率的敏感性。用Python做一个简化版的久期演示不需要调用复杂估值库。假设一只债券每年付息一次到期收益率是y期限是n年票息是c面值100那么修正久期的近似思路是分别计算利率上下变动5个基点时债券价格的变化然后求弹性def bond_price(y, coupon, face, n): cf np.array([coupon * face] * n) cf[-1] face t np.arange(1, n 1) pv np.sum(cf / (1 y) ** t) return pv price_down bond_price(y - 0.0005, coupon, face, n) price_up bond_price(y 0.0005, coupon, face, n) approx_duration (price_down - price_up) / (2 * 0.0005 * y) / 100注意这里的久期估算用的是利率变动基础上的“对称差分”它给出的是近似值。真正的麦考利久期和修正久期还有更严格的定义但对于日常风险监控这种近似估算已经足够说明你对利率变动的敏感度。4. 用Python拆解汇率趋势、波动与风险度量汇率序列的统计特征和利率很不一样。利率常常表现出明显的均值回归特性而汇率长期来看更接近随机游走。这意味着你用分析利率的方法去套汇率很容易得出错误的结论。4.1 汇率序列的特征与检验拿到一条汇率曲线我做的第一件事不是画均线而是先做平稳性检验。为什么因为平稳性是很多统计模型的前提。如果一个序列是非平稳的直接用普通最小二乘回归做预测会出现伪回归风险——两个根本不相关的非平稳序列跑出来的回归系数却“显著”典型的地图炮级错误。常用的检验是ADFAugmented Dickey-Fuller检验result adfuller(fx_series.dropna()) print(fADF统计量: {result[0]:.4f}) print(fp值: {result[1]:.4f})如果p值大于0.05说明不能拒绝“存在单位根”的原假设即序列是非平稳的。这个结果我通常不惊讶——绝大多数名义汇率序列都跑不平稳。所以分析汇率时我更关注它的收益率一阶差分而不是价格水平本身fx_ret fx_series.pct_change().dropna()4.2 趋势识别均线系统与斜率趋势识别是汇率分析的日常操作。我常用的工具是移动平均线和趋势斜率。移动平均线的逻辑很简单价格在均线上方且均线向上说明中期趋势偏多价格跌破均线且均线向下说明趋势转空。代码也不复杂:fx_df[ma20] fx_df[close].rolling(20).mean() fx_df[ma60] fx_df[close].rolling(60).mean() fx_df[slope20] fx_df[ma20].diff(5) / 5这里介绍一下slope20的处理我把20日均线再做一个5日差分意义是均线的近期变化速度。为什么不是直接用当日价格变化因为均线已经平滑了噪音再对它求差分得到的斜率更稳定不会一两个交易日就把趋势信号反转。我实测下来斜率信号配合价格与均线的位置关系比单用金叉死叉的噪音要小得多。看图说话的注意点汇率图的纵轴刻度往往差异很大比如某货币对在7.0左右波动另一货币对在0.9左右画多张图时务必固定纵轴范围或者标注清楚单位否则肉眼对比会得出错误结论。4.3 波动率与VaR度量汇率风险管理的核心指标是波动率和在险价值VaR。波动率衡量的是不确定性的大小VaR则回答一个问题在给定的置信水平下未来一段持有期内最大可能损失是多少。历史模拟法的VaR计算非常直观——直接用过去N天的收益率排序取对应分位数即可var_95 np.percentile(fx_ret.dropna(), 5) var_99 np.percentile(fx_ret.dropna(), 1)注意一个细节VaR的符号处理。pct_change得到的收益率为正表示升值负表示贬值。如果你是持有外币资产那么汇率贬值收益率为负才是风险方向。所以这里的var_95取5%分位数对应的是最差5%场景下的贬值幅度。符号方向务必搞清楚否则算出来的VaR含义完全相反。除了历史模拟法还有一种常见做法是用EWMA指数加权移动平均计算条件波动率。EWMA的思路是近期数据权重更高记忆衰减更快def ewma_vol(returns, lambda_0.94): var returns.ewm(span2/(1-lambda_)-1).var() return np.sqrt(var * 252)0.94是业界常用的衰减系数代表“半衰期”大约为11个交易日。也就是说11天前的数据权重约为现在的一半。这个参数有历史经验依据但在实盘中你也可以根据数据本身做优化不必盲目套用。实操心得汇率数据有时会出现周末跳空。周五收盘价和周一开盘价之间隔了两天日收益率计算会把两天的变化挤在一个数值里。做波动率分析时可以单独考虑跳过这些跳空或者用周期性的波动率模型区分周内效应与周末效应初级分析阶段无需过度处理但要心里有数。多个货币对之间通常存在相关性比如本币兑主要贸易伙伴货币的汇率往往联动。分析单一货币对时顺带看一下其他货币对的方向能有效避免被“孤立行情”误导。5. 利率与汇率的联动利差视角的传导分析利率和汇率放一起分析时最经典的切入点就是利差。这也回扣了第1节说的传导逻辑追逐更高回报率的资金会在不同货币之间流动从而影响汇率。5.1 影响链条利差如何驱动汇率笼统讲可投资本会从低利率货币流向高利率货币这个逻辑被称作利差交易carry trade。如果A货币的利率高于B货币且汇率保持稳定那么持有A货币资产就能获得额外收益。问题是高利率通常伴随着高波动当市场风险偏好急剧下降时资金会从高息货币撤离转向低息货币避险这时利差交易反向平仓又会加剧汇率的波动。在Python中验证这个逻辑第一步是计算两国之间的利率差spread domestic_rate - foreign_rate然后把这个利差序列和汇率收益率序列做滚动相关性分析。滚动相关性的意义在于观察两者的联动是否随时间变化fx_ret fx_series.pct_change().rolling(60).mean() * 252 # 年化短期收益动能 roll_corr spread.rolling(60).corr(fx_ret)如果这个滚动相关系数大多数时间为正说明利差扩大时汇率方向与理论相符如果某些时段系数突然转负则说明有更强的因素在主导汇率比如避险情绪、资本管制预期等这时候利差框架的预测能力就变弱了。5.2 统计验证的常用手段除了相关系数协整检验是宏观联动分析中一个非常有用的工具。协整描述的是两个非平稳时间序列之间可能存在长期稳定的线性关系。前面ADF检验说大多数汇率非平稳但如果本币利率和汇率之间存在某种经济传导机制它们的某种线性组合可能是平稳的——这就是协整的意义找到非平稳变量之间的长期平衡关系。最朴素的验证方法是Engle-Granger两步法第一步用最小二乘法做回归X sm.add_constant(foreign_rate) model sm.OLS(domestic_rate, X).fit() residual model.resid第二步对残差做ADF检验。如果残差序列平稳说明两个变量之间存在协整关系adf_resid adfuller(residual, autolagAIC) print(f残差ADF p值: {adf_resid[1]:.4f})这里我有句话必须说协整关系是统计性质不等同于经济因果关系。你检验出“利率与汇率存在协整关系”只能说明两者的历史数据模式不是完全独立的真正解释为什么仍然要回到利率平价、资本流动、通胀预期这些理论框架上。统计工具解决的是“有没有联系”经济学逻辑解决的是“为什么有联系”。5.3 案例当利差与汇率的同步关系失效时我处理过一段很有意思的数据利差持续走阔但对应货币的汇率却纹丝不动甚至有贬值压力。单看利差框架这几乎是个“悖论”。后来拆解下来主要原因是市场对未来的预期已经提前定价。利差是当前状态而汇率反映的是市场对未来的判断——如果市场认为当前高利差不可持续、未来会收窄那么即期汇率就不会跟随当前利差走。这个案例给我的教训是做联动分析不能只盯当前值还要看利差的趋势和预期。具体到代码可以把利差的一阶差分、二阶差分一并纳入观察辅以滚动窗口分析看边际变化是否先于汇率转向。6. 完整实战搭建一个简易的利率汇率监控框架说了不少理论和方法最后用一个完整的实战项目把它们串起来。目标是搭建一个“内容虽小、五脏俱全”的监控框架每天拉取利率和汇率数据自动生成3张核心图表输出利差和波动率指标并在出现极端信号时给出提醒。6.1 需求拆解我的需求分成四块数据层读取利率短期和长期各一组和汇率日频数据。指标层计算10-2利差、汇率20日波动率、60日滚动相关性。展示层画出收益率曲线、汇率趋势图和利差联动图。预警层当利差低于历史10%分位或波动率突破历史90%分位时打印提醒。拆解需求的价值在于把大目标切小每个函数只干一件事后面调试时才不会一头雾水。6.2 核心代码实现class MacroMonitor: def __init__(self, rate_short, rate_long, fx): self.rate_short rate_short self.rate_long rate_long self.fx fx self.data self._build_frame() def _build_frame(self): df pd.DataFrame({ rate_short: self.rate_short, rate_long: self.rate_long, fx: self.fx }).dropna() df[spread] df[rate_long] - df[rate_short] df[fx_ret] df[fx].pct_change() df[fx_vol] df[fx_ret].rolling(20).std() * np.sqrt(252) df[roll_corr] df[spread].rolling(60).corr(df[fx_ret]) return df def report_extremes(self): recent self.data.dropna() spread_pctile (self.data[spread] stats.percentileofscore( recent[spread], 10)).iloc[-1] vol_pctile (self.data[fx_vol] np.nanpercentile( recent[fx_vol], 90)).iloc[-1] if spread_pctile: print([提醒] 利差处于历史低位) if vol_pctile: print([提醒] 汇率波动率处于历史高位) def plot_all(self): fig, axes plt.subplots(3, 1, figsize(12, 12)) self.data[[rate_short, rate_long]].plot(axaxes[0], titleInterest Rates) self.data[fx].plot(axaxes[1], titleExchange Rate) self.data[[spread, roll_corr]].plot(axaxes[2], titleSpread Rolling Correlation) plt.tight_layout() plt.show()这段代码的定位是演示骨架不是生产级别的工具。比如它没有处理数据获取失败、没有考虑数据频率不同步也没有保存结果。但作为一套思路模板它可以帮你快速搭起自己的版本后续按需加日志、加数据库、加通知推送都很方便。6.3 输出与复盘跑完这个框架后你会得到一套整齐的指标输出。我的习惯是每周固定时间跑一次把图表和指标存下来月末汇总做一次趋势复盘。注意不要每天盯着这些指标追涨杀跌宏观变量本身低频日频观察最主要的价值是“不要错过拐点”而不是“抓住每一个波动”。复盘时重点看三件事利差是否形成趋势性变化还是在一个窄区间里震荡汇率波动率是否出现显著抬升抬升的驱动因素是预期变化还是事件冲击滚动相关性是否出现方向反转反转能否找到对应的事件解释。7. 实操心得与避坑清单这一节把我在学习和实盘中踩过的坑集中梳理一遍按数据、计算、业务解读三个层面分开。每一个坑都对应着一次真金白银的教训。7.1 数据层面的坑第一数据频率不一致。利率数据有的接口给的是日频有的只有周频如果不处理计算滚动指标时会出现大量NaN。第二日期索引不规范。有的接口返回字符串日期有的返回datetime对象还有的带时区信息。统一转换成UTC或市场本地时间后排序是最稳妥的。第三利率报价口径不一致。有的接口给的是“收益率”有的给的是“净价”两者不能混在一起比较。净价对应的是债券的成交价格收益率才是分析利率水平用的。7.2 计算层面的坑计算年化波动率时注意乘以252还是365。股票市场习惯用252一年的交易日数外汇市场因为几乎全年交易有人用365。两种口径给出的数值不同但只要同一报告里持续用同一个口径就没问题前后混用则是大忌。计算收益率时pct_change和np.log().diff()并不完全等价。pct_change得到的是简单收益率对数差得到的是连续复利收益率。两者在波动率很小的序列上差异不大但在波动剧烈时会出现偏差。金融建模里连续复利收益率的统计性质更好跨时间可加因此做多期累计分析时我优先用对数收益率fx_log_ret np.log(fx).diff()7.3 业务解读层面的坑最容易犯的错是把相关性当作因果性。观察到利差与汇率正相关不代表“只要扩大利差汇率就会升值”。中间还隔着市场预期、风险偏好、资本管制、贸易条件等多重变量。写结论时我习惯用“与……有正相关关系”不用“导致”。另一个坑是过度解读统计显著性。当样本量很大时很小的相关系数也可能在统计上“显著”但实际经济意义可能微不足道。显著性检验告诉你的是“这个关系不太可能是随机波动造成的”它不告诉你“这个关系的实际影响有多大”。所以我会同时看相关系数的大小和置信区间而不只盯p值。7.4 常见问题速查表问题现象常见原因排查建议收益率曲线图横轴乱序期限字段是字符串将期限字段转为数字类型滚动相关性全为NaN数据未对齐缺失过多检查两个序列的日期索引是否一致ADF检验结果不稳定样本窗口过短至少使用3年以上的日频数据年化波动率数值异常大把百分比直接当小数或反之确认利率/收益率的单位口径并全局统一汇率VaR符号反了混淆持币方向明确持有的资产是外币还是本币再定义损失方向图表中文显示方块未设置中文字体配置plt.rcParams字体参数7.5 最后再分享一个小技巧汇率分析里我习惯同时看“对数收益率”和“移动平均偏离度”两个指标。移动平均偏离度是当前价格相对于长期均线的偏离比例它可以直观地告诉你当前汇率离历史中枢有多远。偏离度过大时均值回归的力量往往会开始起作用这时即便趋势指标仍然看多也该适当谨慎。代码如下fx_dev x / x.rolling(120).mean() - 1这个指标没有太复杂的内核但它在我的监控框架里出镜率最高因为它把一个抽象的“贵还是便宜”的问题变成了一个具体可比较的数字。做这一章笔记时我最大的体会是Python只是放大镜金融逻辑才是真正的手术刀。模型跑出来的每一个数字最终都要回到“资金的成本”和“资金的流向”这两个基本问题上。多问自己一句“为什么”比多跑一个模型往往更有价值。
阅读完成 · 觉得有帮助?
咨询建站