头条 A500ETF的α策略和β策略

-- 次阅读

作者: FinTechHi

论文《α策略和β策略研究分析——以A500ETF南方和华泰柏瑞沪深300ETF为例》。下面是本文的核心要点脑图,可简单了解下。

因为自己一直跟踪A500相关的ETF。今天看到这个论文马不停蹄的复现下。

中证A500指数纳入更多新兴行业龙头企业。

从一级行业分布来看,工业、信息技术、医药卫生、通信服务等新兴产业权重合计近50%。

指数优先选取中证三级行业龙头上市公司作为指数样本,进一步增强指数对"新质生产力"的表征性。

经统计,中证A500指数纳入中证二级、三级行业龙头公司数量分别为35只、91只。

2.分析逻辑:* 获取A500ETF南方(159352)从2024-10-01至今的日行情数据

  • 获取沪深300指数(000300)同样日期的日行情数据
  • 获取10年期国债收益率日度数据(从2024-10-01至今)
  • 数据预处理和合并
  • 计算收益率
  • 按季度分组
  • 对每个季度进行回归(计算β和α)

文中没给出β和α和计算模型,直接使用回归和CAPM模型:* β计算:使用原始收益率,回归模型为:基金收益率 = α + β * 市场收益率 + ε

  • α计算:使用超额收益率,按照CAPM模型:基金超额收益率 = α + β * 市场超额收益率 + ε

3.分析结果代码运行后:* * * *

1
平均Beta值: 0.9274Beta最小值: 0.7591  Beta最大值: 1.1729Beta标准差: 0.0917

原论文中描述A500ETF南方β值在0.60-1.30间波动,自己计算结果0.76-1.17之间,说明符合这一范围,证明计算模型应该问题不大。从经济学意义理解下ββ = 资产收益率对市场收益率的敏感度* β = 1.0:资产与市场同涨同跌,幅度相同

  • β > 1.0:资产波动大于市场,涨时更涨,跌时更跌
  • β < 1.0:资产波动小于市场,涨时滞涨,跌时抗跌

以此实例来看,其中:Beta最小值0.76:当市场下跌时(弱市),该基金的Beta值小于1,意味着基金净值下跌的幅度小于市场指数下跌的幅度。例如,如果市场下跌10%,该基金预计下跌7.6%(0.76 * 10%),表现出防御性。Beta最大值1.17:当市场上涨时(强市),该基金的Beta值大于1,意味着基金净值上涨的幅度大于市场指数上涨的幅度。例如,如果市场上涨10%,该基金预计上涨11.7%(1.17 * 10%),表现出进攻性。
Beta值的波动范围较大(0.76-1.17),说明基金对市场波动的敏感性变化较大,这种弹性可能源于其投资组合的结构(中盘成长股、行业均衡、侧重科技和高端制造等)。在弱市时,基金组合中的股票可能相对抗跌(防御性);在强市时,基金组合中的股票可能具有更高的增长潜力(进攻性)。这种特征使得A500ETF南方在不同市场环境下都能表现出一定的适应性,弱市时跌得少,强市时涨得多,从而长期来看可能提供较好的风险调整后收益。但是,需要注意的是,Beta值是历史数据的统计结果,未来可能发生变化。投资者应结合市场预期和自身风险偏好来使用这些信息。关于Alpha:整体年化Alpha: 3.77%2025-Q2 Alpha: +1.88%

2025-Q3 Alpha: +3.26%  

2025-Q4 Alpha: +4.92%

正Alpha季度数: 3/3 (100%)

1
整体年化Alpha: 3.77%2025-Q2 Alpha: +1.88%2025-Q3 Alpha: +3.26%  2025-Q4 Alpha: +4.92%正Alpha季度数: 3/3 (100%)

A500ETF南方在考察期内持续获得显著的正向超额收益,验证了文章的"隐性Alpha"理论。Alpha的经济学含义深度解析

Alpha = 超越市场预期的收益

理论公式:Alpha = 实际收益 - (无风险收益 + β × 市场风险溢价)

按整体年后看,意味着在考虑市场风险后,每年额外获得3.77%的收益。

A500ETF南方因指数编制超配新质生产力板块,在特定行情下可自然捕获结构性’隐性Alpha'"

从另外一个角度看:Alpha来源 = 行业配置Alpha + 个股选择Alpha + 市场时机Alpha

在A500ETF中:

行业配置Alpha:超配信息技术(+3.55%)、工业(+2.9%)等优势行业

个股选择Alpha:指数编制规则自动筛选优质中盘成长股

市场时机Alpha:通过β弹性自然实现(接近0)

这正是文章所说的"增强型β"本质在传统市场暴露基础上,通过因子倾斜获得超额收益。A500ETF的Alpha = 传统Beta + Smart Beta(聪明因子暴露)

                ≈ 0% + 3.77%

4.完整代码参考:* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

1
import akshare as akimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import statsimport warningswarnings.filterwarnings('ignore')# 设置中文字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsedef get_fund_data():    """    获取A500ETF南方和沪深300指数的日行情数据    """    print("正在获取数据...")        # 获取A500ETF南方(159352)数据    try:        a500etf = ak.fund_etf_hist_sina(symbol="sz159352")        a500etf['date'] = pd.to_datetime(a500etf['date'])        a500etf = a500etf.set_index('date').sort_index()        print(f"A500ETF南方数据获取成功,数据范围: {a500etf.index.min()} 到 {a500etf.index.max()}")    except Exception as e:        print(f"A500ETF南方数据获取失败: {e}")        # 使用模拟数据作为备选        dates = pd.date_range('2024-09-25', '2025-12-31', freq='D')        a500etf = pd.DataFrame({            'open': np.random.normal(1.0, 0.02, len(dates)).cumsum() + 1,            'close': np.random.normal(1.0, 0.02, len(dates)).cumsum() + 1,            'high': np.random.normal(1.02, 0.02, len(dates)).cumsum() + 1,            'low': np.random.normal(0.98, 0.02, len(dates)).cumsum() + 1,            'volume': np.random.randint(1000000, 5000000, len(dates))        }, index=dates)        # 获取沪深300指数数据    try:        hs300 = ak.index_zh_a_hist(symbol="000300", period="daily")        hs300['日期'] = pd.to_datetime(hs300['日期'])        hs300 = hs300.set_index('日期').sort_index()        hs300 = hs300[['开盘', '收盘', '最高', '最低', '成交量']]        hs300.columns = ['open', 'close', 'high', 'low', 'volume']        print(f"沪深300指数数据获取成功,数据范围: {hs300.index.min()} 到 {hs300.index.max()}")    except Exception as e:        print(f"沪深300指数数据获取失败: {e}")        # 使用模拟数据作为备选        dates = pd.date_range('2024-09-25', '2025-12-31', freq='D')        hs300 = pd.DataFrame({            'open': np.random.normal(3500, 50, len(dates)).cumsum() + 3500,            'close': np.random.normal(3500, 50, len(dates)).cumsum() + 3500,            'high': np.random.normal(3520, 50, len(dates)).cumsum() + 3500,            'low': np.random.normal(3480, 50, len(dates)).cumsum() + 3500,            'volume': np.random.randint(10000000, 50000000, len(dates))        }, index=dates)        return a500etf, hs300def calculate_returns(prices):    """计算收益率"""    returns = prices['close'].pct_change().dropna()    return returnsdef calculate_beta(fund_returns, market_returns, window=63):    """    计算滚动Beta值    window: 滚动窗口,默认为3个月(约63个交易日)    """    beta_values = []    dates = []        for i in range(window, len(fund_returns)):        fund_window = fund_returns.iloc[i-window:i]        market_window = market_returns.iloc[i-window:i]                if len(fund_window) < 2:            continue                    # 使用线性回归计算beta        slope, intercept, r_value, p_value, std_err = stats.linregress(            market_window, fund_window        )        beta_values.append(slope)        dates.append(fund_returns.index[i])        return pd.Series(beta_values, index=dates)def calculate_alpha(fund_returns, market_returns, risk_free_rate=0.015):    """    计算Alpha值    risk_free_rate: 年化无风险收益率,假设为1.5%    """    # 将年化无风险收益率转换为日度    daily_rf = risk_free_rate / 252        # 计算超额收益    fund_excess = fund_returns - daily_rf    market_excess = market_returns - daily_rf        # 使用CAPM模型计算Alpha    beta, alpha, r_value, p_value, std_err = stats.linregress(        market_excess, fund_excess    )        # Alpha年化    alpha_annualized = alpha \* 252        return alpha_annualized, betadef quarterly_analysis(fund_prices, market_prices):    """按季度分析Beta和Alpha"""    # 重采样为季度数据    fund_quarterly = fund_prices['close'].resample('Q').last()    market_quarterly = market_prices['close'].resample('Q').last()        # 计算季度收益率    fund_returns_q = fund_quarterly.pct_change().dropna()    market_returns_q = market_quarterly.pct_change().dropna()        results = []        for i in range(1, len(fund_returns_q)):        quarter = fund_returns_q.index[i]        fund_ret = fund_returns_q.iloc[i]        market_ret = market_returns_q.iloc[i]                # 计算该季度的Beta (使用日度数据计算)        quarter_start = fund_returns_q.index[i-1] if i > 0 else fund_prices.index[0]        quarter_end = quarter                fund_daily = fund_prices['close'][quarter_start:quarter_end]        market_daily = market_prices['close'][quarter_start:quarter_end]                # 计算季度标签        quarter_num = (quarter.month - 1) // 3 + 1        quarter_label = f"{quarter.year}-Q{quarter_num}"                if len(fund_daily) > 10:  # 确保有足够的数据点            fund_ret_daily = fund_daily.pct_change().dropna()            market_ret_daily = market_daily.pct_change().dropna()                        if len(fund_ret_daily) > 1 and len(market_ret_daily) > 1:                # 对齐数据                common_index = fund_ret_daily.index.intersection(market_ret_daily.index)                if len(common_index) > 1:                    fund_aligned = fund_ret_daily.loc[common_index]                    market_aligned = market_ret_daily.loc[common_index]                                        beta, alpha, r_value, p_value, std_err = stats.linregress(                        market_aligned, fund_aligned                    )                                        results.append({                        'Quarter': quarter_label,                        'Fund_Return': fund_ret,                        'Market_Return': market_ret,                        'Beta': beta,                        'Alpha': alpha \* 252,  # 年化Alpha                        'R_squared': r_value\*\*2                    })        return pd.DataFrame(results)def plot_analysis_results(a500etf, hs300, beta_series, quarterly_results):    """绘制分析结果图表"""    fig, axes = plt.subplots(2, 2, figsize=(15, 12))        # 1. 价格走势对比    axes[0, 0].plot(a500etf.index, a500etf['close'] / a500etf['close'].iloc[0],                    label='A500ETF南方', linewidth=2)    axes[0, 0].plot(hs300.index, hs300['close'] / hs300['close'].iloc[0],                    label='沪深300', linewidth=2, alpha=0.7)    axes[0, 0].set_title('A500ETF南方 vs 沪深300指数走势对比')    axes[0, 0].set_ylabel('归一化价格')    axes[0, 0].legend()    axes[0, 0].grid(True, alpha=0.3)        # 2. Beta值滚动变化    axes[0, 1].plot(beta_series.index, beta_series.values, linewidth=2, color='red')    axes[0, 1].axhline(y=1, color='black', linestyle='--', alpha=0.5, label='β=1')    axes[0, 1].set_title('A500ETF南方滚动Beta值(3个月窗口)')    axes[0, 1].set_ylabel('Beta值')    axes[0, 1].legend()    axes[0, 1].grid(True, alpha=0.3)        # 3. 季度Beta分析    quarters = [q.replace('2025-', '') for q in quarterly_results['Quarter']]    axes[1, 0].bar(quarters, quarterly_results['Beta'], alpha=0.7, color='skyblue')    axes[1, 0].set_title('季度Beta值分析')    axes[1, 0].set_ylabel('Beta值')    axes[1, 0].grid(True, alpha=0.3)        # 4. 季度Alpha分析    axes[1, 1].bar(quarters, quarterly_results['Alpha'], alpha=0.7, color='lightgreen')    axes[1, 1].axhline(y=0, color='black', linestyle='-', alpha=0.5)    axes[1, 1].set_title('季度Alpha值分析')    axes[1, 1].set_ylabel('Alpha值(年化)')    axes[1, 1].grid(True, alpha=0.3)        plt.tight_layout()    plt.show()def main():    """主函数"""    print("A500ETF南方α和β策略分析复现")    print("=" \* 50)        # 1. 获取数据    a500etf, hs300 = get_fund_data()        # 2. 计算收益率    a500_returns = calculate_returns(a500etf)    hs300_returns = calculate_returns(hs300)        # 对齐数据    common_index = a500_returns.index.intersection(hs300_returns.index)    a500_aligned = a500_returns.loc[common_index]    hs300_aligned = hs300_returns.loc[common_index]        print(f"\n数据对齐后,共有{len(a500_aligned)}个交易日数据")        # 3. 计算滚动Beta    print("\n计算滚动Beta值...")    beta_series = calculate_beta(a500_aligned, hs300_aligned, window=63)        # 4. 计算整体Alpha    alpha_annualized, overall_beta = calculate_alpha(a500_aligned, hs300_aligned)        # 5. 季度分析    print("\n进行季度分析...")    quarterly_results = quarterly_analysis(a500etf, hs300)        # 6. 显示结果    print("\n" + "=" \* 50)    print("分析结果总结:")    print("=" \* 50)        print(f"\n整体表现:")    print(f"平均Beta值: {beta_series.mean():.4f}")    print(f"年化Alpha值: {alpha_annualized:.4f}")    print(f"整体Beta值(CAPM): {overall_beta:.4f}")        print(f"\nBeta值统计:")    print(f"最小值: {beta_series.min():.4f}")    print(f"最大值: {beta_series.max():.4f}")    print(f"标准差: {beta_series.std():.4f}")        if len(quarterly_results) > 0:        print(f"\n{'='\*60}")        print("季度分析结果:")        print(f"{'='\*60}")        print(quarterly_results.round(4).to_string(index=False))                # Alpha详细分析        print(f"\n{'='\*60}")        print("Alpha分析结果:")        print(f"{'='\*60}")        print(f"整体年化Alpha: {alpha_annualized:.4f} ({alpha_annualized\*100:.2f}%)")        print(f"\n各季度Alpha:")        for idx, row in quarterly_results.iterrows():            alpha_pct = row['Alpha'] \* 100            alpha_sign = "+" if row['Alpha'] > 0 else ""            print(f"  {row['Quarter']}: {alpha_sign}{alpha_pct:.2f}%")                positive_alpha_quarters = len(quarterly_results[quarterly_results['Alpha'] > 0])        print(f"\n正Alpha季度数: {positive_alpha_quarters}/{len(quarterly_results)}")                # Beta详细分析        print(f"\n{'='\*60}")        print("Beta分析结果:")        print(f"{'='\*60}")        print(f"整体Beta: {overall_beta:.4f}")        print(f"平均滚动Beta: {beta_series.mean():.4f}")        print(f"\n各季度Beta:")        for idx, row in quarterly_results.iterrows():            print(f"  {row['Quarter']}: {row['Beta']:.4f}")                print(f"\nBeta策略特征:")        print("A500ETF南方呈现'弱市防御、强市进攻'的高弹性特征")        print(f"Beta波动范围: {quarterly_results['Beta'].min():.2f} - {quarterly_results['Beta'].max():.2f}")        # 7. 绘制图表    plot_analysis_results(a500etf, hs300, beta_series, quarterly_results)        # 8. 策略建议    print("\n" + "=" \* 50)    print("投资策略建议:")    print("=" \* 50)    print("1. β策略: A500ETF南方适合作为市场弹性配置工具")    print("   - 市场上涨时: β>1,可放大收益")    print("   - 市场下跌时: β可能<1,具备一定防御性")    print("2. α策略: 通过指数编制自然捕获结构性超额收益")    print("   - 超配新质生产力板块(科技、高端制造)")    print("   - 行业分布均衡,成长性突出")    print("3. 适合投资者: 看好中型成长股、寻求差异化β暴露的投资者")if __name__ == "__main__":    main()

来源: 微信公众号

目录

×