•这篇文章参考投资大师本杰明.格雷厄姆企业主投资法,对基本面指标进行了量化。回测开始于2020年1月1日,结束于2023年6 月20日。格雷厄姆企业主投资法年化收益率50.25%,基准年化收益13.32%,最大回撤12.42%,胜率56%,平均每期持股30个。
•这篇文章分成两个部分:
o 本杰明.格雷厄姆企业主投资法介绍
o 结合中国实际国情的策略优化版本
2.本杰明.格雷厄姆企业主投资法介绍
本杰明.格雷厄姆(1894—1976),从事投资大致42 年,主要投资经历为1923至1956 年,主要投资美国股票、债券等。其创办的葛拉汉.纽曼公司在1941 至1960期间,在20 年中累积收益率达到4425%,平均年化收益率为21%。
《聪明的投资者》中格雷厄姆企业主投资策略的原始描述:
第一、 财务状况:流动资产要大于1.5 倍的流动负债,并且对于工业企业,负债要小于1.1 倍的净资产;
第二、 盈利的稳定性:在过去五年总没有出现赤字(原文所说的《股票指南》是标普出版的一份月刊,主要刊登美国上市和未上市公司的财报信息、交易统计和一些深入分析);
第三、 股息记录:有现金分红;
第四、 盈利增长:去年的盈利高于1966 年的盈利;
第五、 股价:不高于1.2 倍的有形资产净值。
3. 基于申万大师系列并结合中国国情下进一步的策略优化版本
策略选股:
A.股票的市盈率大于0,且选取市盈率最低的400只股票
B.股票的市净率大于0且小于1.2,且选取市盈率最低的400只股票
C.企业的流动资产至少是流动负债的1.5 倍
D.企业的总借款不超过净流动资产的1.1 倍
E.企业净利润大于0
F.最近一期现金股利大于0
G.净利润增长率从大到小排序,选取前400只股票
H. 满足于上述7个条件下的前30只股票
交易方式:
按月调仓
止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票
4.回测
#本杰明格雷厄姆企业主投资法
from datetime import timedelta, date
import pandas as pd
def initialize(account):
# set_commission(PerTrade(cost=0.0003, min_trade_cost=5))
# set_slippage(PriceRelatedSlippage())
account.selected = 400
account.n = 30 # 持股数
#调仓频率
account.trade_date = range(1,13,1)
## 按月调用程序
run_monthly(trade,date_rule=-1)
#每月调仓
def trade(account, data):
date = get_datetime()
months = get_datetime().month
if months in account.trade_date:
##获得购买股票列表
PE_list = stocks_PE(account,data)
PB_list = stocks_PB(account,data)
current_ratio_list = stocks_current_ratio(account,data)
Debt_asset_list = stocks_Debt_asset(account,data)
netProfitGrowthrate_list = stocks_netProfitGrowthrate(account,data)
netprofit = stocks_netprofit(account,data)
## 获得满足每种条件的股票池
stock_list = list(set(PE_list)&set(PB_list)&set(current_ratio_list)&set(Debt_asset_list)&set(netProfitGrowthrate_list)&set(netprofit))
log.info(len(stock_list))
## 卖出
if len(account.positions) > 0:
for stock in list(account.positions):
if stock not in stock_list:
order_target(stock, 0)
## 买入
if len(stock_list) > 0:
for stock in stock_list:
if stock not in list(account.positions):
if len(account.positions) < account.n :
number = account.n - len(account.positions)
order_value(stock,account.cash/number)
else:
order_value(stock,account.cash)
else:
pass
#根据市盈率筛选股票列表
def stocks_PE(account,data):
current_date = get_datetime().strftime('%Y%m%d')
PE = get_fundamentals(query(
valuation.symbol,
valuation.pe
).filter(
valuation.pe > 0,
).order_by(
valuation.pe.asc()
).limit(
account.selected
),date = current_date)
return list(PE['valuation_symbol'])
#根据市净率筛选股票列表
def stocks_PB(account,data):
current_date = get_datetime().strftime('%Y%m%d')
PB = get_fundamentals(query(
valuation.symbol,
valuation.pb
).filter(
valuation.pb > 0,
valuation.pb < 2.5
).order_by(
valuation.pb.asc()
).limit(
account.selected
),date = current_date)
return list(PB['valuation_symbol'])
#根据流动比率筛选股票列表
def stocks_current_ratio(account,data):
current_date = get_datetime().strftime('%Y%m%d')
Current_ratio = get_fundamentals(query(
debtrepay.symbol,
debtrepay.current_ratio
).filter(
debtrepay.current_ratio>1.2
).order_by(
debtrepay.current_ratio.desc()
),date = current_date)
return list(Current_ratio['debtrepay_symbol'])
# 根据长期与运营资金比率条件筛选股票列表
def stocks_Debt_asset(account,data):
current_date = get_datetime().strftime('%Y%m%d')
Debt_asset = get_fundamentals(query(
debtrepay.symbol,
debtrepay.long_term_debt_to_opt_capital_ratio
).filter(
debtrepay.long_term_debt_to_opt_capital_ratio<1.5
),date = current_date)
return list(Debt_asset['debtrepay_symbol'])
# 根据净利润增长率条件筛选股票列表
def stocks_netProfitGrowthrate(account,data):
current_date = get_datetime().strftime('%Y%m%d')
net_profit_growth_ratio = get_fundamentals(query(
growth.symbol,
growth.net_profit_growth_ratio
).filter(
growth.net_profit_growth_ratio>0
).order_by(
growth.net_profit_growth_ratio.desc()
),date = current_date)
return list(net_profit_growth_ratio['growth_symbol'])
# 根据净利润条件筛选股票列表
def stocks_netprofit(account,data):
current_date = get_datetime().strftime('%Y%m%d')
netprofit = get_fundamentals(query(
income.symbol,
income.net_profit
).filter(
income.net_profit > 0
),date = current_date)
return list(netprofit['income_symbol'])
# 盘中
def handle_data(account,data):
## 个股止损
last_date = get_last_datetime().strftime('%Y%m%d')
if len(account.positions) > 0:
# 止损:个股跌幅超过7%,卖出
securities = list(account.positions)
for stock in securities:
price = data.attribute_history(stock, ['close'], 1, '1d', skip_paused=False, fq='pre')
if account.positions[stock].cost_basis /price['close'][0]-1 < -0.07:
order_target(stock, 0)
log.info('%s 止损:%s' %(last_date,stock))
#止损:5天内大盘突然下跌13%,卖出
price_bench = data.attribute_history('000300.SH',['close'],5,'1d',skip_paused = False, fq = None)
if price_bench['close'][-5]/price_bench['close'][-1]-1 > 0.13:
if len(list(account.positions))>0:
for stock in list(account.positions):
order_target(stock,0)
log.info('%s 大盘突然下跌' %(last_date))
策略表现:

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/321260
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!