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
\