🚀 AI 一键生成 ptrade 策略代码

PTrade 策略开发:如何使用 set_universe 高效管理你的股票池?

ptrade | 发布时间: 2025/12/2
以下内容由 EasyQuant 生成。

问题描述

如何在策略中设置和更新我要交易的股票列表?

解决方案

在PTrade量化交易平台中,设置和更新股票池(即您想要关注或交易的股票列表)主要通过 set_universe 函数来实现。

根据您的需求,通常有两种设置方式:固定股票列表动态更新股票列表(如每日更新指数成分股)。

以下是详细的说明和代码示例。

核心函数说明

  • set_universe(security_list):
    • 作用: 设置策略的默认股票池。
    • 影响: 当您调用 get_history 等数据获取函数且不指定 security_list 参数时,系统会默认获取这里设置的股票数据。
    • 参数: security_list 可以是一个股票代码字符串,也可以是一个包含多个股票代码的列表(List)。

场景一:设置固定的股票列表

如果您只交易特定的几只股票,可以在 initialize 函数中一次性设置好。

def initialize(context):
    # 定义一个全局变量存储股票列表
    g.security = ['600570.SS', '000001.SZ', '600036.SS']
    
    # 设置股票池
    set_universe(g.security)

def handle_data(context, data):
    # 这里可以直接使用 g.security 进行下单或其他逻辑
    # 例如:买入股票池中的第一只股票
    # order(g.security[0], 100)
    pass

场景二:动态更新股票列表(推荐)

在回测或实盘中,指数成分股(如沪深300)会定期调整,或者您希望每天根据某些条件(如剔除ST、剔除停牌)更新股票池。

最佳实践是在 before_trading_start 函数中进行更新。这样可以确保每天盘前都能获取到最新的成分股列表。

示例:每日更新为“沪深300”成分股并剔除ST和停牌股

def initialize(context):
    # 初始化时设置一个临时标的,防止报错
    set_universe(['600570.SS'])

def before_trading_start(context, data):
    # 1. 获取当天的沪深300成分股
    # 注意:get_index_stocks 建议在 before_trading_start 中调用
    # 000300.SS 代表沪深300指数
    index_stocks = get_index_stocks('000300.SS')
    
    # 2. 过滤掉 ST股、停牌股、退市股
    # filter_stock_by_status 接口用于过滤指定状态的股票
    # 默认过滤 ["ST", "HALT", "DELISTING"]
    target_stocks = filter_stock_by_status(index_stocks)
    
    # 3. 将过滤后的列表保存到全局变量 g 中,方便后续使用
    g.security = target_stocks
    
    # 4. 更新系统的股票池
    set_universe(g.security)
    
    # 打印日志查看当天股票池数量
    log.info("今日股票池数量: %s" % len(g.security))

def handle_data(context, data):
    # 策略逻辑...
    pass

场景三:使用行业成分股

如果您想交易特定行业的股票,可以使用 get_industry_stocks

def initialize(context):
    set_universe(['600570.SS'])

def before_trading_start(context, data):
    # 获取申万一级行业“银行”板块的成分股
    # 行业代码需参考PTrade文档附录,例如银行可能是 '480000' (聚源行业) 或其他代码
    # 这里以文档示例中的农业 'A01000.XBHS' 为例
    industry_stocks = get_industry_stocks('A01000.XBHS')
    
    # 更新股票池
    set_universe(industry_stocks)
    g.security = industry_stocks

def handle_data(context, data):
    pass

常见问题 Q&A

Q1: set_universe 会自动帮我买入这些股票吗?
A: 不会。set_universe 仅仅是告诉系统“我关注这些股票”,并方便后续数据获取。具体的买卖操作必须在 handle_data 或其他函数中通过调用 orderorder_target 等交易函数来实现。

Q2: 为什么建议在 before_trading_start 中更新股票池?
A: 因为 initialize 只在策略启动的第一天运行一次。如果您在回测中跨越了很长时间(例如一年),指数的成分股可能已经发生了变化(调入或调出)。在 before_trading_start 中更新可以确保您的策略每天使用的都是当时最新的成分股列表,避免“幸存者偏差”。

Q3: 股票代码的后缀是什么意思?
A: PTrade中,上海证券交易所的股票后缀为 .SS(如 600570.SS),深圳证券交易所的股票后缀为 .SZ(如 000001.SZ)。在设置列表时必须包含后缀。

Q4: 如何获取全市场的股票?
A: 可以使用 get_Ashares() 函数获取当日所有A股代码,然后配合 set_universe 使用。但请注意,全市场股票数量较多,可能会导致回测速度变慢。