BigQuant使用文档

152-Buffet策略

由qxiao创建,最终由qxiao 被浏览 76 用户

策略介绍

巴菲特(Warren Buffett)的投资理念以“价值投资”为核心,强调长期持有优质公司股票,通过复利增长实现财富积累。本策略主要关注公司的账面价值、估值和盈利质量,以确保投资组合具备长期稳定的回报。

策略概述

本策略基于三个主要财务因子构建评分体系,分别是账面价值(Book Value)、估值(Valuation)和盈利质量(Earnings Quality)。通过这些因子,筛选出财务状况良好、估值合理、盈利能力强的公司,构建投资组合。

因子介绍

1. 账面价值(Book Value)

  • 因子:5年净资产增长率
  • 定义: 衡量公司净资产的长期增长情况,反映企业的长期资本积累能力。
  • 计算方式: 过去五年公司净资产增长率。
  • sql提取
SELECT date, instrument, report_date, shift, total_equity_to_parent_shareholders_ly
FROM cn_stock_financial_ly_shift
WHERE shift IN (0, 1, 2, 3, 4)
ORDER BY date,instrument,report_date
  • 计算因子
def cal_factor(x):
    # 数据长度不够,就返回一个缺失值 
    if len(x) < 5:
        x['factor'] = np.nan
        return  x

    try:
        end_value = x[x['shift'] ==4].total_equity_to_parent_shareholders_ly.values[0]
        start_value = x[x['shift'] ==0].total_equity_to_parent_shareholders_ly.values[0]
        x['factor'] = (end_value/start_value) ** (1/len(x)) - 1 
        return x
    except:
        x['factor'] = np.nan
        return np.nan 
  • 行业中性化

    def ind_median(x):
        x['ind_factor_median'] = x['factor'].median()
        return x
    
    roe_df = ffill_merge_df.groupby(['date','sw2021_level2'], as_index=False, group_keys=False).apply(ind_median) 
    roe_df['adj_factor'] = np.where(roe_df['factor'].isnull(), roe_df['ind_factor_median'], roe_df['factor'])
    roe_df = roe_df.rename(columns={'adj_factor':'roe'})
    roe_df = roe_df[['date','instrument','roe']]
    

2. 估值(Valuation)

  • 因子1:市净率(PB Ratio)
    • 衡量股价相对于账面净资产的比率,数值较低说明市场对资产定价较保守。
  • 因子2:市盈率(P/E Ratio)
    • 衡量股价相对于每股收益的比率,数值较低说明市场可能低估企业盈利能力。
  • 因子3:市销率(Price-to-Sales Ratio, P/S Ratio)\n衡量股价相对于每股营业收入的比率,数值较低说明市场对企业的营收能力定价较低。
  • 因子4:市现率(Price-to-Cash Ratio)\n衡量股价相对于每股现金及现金等价物的比率,数值较低说明企业现金储备充足,估值可能较低。

3. 盈利质量(Earnings Quality)

  • 因子1:每股收益稳定性(EPS Stability)
    • 通过过去16个季度每股收益的标准差衡量,数值越低说明盈利越稳定。

    • sql数据提取如下:

      SELECT date, instrument, report_date, shift, eps_basic_lf FROM cn_stock_financial_lf_shift
      WHERE shift IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 , 12, 13, 14, 15)
      -- and instrument in ('000002.SZ','000333.SZ')
      
      ORDER BY date,instrument,report_date
      
    • 标准化因子

      def cal_factor(x):  
          if len(x) < 16:
              x['factor'] = np.nan
              return  x
      
          try:
              x['factor']  = x['eps_basic_lf'].std()
              return x
          except:
              x['factor'] = np.nan
              return x
      
    • 行业中性化:

      • 用sql提取:

        select date, instrument, sw2021_level2 from cn_stock_prefactors
        
      • 行业中性化

        def ind_median(x):
            x['ind_factor_median'] = x['factor'].median()
            return x
        
        eps_df = ffill_merge_df.groupby(['date','sw2021_level2'], as_index=False, group_keys=False).apply(ind_median) 
        eps_df['adj_factor'] = np.where(eps_df['factor'].isnull(), eps_df['ind_factor_median'], eps_df['factor'])
        
  • 因子2:收入报表清洁度(Cleanliness of Income Statement)
    • 计算方式:过去四年的主营业务收入 - 过去四年的营业利润,数值越低说明收入质量越高。

    • sql数据提取如下:

      SELECT date, instrument, report_date, shift, total_operating_revenue_ly , net_profit_ly
      FROM cn_stock_financial_ly_shift
      WHERE shift IN (0, 1, 2, 3)
      ORDER BY date,instrument,report_date
      
    • 计算因子:

      def cal_factor(x):  
          if len(x) < 4:
              x['factor'] = np.nan
              return  x
          try:
              x['factor'] = x['total_operating_revenue_ly'].apply(lambda x:np.nansum(x)) - x['net_profit_ly'].apply(lambda x:np.nansum(x)) 
              return x 
          except:
              x['factor'] = np.nan
              return np.nan 
      

4. 因子标准化和因子合成

  • 因子标准化
sql = """ 
select date, instrument, 
c_normalize(pe) as pe ,
c_normalize(ps) as ps ,
c_normalize(pb) as pb ,
c_normalize(pcf) as pcf ,
c_normalize(roe) as roe ,
c_normalize(eps) as eps ,
c_normalize(cla) as cla ,
from merge_df6 
order by date, instrument
  • 因子合成

    roe*0.33 + eps*0.33*0.5 + cla*0.33*0.5 + pe*0.33*0.25+ pb*0.33*0.25+ ps*0.33*0.25+ pcf*0.33*0.25
    

策略流程-BigTrader模块

1. 股票池筛选

  • 筛选条件: 仅限沪深主板、创业板、新三板股票,剔除ST股。

2. 排序与选股

  • 评分计算方式: 按照score上升排序

  • 排名规则: 按得分降序排列,选择前10只股票,等权持仓。

    count_num = 10
    filtered_df = today_df.sort_values(by='score', ascending=False).head(count_num)
    

3. 调仓与回测

  • 调仓周期: 每月1号进行调整。
  • 回测时间: 2005.01.01 至 2024.12.31。
  • 初始资金: 1,000,000元。

交易成本: 0.03%(最低5元)。

源代码

buffet策略

https://bigquant.com/codesharev3/f78c0706-2ce8-4d56-98ad-5f658b9fca41

\

标签

价值投资投资策略
{link}