问题描述
解决方案
在PTrade中,筛选特定概念板块(如雄安新区或粤港澳大湾区)的股票,主要使用 get_industry_stocks 接口。你需要知道对应的概念板块代码,并在代码后加上后缀 .XBHS。
根据PTrade的数据字典:
- 雄安新区 的概念代码为
003813。 - 粤港澳自贸区(通常用于指代粤港澳相关概念)的概念代码为
003677。
核心步骤
- 获取成分股:使用
get_industry_stocks('代码.XBHS')分别获取两个板块的股票列表。 - 合并列表:将两个列表相加。
- 去重:因为某些股票可能同时属于两个概念,需要使用
set进行去重处理。 - 设置股票池:使用
set_universe将筛选出的股票设置为当前策略的股票池。
策略代码实现
以下是一个完整的策略示例,它会在每天盘前筛选出属于这两个板块的股票,并打印数量和代码列表。
def initialize(context):
# 初始化函数,设置策略基本参数
# 这里先初始化一个空的股票列表,实际筛选在 before_trading_start 进行
g.security = []
set_universe(g.security)
def before_trading_start(context, data):
"""
盘前处理函数,每日开盘前运行
在此处获取最新的概念板块成分股
"""
# 1. 获取“雄安新区”概念的股票列表
# 代码 003813 对应 雄安新区
xiongan_stocks = get_industry_stocks('003813.XBHS')
# 2. 获取“粤港澳自贸区”概念的股票列表
# 代码 003677 对应 粤港澳自贸区
bay_area_stocks = get_industry_stocks('003677.XBHS')
# 3. 合并两个列表并去重
# 使用 set() 去除重复的股票代码,再转回 list
combined_stocks = list(set(xiongan_stocks + bay_area_stocks))
# 4. 将筛选出的股票设置为当天的股票池
g.security = combined_stocks
set_universe(g.security)
# 5. 打印日志信息
log.info("========== 板块筛选结果 ==========")
log.info("雄安新区概念股数量: %s" % len(xiongan_stocks))
log.info("粤港澳概念股数量: %s" % len(bay_area_stocks))
log.info("合并去重后总数量: %s" % len(g.security))
# 如果需要查看具体代码,可以取消下面这行的注释
# log.info("筛选出的股票列表: %s" % g.security)
def handle_data(context, data):
"""
盘中运行函数
"""
# 这里可以编写具体的买卖逻辑
# 例如:遍历 g.security 中的股票进行交易
pass
代码解析
get_industry_stocks: 这是核心API。注意必须添加.XBHS后缀,这代表获取的是概念板块数据。set(): 集合操作,用于自动去除重复元素。如果一只股票既是雄安概念又是粤港澳概念,直接相加会出现两次,使用set可以确保每个股票代码只出现一次。- 执行时机: 建议在
before_trading_start中调用。因为板块成分股可能会随时间调整(虽然频率不高),在盘前获取能保证当天使用的是最新数据。
Q&A
Q1: 如何查找其他概念板块的代码?
A1: 您可以在PTrade客户端的行情界面查看板块指数,或者参考API文档中的“附录:概念板块”章节。例如,“一带一路”的代码是 003712,“新能源车”是 003900。使用时记得加上 .XBHS 后缀。
Q2: get_industry_stocks 获取的是当下的成分股还是历史成分股?
A2: 该函数获取的是当下的数据。在回测模式中,它不能取到真正匹配回测历史日期的成分股变动(即存在“未来函数”问题)。如果您的策略严格依赖历史某时刻的成分股名单,需要谨慎使用或自行准备历史成分股数据文件。但在实盘或模拟交易中,获取当下数据是正确的做法。
Q3: 筛选出的股票可以直接全仓买入吗?
A3: 不建议直接全仓买入。筛选出的股票数量可能很多(几十甚至上百只),直接全仓买入会导致资金过于分散且每只股票买入金额过小(甚至不足一手)。通常需要在筛选出板块股票后,再结合技术指标(如均线、MACD)或基本面数据(如市盈率)进行二次过滤,选出最优质的几只进行交易。