格雷厄姆企业主投资策略

•这篇文章参考投资大师本杰明.格雷厄姆企业主投资法,对基本面指标进行了量化。回测开始于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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

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

相关推荐

发表回复

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