风险提示:本内容为量化技术及平台操作的纯知识分享,不构成任何投资建议,不推荐任何具体证券或交易时机。部分内容可能理解包含错误,请自行核实。市场有风险,投资需谨慎
最近在把全部qmt的策略迁移到ptrade,qmt维护服务器麻烦,放在ptrade上运行省心,唯一的缺点就是ptrade模拟盘太卡了,回测慢,不好检验策略,等待时间长

上次写了一个ptrad的新股新可转债申购的代码量化研究--新股新可转债自动申购算法研究,
打新每年还是有一个不错的收益的,我具体进一步的优化了一下,对账户的标的检查,新股上市当天进行卖出,2个不错,,一个部分是每天自动进行新股的申购,一部分是每天检查持股,上市当天卖出,实现新股的自动申购,卖出功能
申购的部分我上次说了就没有必要再重复,这里重点介绍检查新股上市,第一步读取股票上市时间,获取证券基础信息函数有一个上市时间

简单的代码参考

def get_stock_listed_days(context, stock):
"""
获取股票上市至今的天数(自然日)
参数:
context: Context对象
stock: 股票代码
返回:
int: 上市天数,如果获取失败返回 -1
"""
try:
stock_info = get_stock_info([stock], field=['listed_date'])
if stock not in stock_info:
log.error("股票 %s 不在返回信息中" % stock)
return -1
listed_date_str = stock_info[stock]['listed_date']
from datetime import datetime
listed_date = datetime.strptime(listed_date_str, '%Y-%m-%d').date()
current_date = context.blotter.current_dt.date()
days = (current_date - listed_date).days
print(stock,listed_date,current_date,days,'***************************')
return days
except Exception as e:
log.error("获取股票 %s 上市信息失败: %s" % (stock, str(e)))
return -1
读取当天的交易日,检查上市时间和当天时间一样的持股标的卖出

def check_and_sell_new_stocks(context):
"""
【优化】检查持仓中的新股,仅在上市当天执行卖出
对于所有非上市当天的股票,直接跳过,不做任何操作
"""
current_date = context.blotter.current_dt.strftime('%Y-%m-%d')
log.info("========== %s 开始检查新股持仓并卖出 ==========" % current_date)
log.info("卖出规则: 仅对上市当天(上市天数 == 0)的股票执行卖出操作")
positions = context.portfolio.positions
stock_list = list(set(positions.keys()))
if len(stock_list) == 0:
log.info("当前无任何持仓,无需卖出")
log.info("========== 新股持仓检查结束 ==========")
return
log.info("当前持仓股票数量: %d 只" % len(stock_list))
total_sold = 0
total_skipped = 0 # 跳过检查的股票数量(非上市当天)
for stock in stock_list:
position = positions[stock]
amount = position.amount
if amount <= 0:
continue
# 获取股票上市天数
listed_days = get_stock_listed_days(context, stock)
if listed_days == -1:
log.warning("无法获取 %s 的上市天数,跳过卖出检查" % stock)
continue
# ===== 核心逻辑:仅上市当天卖出 =====
# 上市天数 == 0 表示当天是上市首日,执行卖出
if listed_days == 0:
log.info("【卖出】%s 上市当天(上市天数 == 0),执行卖出操作" % stock)
try:
order_id = order(stock, -amount)
if order_id is not None:
log.info("卖出成功: %s, 数量: %d 股" % (stock, amount))
total_sold += 1
else:
log.error("卖出失败: %s, 订单建立失败" % stock)
except Exception as e:
log.error("卖出 %s 时发生异常: %s" % (stock, str(e)))
else:
# 非上市当天,直接跳过,不做任何操作
log.info("【跳过】%s 上市 %d 天,非上市当天,不执行操作" % (stock, listed_days))
total_skipped += 1
# 输出本次卖出检查总体统计
log.info("========== %s 新股持仓检查结束 ==========" % current_date)
log.info("卖出统计: 成功卖出 %d 只, 跳过 %d 只(非上市当天)" % (total_sold, total_skipped))
测试没有问题挂交易就可以

运行的结果,新股申购

新股卖出

不懂的问我就可以

|