净资产收益率(ROE)是投资过程中一个非常要得指标,它也叫做股东回报率,是净利润和净资产的比值,如果比值越高说明投资回报越好,所以在选择相应指数进行投资的过程中,我们尽量选择ROE高的品种。
下面举个简单的小例子来介绍下到底净资产收益率是怎么一回事。
小明开了一家面包店,面包店的总资产为100万,同时他的面包店ROE是15%。
在持续经营的过程中,同时不考虑分红的情况下,第二年总资产就变成了115万,每年的ROE都维持不变,五年后总资产翻倍变成200万(100万的(1+15%)次方)。
大家在这里可能已经看出,如果ROE越高,随着时间的推移,投资的回报会越高。当然这里只是一个非常简单的场景,没有考虑盈利变化、估值影响、分红等情况,实际的过程会更复杂,但大家可以简单的认为ROE只要在合理范围以内,其值越高越好,同时如果一家公司或者指数能长期保持稳定和较高值的话,就非常值得投资。巴菲特在投资过程中也非常的看重ROE这个指标。
下面先给出几个指数品种的ROE情况。
沪深300
中证医药
中证白酒
从上面可以很清晰的看出,股价的涨势是:中证白酒>中证医药>沪深300,而对应的ROE也是:中证白酒>中证医药>沪深300,所以在投资过程中我们尽量选择ROE高的品种进行投资。
最后就来看看怎么计算指数的净资产收益率
ROE=净利润/净资产,由于baostock提供的数据中没有直接能获得净资产的选项,所以需要通过市净率进行计算,市净率=总市值/总净资产=股价/净资产,所以净资产=股价/市净率,从而得到:
ROE=净利润/(股价/市净率)
下面是具体的代码实现过程:
import pandas as pd
import math
indexType =['./importfile/indexSeries/indexTpye/hs300.csv', #沪深300 - 0
'./importfile/indexSeries/indexTpye/zz500.csv', #中证500 - 1
'./importfile/indexSeries/indexTpye/zz100.csv', #中证100 - 2
'./importfile/indexSeries/indexTpye/shz50.csv', #上证50 - 3
'./importfile/indexSeries/indexTpye/hsyy300.csv', #沪深医药300 - 4
'./importfile/indexSeries/indexTpye/zzyh.csv', #中证银行 -5
'./importfile/indexSeries/indexTpye/zzxf.csv', #中证消费 -6
'./importfile/indexSeries/indexTpye/zzbj.csv', #中证白酒 -7
'./importfile/indexSeries/indexTpye/db500.csv', # 500低波动-8
'./importfile/indexSeries/indexTpye/jz300.csv', # 300价值 -9
'./importfile/indexSeries/indexTpye/yy100.csv', #医药100 -10
'./importfile/indexSeries/indexTpye/zzyyao.csv', #中证医药 -11
'./importfile/indexSeries/indexTpye/jbm50.csv', #基本面50 -12
'./importfile/indexSeries/indexTpye/shzhl.csv', #上证红利 -13
'./importfile/indexSeries/indexTpye/zzhl.csv', #中证红利 -14
'./importfile/indexSeries/indexTpye/zzjg.csv', #中证军工 -15
'./importfile/indexSeries/indexTpye/spyl.csv', #食品饮料 -16
'./importfile/indexSeries/indexTpye/zqgs.csv', #证券公司 -17
'./importfile/indexSeries/indexTpye/ylcy.csv', #养老产业 -18
'./importfile/indexSeries/indexTpye/szhl.csv', #深证红利 -19
'./importfile/indexSeries/indexTpye/zzhb.csv', #中证环保 -20
'./importfile/indexSeries/indexTpye/cyb.csv'] #创业板 -21
# 各指数的个股信息
idx = -1
total_share = 1
for indexCnt in range(len(indexType)):
total_profit_sum = 0
total_asset_sum = 0
total_total_sum = 0
csv_data = pd.read_csv(indexType[indexCnt])
for i in range(csv_data.shape[0]):
if csv_data.values[i][4] >= 600000:
stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sh.' + str(csv_data.values[i][4]) +'.csv')
stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')
elif csv_data.values[i][4] >= 300000:
stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sz.' + str(csv_data.values[i][4]) +'.csv')
stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +str(csv_data.values[i][4]) + '.csv')
else:
len_name = len(str(csv_data.values[i][4]))
if len_name == 1:
stock_code = '00000' +str(csv_data.values[i][4])
elif len_name == 2:
stock_code = '0000' +str(csv_data.values[i][4])
elif len_name == 3:
stock_code = '000' +str(csv_data.values[i][4])
elif len_name == 4:
stock_code = '00' +str(csv_data.values[i][4])
elif len_name == 5:
stock_code = '0' +str(csv_data.values[i][4])
elif len_name == 6:
stock_code =str(csv_data.values[i][4])
else:
stock_code = ''
stock_info_prc = pd.read_csv('C:/Program Files(x86)/Python/prjs/exportfile/stockDataAll/sz.' + stock_code + '.csv')
stock_info_epsTTM = pd.read_csv('./exportfile/stockDataProfit/' +stock_code + '.csv')
stock_single_price = stock_info_prc['close']
stock_single_pe = stock_info_prc['peTTM']
stock_single_pb = stock_info_prc['pbMRQ']
stock_single_eps = stock_info_epsTTM['epsTTM']
stock_single_total = stock_info_epsTTM['liqaShare']
# 解析个股的市净率、股价等信息
stock_single_total_tmp = stock_single_total.values[-1]
if math.isnan(stock_single_total_tmp):
stock_single_total_tmp = stock_single_total.values[-2]
stock_single_profit = stock_single_eps.values[-1] *stock_single_total_tmp
stock_single_asset = stock_single_total_tmp *stock_single_price.values[idx] / stock_single_pb.values[idx]
if stock_single_pe.values[idx] < 0 or stock_single_pb.values[idx]< 0 or stock_single_eps.values[-1] < 0 or stock_single_pe.values[idx]> 500:
weight_sum = 0
else:
weight_sum = 1 / csv_data.shape[0]
# 如果个股估值失真(处于亏损),就不进行该个股数据计算
total_profit_sum = weight_sum * stock_single_profit + total_profit_sum
total_asset_sum = weight_sum * stock_single_asset + total_asset_sum
total_total_sum = weight_sum * stock_single_total_tmp *stock_single_price.values[idx] + total_total_sum
calc_roe = str(total_profit_sum / total_asset_sum)
# 通过公式计算指数ROE
print('index name : ' +csv_data.values[0][2])
print('weight_sum ROE : ' + calc_roe)
print('----------------')
代码中使用到的个股数据大家可以参看《基于Python的指数基金量化投资 - 股票数据源baostock》。
课程参考:网易云课堂 基于Python的量化指数基金投资