问题描述
解决方案
在 PTrade 量化交易平台中,获取股票的上市日期和所属行业板块分别需要使用不同的 API 接口。
以下是具体的实现方法和代码示例:
1. 获取上市日期:get_stock_info
使用 get_stock_info 函数,并通过 field 参数指定 'listed_date' 字段来获取。
- 接口说明:
get_stock_info(stocks, field=None) - 参数:
stocks: 股票代码(字符串或列表)。field: 需要获取的字段列表,获取上市日期需包含'listed_date'。
- 返回值:返回一个嵌套字典,包含指定字段的信息。
2. 获取所属行业板块:get_stock_blocks
使用 get_stock_blocks 函数可以获取股票所属的所有板块信息,包括行业、概念、地域等。
- 接口说明:
get_stock_blocks(stock_code) - 参数:
stock_code: 股票代码(字符串)。
- 返回值:返回一个字典,Key 为板块类型(如
'HY'代表行业,'GN'代表概念),Value 为板块名称列表。
完整策略代码示例
您可以将以下代码复制到 PTrade 的策略编辑区域进行回测或运行,它将在日志中打印出指定股票的上市日期和行业信息。
def initialize(context):
# 设置我们要查询的股票,例如:恒生电子
g.security = '600570.SS'
# 设置股票池(虽然查询基础信息不强制要求set_universe,但作为策略规范建议加上)
set_universe(g.security)
def before_trading_start(context, data):
# --- 1. 获取上市日期 ---
# field参数必须指定 'listed_date',否则默认只返回股票名称
info = get_stock_info(g.security, field=['stock_name', 'listed_date'])
# 解析返回的数据
if info and g.security in info:
stock_name = info[g.security]['stock_name']
listed_date = info[g.security]['listed_date']
log.info("股票名称: %s, 上市日期: %s" % (stock_name, listed_date))
# --- 2. 获取所属行业板块 ---
blocks = get_stock_blocks(g.security)
if blocks:
# 'HY' 键通常对应所属行业
industry_info = blocks.get('HY', [])
# 'GN' 键通常对应概念板块
concept_info = blocks.get('GN', [])
log.info("所属行业(HY): %s" % str(industry_info))
log.info("所属概念(GN): %s" % str(concept_info))
log.info("全部板块信息: %s" % str(blocks))
def handle_data(context, data):
pass
代码运行结果说明
运行上述代码后,您将在日志(Log)中看到类似以下的输出:
- 上市日期:例如
股票名称: 恒生电子, 上市日期: 2003-12-16 - 行业信息:
get_stock_blocks返回的字典中,'HY'对应的是行业分类(通常是申万或证监会行业),例如[['710200.XBHS', '计算机应用']]。
注意事项
- Python 版本兼容性:PTrade 环境通常支持 Python 3,但为了兼容旧版本(如 Python 3.5),建议使用
%s格式化字符串,而不是 f-string。 - 未来函数:
get_stock_blocks获取的是当前的板块信息。如果在回测中使用,它返回的是该股票现在所属的板块,而不是历史上某一天的板块分类。这在回测中属于“未来函数”,请谨慎用于历史回测策略逻辑判断。 - 上市日期格式:
listed_date返回的是字符串格式(如'2003-12-16'),如果需要进行日期计算,需要自行转换为datetime对象。
Q&A
Q: get_stock_blocks 返回的字典中,Key 分别代表什么意思?
A: 返回字典中常见的 Key 含义如下:
'HY': 行业板块(Industry)'GN': 概念板块(Concept)'DY': 地域板块(Region)'ZJHHY': 证监会行业分类'HGT': 是否属于沪股通标的
Q: 如果我想筛选出上市超过 90 天的股票,应该怎么写?
A: 您可以结合 get_stock_info 获取的 listed_date 和当前回测日期进行比较。示例逻辑如下:
import datetime
def check_is_old_stock(stock_code, current_dt):
info = get_stock_info(stock_code, field=['listed_date'])
listed_date_str = info[stock_code]['listed_date']
# 将字符串转换为 datetime 对象
listed_date = datetime.datetime.strptime(listed_date_str, '%Y-%m-%d')
# 计算天数差
days_diff = (current_dt - listed_date).days
return days_diff > 90
Q: get_stock_info 如果不传 field 参数会返回什么?
A: 如果不传 field 参数,默认只返回包含 stock_name(股票名称)的字典,不会包含上市日期或退市日期。因此查询日期时必须显式指定 field=['listed_date']。