一、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、執行顯示效果