普莱斯低估价值选股策略

概要

+ 本文参考了申万大师研报的迈克尔•普莱斯低估价值选股理念,实现了指标量化。回测开始于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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 1小时前
下一篇 4分钟前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注