fed800 指标计算
指数市盈率
看到兴证全球有一个 FED800 来表示股票的投资信号,其计算方式是利用中证800的市盈率计算,公式如下:
\[ FED800 = \frac {1} {\mbox{中证 800}} - \mbox{十年国债收益率} \]
翻看了一下说明文档,可以使用 2 个方案获取对应的市盈率。
import akshare as ak
index_value_hist_funddb_df = ak.index_value_hist_funddb(symbol="中证800", indicator="市盈率")
stock_index_pe_lg_df = ak.stock_index_pe_lg(symbol="中证800")
print(stock_index_pe_lg_df.tail(5))
print(index_value_hist_funddb_df.tail(5))
日期 指数 等权静态市盈率 静态市盈率 静态市盈率中位数 等权滚动市盈率 滚动市盈率 滚动市盈率中位数
4110 2023-12-08 3754.15 33.04 11.10 22.20 31.69 11.13 21.87
4111 2023-12-11 3782.67 34.19 11.12 23.02 32.97 11.18 22.04
4112 2023-12-12 3788.81 33.81 11.17 23.06 32.94 11.22 22.03
4113 2023-12-13 3731.96 34.10 11.01 22.79 32.54 11.07 21.63
4114 2023-12-14 3714.41 33.98 10.97 22.70 32.42 11.02 21.59
日期 平均值 市盈率 最低30 最低10 最高30 最高10
3869 2023-12-08 15.64 12.00 12.00 NaN NaN NaN
3870 2023-12-11 15.64 12.06 12.06 NaN NaN NaN
3871 2023-12-12 15.64 12.10 12.10 NaN NaN NaN
3872 2023-12-13 15.64 11.94 11.94 NaN NaN NaN
3873 2023-12-14 15.64 11.89 11.89 NaN NaN NaN
可以看到, index_value_hist_funddb()
方法能获取的数据更全面,而且除了市盈率之外,还可以选择市净率、股息率、风险溢价,更为全面。
十年国债
Akshare 作为一个比较全面的金融信息库,除了股票、基金的信息外,还有一些其他金融数据可以查询,比如在 FED 计算中,需要的中国国债十年收益率。
import akshare as ak
bond_zh_us_rate_df = ak.bond_zh_us_rate(start_date="20060104")
bond_zh_us_rate_df[['日期','中国国债收益率10年','美国国债收益率10年']]
print(bond_zh_us_rate_df.tail(5))
日期 中国国债收益率2年 中国国债收益率5年 ... 美国国债收益率30年 美国国债收益率10年-2年 美国GDP年增率
4778 2023-12-08 2.4375 2.5570 ... 4.31 -0.48 NaN
4779 2023-12-11 2.4350 2.5427 ... 4.32 -0.48 NaN
4780 2023-12-12 2.4359 2.5342 ... 4.30 -0.53 NaN
4781 2023-12-13 2.3905 2.5136 ... 4.19 -0.42 NaN
4782 2023-12-14 NaN 2.5188 ... 4.03 NaN NaN
[5 rows x 13 columns]
恩,这样除了中国的,美国国债的数据也能获取到了。
FED800 计算
现在十年国债和市盈率都已经有了,可以用来计算 FED 值。
import pandas as pd
import akshare as ak
data1 = ak.bond_zh_us_rate(start_date="20060104")
data2 = ak.stock_index_pe_lg(symbol="中证800")
data1['日期']=pd.to_datetime(data1['日期'])
data2['日期']=pd.to_datetime(data2['日期'])
data1 = data1[['日期','中国国债收益率10年']]
data2 = data2[['日期','滚动市盈率']]
data = pd.merge(data1, data2, on='日期', how='inner')
data['FED'] = 1/ data['滚动市盈率'] - data['中国国债收益率10年']
print(data.tail(5))
日期 中国国债收益率10年 滚动市盈率 FED
4110 2023-12-08 2.6636 11.13 -2.573753
4111 2023-12-11 2.6440 11.18 -2.554555
4112 2023-12-12 2.6375 11.22 -2.548373
4113 2023-12-13 2.6226 11.07 -2.532266
4114 2023-12-14 2.6376 11.02 -2.546856
已经计算出来了,但是感觉和兴证给的结果不太一样,重新阅读了一下说明,是计算当前的值占整个序列的百分比的位置,可以利用 percentileofscore 方法来计算,先引入包。
from scipy.stats import percentileofscore
然后再进行位置计算。
import pandas as pd
import akshare as ak
from scipy.stats import percentileofscore
data1 = ak.bond_zh_us_rate(start_date="20060104")
data2 = ak.stock_index_pe_lg(symbol="中证800")
data1['日期']=pd.to_datetime(data1['日期'])
data2['日期']=pd.to_datetime(data2['日期'])
data1 = data1[['日期','中国国债收益率10年']]
data2 = data2[['日期','滚动市盈率']]
data = pd.merge(data1, data2, on='日期', how='inner')
data['FED'] = 1/ data['滚动市盈率'] - data['中国国债收益率10年']
data['fed_perc']=percentileofscore(data['FED'],data['FED'])
print(data.tail(5))
日期 中国国债收益率10年 滚动市盈率 FED fed_perc
4110 2023-12-08 2.6636 11.13 -2.573753 96.695018
4111 2023-12-11 2.6440 11.18 -2.554555 97.739976
4112 2023-12-12 2.6375 11.22 -2.548373 98.055893
4113 2023-12-13 2.6226 11.07 -2.532266 98.590522
4114 2023-12-14 2.6376 11.02 -2.546856 98.104496
整个方案就已经计算出来了,但是看起来和兴证的结果有出入,主要是因为市盈率本身的数据就没有特别准备的信息,各个平台提供的值都不太一样,不过做了位置计算后,大概趋势能看出来。可以作为一个动量指标来看结果。
后面做一个算法的回测。