一、概念
1.EPS(Earnings Per Share)表示每股收益(一般按年计算):

归属于普通股股东的当期净利润当期实际发行在外的普通股加权平均数
#公式
EPS=归属于普通股股东的当期净利润/当期实际发行在外的普通股加权平均数

2.PE(Price to Earning Ratio)表示市盈率,是当前股价(P)相对每股收益(EPS)的比值:
#公式
PE=P/EPS

3.G(Growth Rate of Expected Profit)表示企业的收益增长率。收益增长率的计算方法不一,简便起见,本文取EPS增长率:
#公式
G=(EPS this year−EPS last year)/EPS last year

4.基于以上几个指标,得出PEG的计算公式:
#公式
PEG=PE/(G∗100)

----###****从以上公式可以看出,PE蕴含着股价的信息,PEG是一个股价相对于收益增长率的比值。直观来讲,PEG越高,代表该公司的股价有被高估的可能性,不建议买。反之,PEG越低,代表该公司的股价有被低估的可能性,考虑买入(一般情况下,PEG越低越好)。

二、实战

策略主要就是PEG法则,选取沪深300股票池里的20只PEG低估的股票进行买入,进行月操作

# 导入函数库
from jqdata import *

# 初始化函数,设定基准等等
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
    run_monthly(handle,1)

def handle(context):
    df=get_fundamentals(query(valuation.code,valuation.pe_ratio,indicator.inc_net_profit_year_on_year).filter(valuation.code.in_(g.security)))
    df=df[(df["pe_ratio"]>0) & (df["inc_net_profit_year_on_year"]>0)]
    df["PEG"]=df["pe_ratio"]/df["inc_net_profit_year_on_year"]/100
    # print(df["PEG"].nsmallest(g.N))
    df=df.sort(columns="PEG")[:g.N]
    tohold=df["code"].values
    # print(type(tohold))

    for stock in context.portfolio.positions:
        if stock not in tohold:
            order_target_value(stock,0)

    tobuy=[stock for stock in tohold if stock not in context.portfolio.positions]

    if len(tobuy)>0:
        cash=context.portfolio.available_cash
        cash_every_stock=cash/len(tobuy)

        for stock in tobuy:
            order_value(stock, cash_every_stock)

python量化 彼得·林奇PEG策略-LMLPHP

10-06 20:13