问题描述
解决方案
在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 或其他函数中通过调用 order、order_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 使用。但请注意,全市场股票数量较多,可能会导致回测速度变慢。