/ / /
第56讲:案例·ETF比较 (Case Study: Comparing ETFs)
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

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

💡

查看全集:💎Quantopia量化分析56讲

一、研究背景与目标

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

  1. 收益特征比较
  1. 风险特征分析
  1. 分布形态差异
  1. 投资组合影响

二、数据准备与预处理

2.1 数据获取与清洗

# 获取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 基础统计量

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}

其中:

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 累计收益可视化

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

四、统计假设检验

4.1 正态性检验

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 方差齐性检验

# 根据正态性结果选择检验方法
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 均值差异检验

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 联合分布可视化

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

5.2 滚动波动率对比

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 极端事件分析

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 相关性分析

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,因其夏普比率更高
  1. 分散化需求:利用两者中等相关性(约0.65)构建组合
  1. 极端事件防御:XLF右尾风险更高,需注意风险对冲
  1. 波动管理:XLK历史波动率较低,适合稳健型配置

七、关键发现总结

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

延伸思考:

# 综合对比可视化
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品种
  1. 调整时间周期验证结论稳定性
  1. 结合宏观经济指标进行归因分析
  1. 构建量化交易策略回测验证

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