量化交易——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、执行显示效果