问题描述
解决方案
在PTrade中,查询最近的新股或可转债中签信息主要使用 get_lucky_info 函数。该函数专门用于获取指定时间范围内的中签记录。
以下是具体的代码实现和详细说明。
核心代码实现
你可以将以下代码复制到策略的 before_trading_start 函数中,这样策略每天盘前都会自动检查过去一段时间(例如过去30天)是否有中签记录。
import datetime
def initialize(context):
# 初始化只需设置一个任意标的即可,用于启动策略
g.security = '600570.SS'
set_universe(g.security)
def before_trading_start(context, data):
# 1. 设定查询的时间范围
# 获取当前日期
current_dt = context.blotter.current_dt
# 设定结束日期为今天 (格式 YYYYmmdd)
end_date = current_dt.strftime("%Y%m%d")
# 设定开始日期为30天前,以确保覆盖“最近”的范围
start_dt = current_dt - datetime.timedelta(days=30)
start_date = start_dt.strftime("%Y%m%d")
log.info("开始查询中签信息,时间范围: %s 到 %s" % (start_date, end_date))
# 2. 调用API获取中签信息
# 注意:该函数仅在交易模块(实盘)可用,回测中通常返回空或模拟数据
lucky_info_list = get_lucky_info(start_date, end_date)
# 3. 处理并打印结果
if lucky_info_list:
log.info("恭喜!查询到以下中签信息:")
for info in lucky_info_list:
# 提取关键字段
code = info.get('stock_code')
name = info.get('stock_name')
amount = info.get('occur_amount')
price = info.get('business_price')
date = info.get('init_date')
log.info("日期: %s | 代码: %s | 名称: %s | 数量: %s | 价格: %s" % (
date, code, name, amount, price
))
else:
log.info("在指定范围内未查询到中签记录。")
def handle_data(context, data):
pass
函数说明:get_lucky_info
该接口用于获取历史中签信息。
- 适用场景:仅在交易模块(实盘)使用,回测模块可能无法获取真实数据。
- 参数:
start_date(str): 开始日期,格式必须为"YYYYmmdd"(如"20231001")。end_date(str): 结束日期,格式必须为"YYYYmmdd"。
- 返回值:返回一个列表,列表中的每个元素是一个字典,包含以下字段:
stock_code: 证券代码stock_name: 证券名称occur_amount: 中签数量(股/张)business_price: 发行价格init_date: 交易日期(整数格式,如 20231001)
注意事项
- 环境限制:此代码主要用于实盘交易环境。如果在回测环境中运行,通常不会返回数据,或者仅返回模拟撮合产生的数据(取决于回测设置)。
- 日期格式:务必保证传入的日期参数是字符串格式的
YYYYmmdd,否则接口会报错。 - 柜台对接:部分特殊的柜台系统(如对接jz_ufx)可能不支持该函数,具体需以券商提供的PTrade环境说明为准。
Q&A
Q: 为什么我在回测中运行这段代码没有查到数据?
A: get_lucky_info 是一个主要面向实盘交易的接口,用于查询实际账户的中签记录。在回测环境中,除非模拟了打新和中签的过程,否则该函数通常返回空列表。
Q: 查询的时间范围有限制吗?
A: 理论上没有严格限制,但为了查询效率,建议不要跨度过大(如数年)。通常查询最近1个月或3个月的数据即可满足“最近中签”的需求。
Q: 如果中签了,代码会自动帮我缴款吗?
A: 不会。get_lucky_info 仅用于查询信息。PTrade本身支持通过 ipo_stocks_order 进行新股申购,但中签后的缴款通常是只要账户内有足够的可用资金,券商系统会在缴款日自动扣除。请确保账户在缴款日有足额资金。