3、汇率与外资流动的统计描述:描述性统计分析、相关性热力图、滚动相关系数计算

好,咱们进入第三章。说实话,这一章是整门课里最“实在”的部分。你想想看,汇率和外资流动到底有没有关系?有多大关系?是正相关还是负相关?这些不能靠拍脑袋,得靠数据说话。

我个人习惯,拿到任何新数据,第一件事就是做描述性统计。就像你去医院体检,先量身高体重血压一样。这一步能帮你快速发现数据有没有异常值、分布是否偏态、波动大不大。我在项目中遇到过好几次,因为没做这一步,后面跑出来的模型全是垃圾——嗯,后来就长记性了。

3.1 描述性统计分析

我们先看一组典型的汇率和北向资金数据。假设我们拿到了2020年到2024年的日度数据,包含美元兑人民币中间价(CNY)和北向资金净流入(NorthBound)。

描述性统计一般看这几个指标:均值、标准差、最小值、最大值、分位数。我习惯用 df.describe() 一把梭,但也会手动算一下偏度和峰度,因为这对后续建模很重要。

import pandas as pd
import numpy as np

# 假设 df 已经包含 'CNY' 和 'NorthBound' 两列
desc = df[['CNY', 'NorthBound']].describe()
print(desc)

# 额外算偏度和峰度
skew_cny = df['CNY'].skew()
kurt_cny = df['CNY'].kurtosis()
print(f'CNY 偏度: {skew_cny:.3f}, 峰度: {kurt_cny:.3f}')

输出结果大概长这样:

指标 CNY (美元兑人民币) NorthBound (亿元)
均值 6.89 12.45
标准差 0.32 58.76
最小值 6.30 -163.57
25%分位 6.65 -18.23
50%分位 6.88 8.91
75%分位 7.12 45.67
最大值 7.35 217.23

关键发现:北向资金的标准差高达58.76亿,说明外资流动的波动非常大。而CNY的标准差只有0.32,相对稳定。这意味着什么?汇率波动1%,可能对应外资流动几十亿的变化——弹性很大。

我的小技巧:看偏度时,如果绝对值大于0.5,就说明数据不对称。我曾经发现某段时间CNY的偏度达到1.2,后来一查,是因为央行在那段时间频繁干预汇率——数据里藏着政策痕迹。

3.2 相关性热力图

描述性统计看完了,接下来要问:汇率和外资流动到底有没有线性关系?最直接的办法就是算皮尔逊相关系数,然后画热力图。

但这里有个坑——千万别直接用原始数据算相关系数。为什么?因为汇率和外资都是非平稳序列,直接算出来的相关系数可能是假的。我建议至少用一阶差分(日收益率)来算。

# 计算日收益率
df['CNY_ret'] = df['CNY'].pct_change()
df['NB_ret'] = df['NorthBound'].pct_change()

# 计算相关系数矩阵
corr_matrix = df[['CNY_ret', 'NB_ret']].corr()
print(corr_matrix)

# 画热力图
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 5))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0,
            square=True, linewidths=0.5)
plt.title('汇率变动与外资流动的相关性热力图')
plt.show()

热力图会告诉你两件事:一是汇率和外资的相关系数是多少,二是这个系数是否显著。一般来说,如果相关系数绝对值大于0.1,就算有微弱的相关性了。

避坑指南:我曾经用原始数据算相关系数,结果高达0.85,兴奋得不行。后来发现是伪相关——两个序列都有时间趋势。改用差分后,相关系数直接掉到0.12。嗯,从此我再也不敢偷懒了。

实际项目中,我还会加入更多变量,比如沪深300收益率、美国10年期国债收益率、VIX指数等,做一个多维度的相关性热力图。这样能看出哪些因子对北向资金影响最大。

3.3 滚动相关系数计算

静态相关系数有个大问题:它假设相关性是恒定的。但现实世界不是这样的。2020年疫情刚爆发时,汇率和外资的相关性可能是负的;到了2022年美联储加息,相关性可能又变成正的了。

所以,我们需要滚动相关系数。说白了,就是用一个固定窗口(比如60个交易日),每滚动一天算一次相关系数,然后画成一条曲线。

# 计算60日滚动相关系数
window = 60
rolling_corr = df['CNY_ret'].rolling(window=window).corr(df['NB_ret'])

# 画图
plt.figure(figsize=(12, 5))
plt.plot(rolling_corr.index, rolling_corr.values, label=f'{window}日滚动相关系数', color='blue')
plt.axhline(y=0, color='red', linestyle='--', alpha=0.5)
plt.title('汇率变动与外资流动的滚动相关系数')
plt.ylabel('相关系数')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

这条曲线能告诉你很多故事。比如,当曲线长时间在0轴上方时,说明汇率升值(CNY下跌)伴随着外资流入;当曲线掉到0轴下方时,说明汇率升值反而导致外资流出——这通常发生在市场恐慌的时候。

实战经验:我习惯同时看30日、60日和120日三条滚动相关系数曲线。30日敏感但噪音大,120日平滑但滞后。三条线一起看,能判断趋势是否稳定。如果三条线方向一致,那这个信号就比较可靠。

另外,滚动相关系数的波动本身也是一个信号。我记得在2023年8月,滚动相关系数在两周内从+0.4暴跌到-0.3,随后北向资金大幅流出——这个拐点比很多技术指标都灵敏。

3.4 本章知识体系

为了让你更直观地理解这三部分的关系,我画了一张流程图:

汇率与外资流动统计描述知识体系 描述性统计分析 相关性热力图 滚动相关系数 均值、标准差、分位数 偏度、峰度检验 异常值检测 皮尔逊相关系数 差分处理(去趋势) 多因子热力图 固定窗口滚动计算 多窗口对比(30/60/120) 拐点识别与信号生成 核心目标:识别汇率与外资流动的真实关系 避免伪相关 → 捕捉时变特征 → 生成交易信号

这张图把本章的三个核心模块串起来了。从描述性统计开始,到相关性热力图做静态分析,再到滚动相关系数做动态跟踪——这是一个层层递进的过程。你想想看,如果连数据的基本特征都不清楚,后面算出来的相关系数你敢信吗?

我的习惯:每次做完滚动相关系数,我都会把曲线图打印出来贴在工位上。盯着看久了,你会发现一些规律——比如每年春节前后,汇率和外资的相关性都会短暂转负。这些经验是书本上学不到的。

好了,这一章的内容就到这里。记住,统计描述不是终点,而是起点。它帮你发现问题,但答案还在后面的章节里。


公众号:蓝海数据掘金营,微信deep3321