对于广大的投资者来说,投资指数基金是最简单而有效的选择。而目前一种投资指数的方法就是通过市盈率等指标来计算指数的估值,并通过低估买入,高估卖出的方法投资。
然而tushare只提供了上证50,沪深300,创业板等几个大指数的估值,而一些特定行业的估值,例如中证环保,全指医药等,目前还没有提供。我们可以通过获取股票的估值以及指数的权重来计算指数的市盈率。
首先获取tushare的pro接口
import tushare as ts
pro = ts.pro_api(token = token)
为了防止出现网络连接问题,设置一个函数,如果爬取失败则sleep一段时间后再次爬取
def get_index(ts_code='', trade_date=''):#防止爬取失败,通过函数爬取指数的weightfor _ in range(3):try:index_weight = pro.index_weight(index_code=ts_code, start_date=trade_date, end_date=trade_date)except:time.sleep(1)else:return index_weightdef get_basic(ts_code='', trade_date=''):#防止爬取失败,通过函数爬取个股股票的pefor _ in range(3):try:pe_df = pro.daily_basic(ts_code='', trade_date=trade_date, fields='ts_code,trade_date,pe,pb')except:time.sleep(1)else:return pe_df
之后就可以通过指数pe计算公式
计算当日指数的估值了代码如下:
index_weight = get_index(index_code, trade_date)#获取所有股票的估值
pe_df = get_basic(trade_date = trade_date)
#选取在指数的列表中的股票的估值
merge_df = pd.merge(index_weight, pe_df, left_on='con_code',right_on='ts_code', how = 'inner')total_pe = merge_df.weight.sum() / (merge_df.weight / merge_df.pe).sum()
total_pb = merge_df.weight.sum() / (merge_df.weight / merge_df.pb).sum()
由于tushare的index_weight只会在特定日期返回指数的权重信息,所以我们可以保存上一次获得的index weight信息,并在下次信息出现后将其替换。
其实还有其它的计算指数市盈率的方法,例如成分股市值/成份股净利润等。本方法计算出的数据对比各大基金网上提供的指数估值也有一定的差异,这里只是抛砖引玉,欢迎大家提出更好的计算方法或者交流一下更方便的数据获取渠道。