概要
+ 本文参考了申万大师研报的迈克尔•普莱斯低估价值选股理念,实现了指标量化。回测开始于2020 年1月1日,结束于2023 年6 月25日。迈克尔•普莱斯低估价值选股法年化收益率44.74%,基准年化收益13.63%,最大回撤16.36%,胜率90%,平均每期持股30个。
+ 本文框架
o简介
o迈克尔•普莱斯的策略理念
o结合中国实际国情的策略优化版本
简介
+ 迈克尔•普莱斯以价值投资着称,尤其喜爱复杂的交易,如并购、合并、破产、清算等可以利用超低价买进被市场严重低估的资产。在其基金投资生涯中,参与的并购案不计其数,如西尔斯(后来改名施乐百)、柯达、梅西百货(Macy’s)及大通银行(Chase)和华友银行(Chemical)的合并等,皆是投资史上知名的大事。
迈克尔•普莱斯的策略理念
迈克尔•普莱斯是典型的价值投资者,他认为只要做对下列三件事,价值投资即可成功:
1) 股价低于资产价值( A company selling at a discount from asset value)。这一准则是典型的价值投资思想,即相对公司资产价值,股价处于相对低估的水平。
2) 公司经营阶层持股越高越好( a management that owns share, The more, the better)。这一准则考虑的是上司公司普遍存在的委托代理问题。公司经营层持股越多,则高级管理层和股票权益持有人的利益目标就越一致,相对的,委托代理间的利益分歧就减少。
3) 负债愈少愈好( A clean balance sheet ,little debt so there is less financial risk)。这一准则考察的是公司的长期负债水平。一家运行良好的低负债公司,不仅能在当下保持健康的运作,也能在未来通过一定的举债来应对突发事件带来的冲击。
结合中国实际国情的策略优化版本
策略选股:
A 股价与每股净值比小于2,且选取市净率最低的400只股票
B 董监事持股比例大于市场平均值 (没有该数据)
C 负债比例低于市场平均值
D. 满足于上述条件下的前30只股票
交易方式:
按月调仓
止损方式:
A.当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票
以同花顺量化为例子,代码导图:

源码
'''
迈克尔•普莱斯低估价值选股策略
策略选股:
A 股价与每股净值比小于2,且选取市净率最低的400只股票
B 董监事持股比例大于市场平均值(缺失该数据)
C 负债比例低于市场平均值
D. 满足于上述条件下的前30只股票
交易方式:
按月调仓
止损方式:
A. 当个股价格低于成本价的7%时,卖出该股票
B. 当5日内大盘下跌13%时,卖出所有股票
'''
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:
##获得购买股票列表
PB_list = stocks_PB(account,data)
Equity_ratio_list = stocks_equity_ratio(account,data)
## 获得满足每种条件的股票池
stock_list = list(set(PB_list)&set(Equity_ratio_list))
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 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))
################## 以下为功能函数, 在主要函数中调用 ##########################
# 1. 根据市净率筛选股票列表
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
).order_by(
valuation.pb.asc()
).limit(
account.selected
),date = current_date)
return list(PB['valuation_symbol'])
# 5. 根据负债比例条件来筛选股票列表
def stocks_equity_ratio(account,data):
current_date = get_datetime().strftime('%Y%m%d')
equity_ratio = get_fundamentals(query(
debtrepay.symbol,
debtrepay.equity_ratio
),date = current_date)
equity_ratio_mean = equity_ratio['debtrepay_equity_ratio'].mean()
equity_ratio = equity_ratio[equity_ratio['debtrepay_equity_ratio']<equity_ratio_mean]
return list(equity_ratio['debtrepay_symbol'])
回测

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