量化交易——PEG策略

一、PEG指标介绍

  PEG指标:市盈率相对盈利增长比率,上市公司的市盈率除以盈利增长速度得到的数值。该指标既通过市盈率考察公司目前的财务状况,又通过盈利增长率考察了未来一段时期内公司的增长预期。

1、市盈率

  市盈率(PE) = 股价(P) / 每股收益(EPS)

  市盈率 ≈ 市值 / 净收益

  例如:有一家包子铺,每年净利润为50万元,收购价格(市值)为100万元;有一家家具店,每年净利润为100万元,收购价格(市值)为1000万元。

  包子铺市盈率为:100/50 = 2;家具店市盈率:1000 /100 = 10;可以得出若投资包子铺2年回本,投资家具店10年回本。

2、PEG策略

  彼得·林奇:任何一家公司股票如果定价合理的话,市盈率就会与收益增长率相等。

  市盈率(PE) = 股价(P) / 每股收益(EPS)

  收益增长率(G) = (现在每股收益(EPS1) - 之前每股收益(EPS0)) / 之前每股收益(EPS0)

  PEG = 市盈率PE / (收益增长率G*100)   除以100是转化为百分数

  PEG越低,代表股价被低估的可能性越大,股价会涨的可能性越大。

  PEG是一个综合指标,既考察价值,又兼顾成长性。PEG估值法适合应用于成长型的公司。

3、PEG策略选股

  1)计算股票池中所有股票的PEG指标。

  2)选择PEG最小的N只股票调仓。

  3)过滤掉市盈率或收益增长率为的股票。

二、PEG策略实现

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    g.security = get_index_stocks('000300.XSHG')
    g.N = 20
    # pe_ratio:市盈率
    # inc_net_profit_year_on_year:净利润同比增长率
    g.q = query(valuation.code, valuation.pe_ratio, indicator.inc_net_profit_year_on_year).filter(valuation.code.in_(g.security))
    run_monthly(handle, 1)
    
def handle(context):
    df = get_fundamentals(g.q)
    df = df[(df["pe_ratio"] > 0) & (df["inc_net_profit_year_on_year"] > 0)]
    # 计算peg
    df['peg'] = df['pe_ratio'] / df['inc_net_profit_year_on_year'] / 100
    # 找到最小的peg值对应的股票
    df = df.sort_values('peg')
    to_hold = df['code'][:g.N].values     # 取出前20个,并变成一个列表
    # print(to_hold)    # [600485.XSHG 601872.XSHG 600688.XSHG...]
    
    for stock in context.portfolio.positions:
        if stock not in to_hold:
            # 目标股数下单,卖出非标的的股票
            order_target(stock, 0)
    
    # 期待持有且还未持仓的股票
    to_buy = [stock for stock in to_hold if stock not in context.portfolio.positions]
    if len(to_buy) > 0:  # 需要调仓
        # 每只股票预计投入的资金
        cash_per_stock = context.portfolio.available_cash / len(to_buy)
        for stock in to_buy:
            # 按价值下单,买入需买入的股票
            order_value(stock, cash_per_stock)

1、获取到股票代码、PE、G

# 初始化函数,设定基准等等
def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    g.security = get_index_stocks('000300.XSHG')
    g.N = 20
    # pe_ratio:市盈率
    # inc_net_profit_year_on_year:净利润同比增长率
    g.q = query(valuation.code, valuation.pe_ratio, indicator.inc_net_profit_year_on_year).filter(valuation.code.in_(g.security))
    run_monthly(handle, 1)
    
def handle(context):
    df = get_fundamentals(g.q)
    print(df)

  执行显示:

  

2、过滤掉市盈率或收益增长率为负的股票

def handle(context):
    df = get_fundamentals(g.q)
    print(df)
    df = df[(df["pe_ratio"] > 0) & (df["inc_net_profit_year_on_year"] > 0)]

  这样就将为负的值都过滤掉了。

3、执行显示效果

  

posted @ 2020-05-20 10:43  休耕  阅读(2306)  评论(0编辑  收藏  举报