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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM