同花顺Supermind量化交易 风险控制建模-向彼得林奇投资大师学习PEG选股

本文介绍了投资大师彼得·林奇的PEG选股策略,详细解释了PEG指标的计算方式及其在非周期性行业的应用。通过Supermind量化交易平台,演示了策略的实现过程,包括成长型股票池的构建和回测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

投资大师彼得·林奇有过一个著名的论断:任何一家公司股票如果定价合理的话,市盈率就会与收益增长率相等。本篇内容将为大家讲述彼得·林奇推广的PEG选股策略。

import pandas as pd
import numpy as np
# 初始化函数,全局只运行一次
def init(context):
    set_benchmark('399333.SZ')#设置中小板为基准
    g.day = 0 #记录运行天数
    g.tradeday = 20 #调仓频率
    g.stock = [] #储存上期的股票池
    g.trade = False #是否调仓的开关
    g.stocknum = 10 #持仓数量
    pass

#每日开盘前9:00被调用一次,用于储存自定义参数、全局变量,执行盘前选股等
def before_trading(context):
    #判断是否调仓
    if g.day%g.tradeday==0:
        g.trade=True
    else:
        g.trade=False
    g.day=g.day+1
## 开盘时运行函数
def handle_bar(context, bar_dict):
    if g.trade==True:
        #获取选股结果
        needstock_list = peg()
        #获取上期持仓个股
        holdstock_list = list(g.stock)
        #确定本期需要卖出的个股
        sell_list = list(set(holdstock_list)-set(needstock_list))
        #执行卖出操作,运用for循环,逐个操作。
        for s in sell_list:
            order_target(s,0)
        #确定本期需要买入的个股,其余即为继续持仓的个股
        buy_list=[]
        for i in needstock_list:
            if i in holdstock_list:
                pass
            else:
                buy_list.append(i)
        #确定可用资金,平分分配至需买入的个股
        n=len(buy_list)
        cash=context.portfolio.available_cash/n
        #执行买入操作
        for s in range(0,n,1):
            stock=list(buy_list)[s]
            order_value(stock,cash)
        #操作完毕,将选股结果放到上期股票池储存变量中,以备下次使用。
        g.stock = frozenset(needstock_list)
    else:
        pass
#选股函数
def peg():
    date=get_last_datetime().strftime('%Y%m%d')
    #获取非周期行业股票。
    stock_list1=non_cyclical_industry(date)
    #获取成长型股票池
    stock_list2=growth_list(stock_list1,date)
    #获取PEG最小的10只股票
    q = query(valuation.symbol,valuation.pe_ttm,growth.basic_eps_year_growth_ratio).filter(valuation.symbol.in_(stock_list2))
    basic = get_fundamentals(q, date = date)
    basic['PEG']=basic['valuation_pe_ttm']/basic['growth_basic_eps_year_growth_ratio']
    basic = basic[basic['PEG']>0]
    basic = basic[basic['growth_basic_eps_year_growth_ratio']<=40]
    basic = pd.DataFrame(basic).sort_values(by ='PEG', ascending=True)
    basic.index=basic['valuation_symbol']
    #获取股票的代码
    needstock_list=[]
    for s in range(0,g.stocknum,1):
        needstock_list.append(list(basic.index)[s])
    return needstock_list
#获取成长型股票池
def growth_list(stk,date):
    stock_num = int(len(stk)*0.5)
    #获取净利润增长率和销售毛利率
    q = query(valuation.symbol,
                  growth.net_profit_growth_ratio,
                  profit.net_profit_margin_on_sales).filter(valuation.symbol.in_(stk))
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值