ROE选股策略

用户头像sh_***388rgt
2025-11-02 发布

ROE,即Rate of Return on Common Stockholders' Equity,中文名称为:净资产收益率,又称股东权益报酬率、净值报酬率、权益报酬率、权益利润率、净资产利润率,是衡量上市公司盈利能力的重要指标。ROE是指利润额与净资产的比值,公式为: 净利润/净资产。这里,净资产=总资产-负债。该指标越高,说明投资带来的收益越高;净资产利润率越低,说明企业所有者权益的获利能力越弱。

在《巴菲特致股东的信》中,巴菲特表达了一个想法,衡量一个公司是否优秀,如果只用一个财务指标,那就是净资产收益率(ROE),如果一个公司长期的ROE保持15%以上,基本上可以算作一个好公司。可想而知,ROE这个指标是个非常重要的指标。

接下来,我通过python调用baostock里季频杜邦指数的“dupontROE”数据寻找ROE较高且长期稳定的证券作为投资目标。具体代码如下:


import baostock as bs
import pandas as pd


def computeROE(code, year, quarter):

    # 查询杜邦指数
    dupont_list = []
    rs_dupont = bs.query_dupont_data(code, year, quarter)
    while (rs_dupont.error_code == '0') & rs_dupont.next():
        dupont_list.append(rs_dupont.get_row_data())
    result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields)
    # 打印输出
    return result_profit


def compute_total_ROE():

    # 登陆系统
    lg = bs.login()
    # 显示登陆返回信息
    print('login respond error_code:' + lg.error_code)
    print('login respond  error_msg:' + lg.error_msg)

    # 获取全部证券基本资料
    rs = bs.query_stock_basic()
    # rs = bs.query_stock_basic(code_name="浦发银行")  # 支持模糊查询
    print('query_stock_basic respond error_code:' + rs.error_code)
    print('query_stock_basic respond  error_msg:' + rs.error_msg)

    result_profit = pd.DataFrame()

    while (rs.error_code == '0') & rs.next():
        # 获取一条记录,将记录合并在一起
        code = rs.get_row_data()[0]
        for year in range(2022, 2025):
            df = computeROE(code, year, 4)
            if df.empty:
                continue
            else:
                if result_profit.empty:
                    result_profit = df
                else:
                    result_profit = result_profit.append(df)
    # 原始数据存储
    result_profit.to_csv("D:\\dupont_data_row.csv",
                         encoding="gbk", index=False)
    # 筛选有用数据
    result = result_profit[['code', 'dupontROE']]
    result = result[result['dupontROE'] != '']
    result['dupontROE'] = result['dupontROE'].astype(float)
    series_mean = result.groupby(by=['code'])['dupontROE'].mean()
    series_std = result.groupby(by=['code'])['dupontROE'].std()
    df2 = pd.DataFrame({'mean': series_mean, 'std': series_std},
                       columns=['mean', 'std'], index=series_mean.index)
    df2 = df2.sort_values(['mean'])
    df2.to_csv("D:\\dupont_data_sorted_by_roe.csv", encoding="gbk", index=True)

    # 登出系统
    bs.logout()


if __name__ == '__main__':
    compute_total_ROE()

在文件“dupont_data_row.csv”存放所有下载的原始数据,具体见下图:

b5707d7270be51c1e7c81768ff49cf52.png

在文件“dupont_data_sorted_by_roe.csv”中存放按照ROE从小到大排序后的证券代码,ROE均值(‘mean’)和ROE的波动率(‘std’)。具体见下图:

471caad53442782975c17f46ae038c9f.png

简单地来说,我们只要在ROE在15%-25%之间的证券中选择波动率较小的部分证券作为长期投资的标的物。为何不是ROE很大的证券呢?首先,连老巴都觉得ROE为15%的公司就相当不错了,这可是人家几十年的总结。那么,我觉的ROE的标准没有问题。其次,超过25%的ROE公司,其股票价格一般不便宜,会被高估。最后,还有一部证券ROE特别大的证券,他们的财务水分到底有多少?那就只能“呵呵呵”。

评论