跳到主内容
Capstone结业研究案例(Capstone) · 第55–56讲2/2模块导览 →
研究案例

第56讲:案例·ETF比较 (Case Study: Comparing ETFs)

比较多只 ETF 的收益、波动、相关性和回撤特征,展示数据清洗、风险调整指标与组合选择中的口径限制。

完成状态保存在当前浏览器,可随时取消。

一、研究背景与目标#

本案例选取科技行业ETF(XLK)与金融行业ETF(XLF)进行多维比较,通过完整的分析流程演示金融数据分析方法。我们将重点关注:

  1. 收益特征比较

  2. 风险特征分析

  3. 分布形态差异

  4. 投资组合影响

二、数据准备与预处理#

2.1 数据获取与清洗#

code
# 获取2018-2020年历史数据
def fetch_comparison_data():
    tickers = ['XLK', 'XLF']
    data = yf.download(tickers, start='2018-01-01', end='2020-01-01')
    return data['Close'].dropna()  # 确保数据清洁

etf_close = fetch_comparison_data()

# 计算收益率
returns = etf_close.pct_change().dropna()
xlk_returns = returns['XLK']
xlf_returns = returns['XLF']

2.2 基础统计量#

code
print("XLK收益特征:")
print(xlk_returns.describe())
print("\nXLF收益特征:")
print(xlf_returns.describe())
统计量XLKXLF
均值0.00080.0005
标准差0.01320.0145
峰度1.822.35
偏度-0.310.05

三、风险收益特征分析#

3.1 夏普比率计算#

Sharpe=E(Rp)RfσpSharpe = \frac{E(R_p) - R_f}{\sigma_p}

其中:

  • E(Rp)E(R_p)为投资组合的期望收益率

  • RfR_f为无风险利率

  • σp\sigma_p为投资组合的标准差

  • 该指标衡量单位风险下的超额收益水平

code
risk_free_rate = 0.0002  # 假设无风险利率

def sharpe_ratio(returns):
    excess_return = returns.mean() - risk_free_rate
    return excess_return / returns.std()

print(f"XLK夏普比率: {sharpe_ratio(xlk_returns):.4f}")
print(f"XLF夏普比率: {sharpe_ratio(xlf_returns):.4f}")

3.2 累计收益可视化#

code
(etf_close / etf_close.iloc0 * 100).plot(figsize=(10,6))
plt.title('ETF价格走势标准化比较')
plt.ylabel('标准化价格(基准=100)')
plt.show()

四、统计假设检验#

4.1 正态性检验#

code
def enhanced_normality_check(data, name):
    plt.figure(figsize=(8,4))
    stats.probplot(data, plot=plt)
    plt.title(f'{name} Q-Q图')
    plt.show()

    k2, p = stats.normaltest(data)
    print(f'{name}正态检验: p值={p:.4f}')

enhanced_normality_check(xlk_returns, 'XLK')
enhanced_normality_check(xlf_returns, 'XLF')

4.2 方差齐性检验#

code
# 根据正态性结果选择检验方法
if stats.normaltest(xlk_returns).pvalue > 0.05 and stats.normaltest(xlf_returns).pvalue > 0.05:
    test_method = 'F-test'
    _, p_var = stats.f_oneway(xlk_returns, xlf_returns)
else:
    test_method = 'Levene'
    _, p_var = stats.levene(xlk_returns, xlf_returns)

print(f'使用{test_method}检验方差齐性: p值={p_var:.4f}')

4.3 均值差异检验#

code
t_stat, p_mean = stats.ttest_ind(xlk_returns, xlf_returns, equal_var=(p_var > 0.05))
print(f'均值差异检验结果: t统计量={t_stat:.2f}, p值={p_mean:.4f}')

五、分布特征深度分析#

5.1 联合分布可视化#

code
sns.jointplot(x=xlk_returns, y=xlf_returns, kind='hex')
plt.suptitle('XLK与XLF收益联合分布')
plt.tight_layout()

5.2 滚动波动率对比#

code
window_size = 20  # 交易日窗口

plt.figure(figsize=(10,6))
xlk_returns.rolling(window_size).std().plot(label='XLK波动率')
xlf_returns.rolling(window_size).std().plot(label='XLF波动率')
plt.title('滚动20日波动率对比')
plt.legend()

5.3 极端事件分析#

code
def analyze_tail_risk(returns, name):
    tail_threshold = returns.quantile(0.95)
    tail_events = returns[returns > tail_threshold]
    print(f'{name}极端收益特征:')
    print(f'发生次数: {len(tail_events)}')
    print(f'平均收益: {tail_events.mean():.4f}')
    print(f'最大收益: {tail_events.max():.4f}\n')

analyze_tail_risk(xlk_returns, 'XLK')
analyze_tail_risk(xlf_returns, 'XLF')

六、投资组合启示#

6.1 相关性分析#

code
correlation = xlk_returns.corr(xlf_returns)
print(f'收益相关系数: {correlation:.4f}')

plt.figure(figsize=(8,6))
sns.regplot(x=xlk_returns, y=xlf_returns, line_kws={'color':'red'})
plt.title('收益率散点图与回归线')

6.2 组合优化建议#

基于分析结果,我们得出以下投资建议:

  1. 风险偏好型投资者:考虑超配XLK,因其夏普比率更高

  2. 分散化需求:利用两者中等相关性(约0.65)构建组合

  3. 极端事件防御:XLF右尾风险更高,需注意风险对冲

  4. 波动管理:XLK历史波动率较低,适合稳健型配置

七、关键发现总结#

分析维度XLK特征XLF特征
收益能力日均收益更高绝对收益波动更大
风险特征波动率较低极端收益事件更多
分布形态左偏明显接近对称分布
风险调整收益夏普比率优势显著需优化风险控制

延伸思考:

  • 科技行业ETF的高夏普比率是否具有持续性?

  • 金融ETF的极端收益事件是否与货币政策周期相关?

  • 如何利用两者相关性构建有效的对冲组合?

code
# 综合对比可视化
fig, ax = plt.subplots(2,2, figsize=(14,10))

# 收益分布对比
sns.kdeplot(xlk_returns, ax=ax[0,0], fill=True, label='XLK')
sns.kdeplot(xlf_returns, ax=ax[0,0], fill=True, label='XLF')
ax[0,0].set_title('收益分布对比')

# 累计收益对比
(etf_close/etf_close.iloc[0]).plot(ax=ax[0,1])
ax[0,1].set_title('累计收益走势')

# 波动率对比
pd.DataFrame({'XLK': xlk_returns.rolling(20).std(),
              'XLF': xlf_returns.rolling(20).std()}).plot(ax=ax[1,0])
ax[1,0].set_title('滚动波动率')

# 相关性热力图
sns.heatmap(returns.corr(), annot=True, ax=ax[1,1])
ax[1,1].set_title('收益相关性矩阵')

plt.tight_layout()

本案例完整展示了从数据获取到深入分析的完整流程,投资者可基于此框架:

  1. 扩展分析更多ETF品种

  2. 调整时间周期验证结论稳定性

  3. 结合宏观经济指标进行归因分析

  4. 构建量化交易策略回测验证

通过本案例,读者不仅掌握了ETF比较的技术方法,更重要的是建立了将统计分析工具应用于实际投资决策的完整思维框架。

Capstone 交付要求#

提交一份能够支持真实配置决策的 ETF 研究包:

  1. 研究问题与决策边界:配置目标、基准、投资期限、风险预算和不适用情形

  2. 数据口径:总回报或价格回报、分红再投资、费用率、成立日期、币种、交易时区与缺失数据规则

  3. 样本外比较:冻结最终评价窗口,报告全部候选 ETF,避免根据全样本结果反向挑选对象

  4. 现实约束:跟踪误差、点差、成交量、税费、申赎与再平衡成本,以及压力期流动性

  5. 决策记录:选择理由、备选方案、敏感度分析、监控指标和触发重新评估的条件

评审者应能用同一口径重算关键指标,并指出结论对时间窗口、基准或成本假设的依赖;否则案例只算探索分析,不算完成研究闭环。

完成研究复核后,自评一次

请按能否复现、质疑并改进研究过程来判断,而不是按是否读完。

模块收束 · 0/2 已完成

把知识收束成可复核的研究产物

完成后应该能够

  • 能够提交明确区分事实、假设和推断的研究报告
  • 能够说明数据限制、样本外结果、成本、风险与失效条件

交付物

  • 研究假设与数据字典
  • 可复现 Notebook、成本后回测和 tearsheet
  • 两页研究备忘录:结论、风险、容量与上线建议

本模块已有 0/2 个主要学习单元完成。 本模块没有待复习项。

返回学习中心已到达课程终点