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

整个方案就已经计算出来了,但是看起来和兴证的结果有出入,主要是因为市盈率本身的数据就没有特别准备的信息,各个平台提供的值都不太一样,不过做了位置计算后,大概趋势能看出来。可以作为一个动量指标来看结果。

后面做一个算法的回测。