返回列表 发布新帖

策略研究--新股新债自动申购上市当天卖出策略

4 1

风险提示:本内容为量化技术及平台操作的纯知识分享,不构成任何投资建议,不推荐任何具体证券或交易时机。部分内容可能理解包含错误,请自行核实。市场有风险,投资需谨慎

最近在把全部qmt的策略迁移到ptrade,qmt维护服务器麻烦,放在ptrade上运行省心,唯一的缺点就是ptrade模拟盘太卡了,回测慢,不好检验策略,等待时间长

1cb7c5bafb196e4b054f3adebfb55f38.png

上次写了一个ptrad的新股新可转债申购的代码量化研究--新股新可转债自动申购算法研究,

打新每年还是有一个不错的收益的,我具体进一步的优化了一下,对账户的标的检查,新股上市当天进行卖出,2个不错,,一个部分是每天自动进行新股的申购,一部分是每天检查持股,上市当天卖出,实现新股的自动申购,卖出功能

申购的部分我上次说了就没有必要再重复,这里重点介绍检查新股上市,第一步读取股票上市时间,获取证券基础信息函数有一个上市时间

f3c315d5e9a6773431868d1a48ff76bd.png

简单的代码参考

11034d5070ffff6af8520455b2a23002.png

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

读取当天的交易日,检查上市时间和当天时间一样的持股标的卖出

f026a6179d8dcb66ca716a18303cdf48.png

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))

测试没有问题挂交易就可以

ca5b490a4d960ff425dbb7b602448c86.png

运行的结果,新股申购

c8b52c8ffa46ddf8d29fbf0ecece13e9.png

新股卖出

a2987bd5810a48cd80419fae63333cb7.png

不懂的问我就可以

0460821696774c73d91c0eca6daa63a9.jpg

评论1

落花忆流年楼主
发表于 8 分钟前 | 显示全部楼层
不懂的问我就可以作者微信xg_quant

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表