各类ETF跟踪指数的数据统计分析

由于ETF基金实际上是跟踪对应指数的,因此ETF基金的收益是受指数的变动情况影响的。根据美国市场的统计结果,指数短期的涨跌是很难预测的,但是长期向上的趋势是被反复验证过的。这篇文章主要做一下各类指数的数据统计,看看结果是否符合这一规律。

一、指数年涨幅统计

这里针对主要关注的ETF基金对应的指数,做一下长期数据的对比,看一下到底哪些宽基指数和行业指数更具有投资价值。

指数日K数据的获取方式如下:

df = ak.stock_zh_index_daily_em(symbol=code)

指数每年的涨幅计算公式如下:

年涨幅=指数每年最后一个交易日的收盘价/每年第一个交易日的收盘价-1

其中近三年、五年、十年的涨幅为近三年、五年、十年年涨幅的算术平均值。下表是对各类指数近十年来的年平均涨幅统计的数据。

从表中可以看出,由于近一年股市处于慢慢阴跌的熊市,所有指数今年来的涨幅均为负值。近三年平均涨幅仍然有38.9%的指数处于负值,近五年平均涨幅则只有16.7%的指数仍为负值。近十年除了银行和证券的平均涨幅为负值外,其余均转正了。从涨幅的整体分布上来说,短期投资亏损的概率很大程度上依赖于入场点指数与当前指数所处相对位置,但长期来说,赚钱的概率还是更大一些。当然,如果你一定要在6000点之上满仓,那现在大概率也还是亏损的。

总体来说,消费、食品饮料、酒等行业指数的平均涨幅较高;医药、信息、军工等行业指数的表现也不错。大盘指数和小盘指数的总体表现一般,但与美国股市的长期收益统计结果基本上是一致的。创业板的平均涨幅较高(这个结果是我没有料到的,等有时间分析看看是什么原因导致的),同样其标准差也最高,说明涨跌波动程度也是最大的。

注意:由于没有对获得的数据进行校验和清洗,因此数据大概率是存在错漏的,所得结论请大家谨慎参考,不建议直接作为投资依据。

统计采用的代码如下:

import akshare as ak
import matplotlib.pyplot as plt
import pandas as pd


# 指数日K数据
name_list = ['沪深300', '中证500', '中证1000', '上证50', '创业板', '中证消费', '上证消费', '深证红利', '上证红利',
             '300医药', '中证医疗', '证券公司', '中证银行', '中证酒', '食品饮料', '有色金属', '全指信息', '军工']

code_list = ['sh000300', 'sh000905', 'sh000852', 'sh000016', 'sz399006', 'sh000932', 'sh000036', 'sz399324', 'sh000015',
             'sh000913', 'sz399989', 'sz399975', 'sz399986', 'sz399987', 'sh000807', 'sh000819', 'sh000993', 'sz399967']
cll = ['代码', '名称', '近一年', '近三年', '近五年', '近十年', '标准差']
res_all = pd.DataFrame(columns=cll, index=range(len(code_list)))
k = 0
for code in code_list:
    # df = ak.stock_zh_index_daily(symbol=code)
    df = ak.stock_zh_index_daily_em(symbol=code)
    df['date'] = pd.to_datetime(df['date'])
    name = 'close'
    # df.rename(columns={'trade_date': 'date'}, inplace=True)
    # 统计每年收益、总体平均收益
    # s_date = df['date'].iloc[0]
    # s_year = s_date.year
    # e_year = datetime.datetime.today().year
    # yl = range(s_year, e_year, 1)
    # df[df['date'] == s_year]
    df_start = df.groupby(df['date'].apply(lambda x: x.year)).first()  # 每年第一个交易日
    df_end = df.groupby(df['date'].apply(lambda x: x.year)).last()  # 每年最后一个交易日
    df_rng = df.groupby(df['date'].apply(lambda x: x.year)).count()
    df_start.index = range(len(df_start))
    df_end.index = range(len(df_end))
    df_rng.index = range(len(df_rng))
    cl = ['date', 's_close', 'e_close', 'change', 'chg_mean', 'chg_std', 'year_rtn', 'rtn_mean', 'rtn_std']
    res = pd.DataFrame(columns=cl, index=range(len(df_start)))
    for i in range(len(df_start)):
        cyear = df_start.loc[i, 'date']
        res.loc[i, 'date'] = cyear.year
        res.loc[i, 's_close'] = df_start.loc[i, name]
        res.loc[i, 'e_close'] = df_end.loc[i, name]
        res.loc[i, 'change'] = df_end.loc[i, name] / df_start.loc[i, name] - 1
        res.loc[i, 'chg_mean'] = res['change'].mean()  # 平均涨幅
        res.loc[i, 'chg_std'] = res['change'].std()  # 平均涨幅标准差
        # 年化收益=(结束年指数-开始年指数)^(1/年数)
        res.loc[i, 'year_rtn'] = (df_end.loc[i, name] / df_start.loc[i, name]) ** (df_rng.loc[i, name] / 365) - 1
        res.loc[i, 'rtn_mean'] = res['year_rtn'].mean()  # 年化收益均值
        res.loc[i, 'rtn_std'] = res['year_rtn'].std()
    # 计算近一年、三年、五年和10年的涨幅
    res_all.loc[k, '代码'] = code[2:8]
    res_all.loc[k, '名称'] = name_list[k]
    res_all.loc[k, '近一年'] = res['change'].iloc[-1]
    res_all.loc[k, '近三年'] = res['change'].tail(3).mean()
    res_all.loc[k, '近五年'] = res['change'].tail(5).mean()
    res_all.loc[k, '近十年'] = res['change'].tail(10).mean()
    res_all.loc[k, '标准差'] = res['change'].tail(10).std()
    k = k + 1
    res.to_csv(code+'收益统计.csv', index=False, mode='w', encoding='gbk')
    print(code)
res_all.to_excel('涨跌统计.xlsx', index=False)
print('计算完成!')
二、指数PE分布统计

这个图是对2017年11月24日~2022年11月23日沪深300指数每个交易日的PE-TTM与均值的偏离程度进行的分布统计。

PE-TTM获取方式如下:

df = ak.stock_a_pe_and_pb(symbol='000300.SH')

大家可能会问为什么是这个时间段,因为通过AKShare的stock_a_pe_and_pb()获得的只有这个时间段的数据。本来是想找到沪深300指数从建立以来的PE-TTM数据,测试了一下AKShare提供的几个函数,发现都只有一段时间的数据,所以就没有再找了。大家如果有更好的数据源请介绍给我用用^-^~~~

另外需要注意的是,免费数据源无法保证数据的完整性和准确性,通常都存在一些数据缺失和错误,需要大家自己想办法去甄别和校正。

大家如果对正态分布熟悉的话,可以看出来这个统计图总体上与标准正态分布比较接近。实际上,采用的数据周期越长,数据分布越接近标准正态分布。由于PE等于价格除以每股收益,如果把所有PE的均值当作内在价值,那么这个正态分布实际上反映了价格围绕价值上下波动的事实。

长期来看,PE在PE均值的正负一个标准差内变化的概率较大,而出现在正负两个标准差以外范围的概率较小。当然这是一个理论上的说法,指数的实际表现以及极端情况出现的时间长度其实是无法预计。我们所能知道的就是当PE出现在负两个标准差以外区域时,意味着指数处于底部,继续跌的概率较小;而PE出现在正两个标准差区域以外时,则意味着大概率处于顶部,继续涨的概率较小。当然,这个只是理论上的概率而已,概率较小不代表不会发生,市场的疯狂往往超出所有人的预计,要不然也不会存在“黑天鹅”了。

作为一个保守的傻瓜投资者,我们只能尽量不去赌那些小概率的事,比如在PE高高在上的时候满仓待涨。芒格说过,如果我知道自己会在哪里死去,我就永远都不去那儿。投资的第一原则是活下来,我们要向大咖学习。

三、结论

其实不想写什么结论,因为怕写错了误导大家☹。以前看到别人的文章或者书里面的一些策略和结论就很兴奋,打算照着立马大干一场。现在的第一反应是看看这个结果是在什么条件下得到的,能不能复现,什么情况和场景下能用(简直就是十万个为什么啊……)。实际上回测做的多了,就会发现大部分时候直觉是不靠谱的,而且普遍适用的结论非常少。很多策略并不是不对,而是有特定的前提条件或者应用环境,对这个前提理解的越深刻,获得好的结果的概率越大。如果对这个问题想不清楚,可能怎么做都是错的。

-----------------------------------

原创不易,请多支持

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值