SpringBoot集成阿里easyexcel(二)Excel监听以及常用工具类

EasyExcel中非常重要的AnalysisEventListener类使用,继承该类并重写invoke、doAfterAllAnalysed,必要时重写onException方法。

Listener 中方法的执行顺序


首先先执行 invokeHeadMap() 读取表头,每一行都读完后,执行 invoke()方法 读取数据,最后是doAfterAllAnalysed() 方法。
invoke通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据。对当前获取的行的数据配合实体类字段的校验注解来实现数据校验,并返回错误提示,也可校验表头(相应index下表对应excel中的中文名称)是否正确。
doAfterAllAnalysed方法可定义在资源解析完成之后的操作 onException方法定义在数据解析出错失败时的操作,一般为当前数据行的数据无法与ExcelProperty所注解的字段类型想符合,从而导致无法继续解析流沉的错误。


一、ExcelListener监听器

public class ExcelListener extends AnalysisEventListener {
   
   

    /**
     * 自定义用于暂时存储data。
     * 可以通过实例获取该值
     */
    private List<Object> datas = new ArrayList<>();
    private List<ImportErrVo> errDatas = new ArrayList<>();
    private Map<Integer, String> headMap = new HashMap<>();
    private Boolean head = false;

    /**
     * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据
     */
    @Override
    public void invoke(Object object, AnalysisContext context) {
   
   
        checkHead(object);
        //属性验证

        int rowNum = context.readRowHolder().getRowIndex();
        String errMsg;
        try {
   
   
            errMsg = EasyExcelValiHelper.validateEntity(object);
        } catch (Exception e) {
   
   
            errMsg = "解析数据出错";
            e.printStackTrace();
        }
        if (!StringUtils.isEmpty(errMsg)) {
   
   
            ImportErrVo errVo = new ImportErrVo();
            errVo.setLine(rowNum + 1 + "");
            errVo.setErrMsg(errMsg);
            errDatas.add(errVo);
        } else {
   
   
            //数据存储到list,供批量处理,或后续自己业务逻辑处理。
            datas.add(object);
        }

        //根据业务自行 dosomething
        doSomething();
    }

    /**
     * 根据业务自行实现该方法
     */
    private void doSomething() {
   
   
    }

    /**
     * 校验表头判断是否传错
     *
     * @param object
     */
    public void checkHead(Object object) {
   
   
        Field[] fields = object.getClass().getDeclaredFields();
        if (head) {
   
   
            return;
        }
        for (Field f : fields) {
   
   
            if (f.getName().equals("serialVersionUID")) {
   
   
                continue;
            }
            ExcelProperty excelProperty = f.getAnnotation(ExcelProperty.class);
            int index = 0;
            if (excelProperty!=null){
   
   
               index= excelProperty.index();
            }
            if ((excelProperty != null && headMap.get(index)==null) || (excelProperty != null && !headMap.get(index).equals(excelProperty.value()[excelProperty.value().length-1]))) {
   
   
                ImportErrVo errVo = new ImportErrVo();
                errVo.setLine("1");
                errVo.setErrMsg("表头数据不对应,导入数据失败");
                errDatas.add(errVo);
                this.head = true;
                break;
            }
        }
    }

      /**
     * 解析结束的操作
     *
     * @param object
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
   
   
        if (head) {
   
   
            errDatas.removeIf(a -> !a.getLine().equals("1"));<
<think>嗯,用户问怎么写一套可实现的首板量化策略。首先,我需要明确首板策略的定义。首板通常指股票上市后或长期停牌后的第一个涨停板,可能代表资金关注或趋势启动。用户可能是刚开始接触量化交易,需要从基础开始指导。 接下来,我得考虑策略的核心要素。选股条件、买入时机、风险控制和回测优化都是关键。用户可能对每个步骤的具体实现不太清楚,需要详细解释。比如,如何识别首板?可能需要用涨停价和成交量等数据。 然后是数据获取,可能需要使用聚宽、Tushare等平台。用户可能对数据源不太熟悉,需要推荐可靠的工具。然后,策略逻辑部分,要分步骤说明条件判断、买入信号、仓位管理和止损止盈。用户可能需要具体的代码示例,比如用Python和聚宽框架。 风险控制部分,用户可能容易忽略,需要强调止损止盈的重要性。回测和优化方面,要解释参数优化和过拟合的问题,用户可能不知道如何平衡参数。最后,注意事项里要提醒市场环境变化和流动性风险,用户可能没考虑到这些因素。 用户可能的深层需求是希望有一个实际可操作的策略,而不仅仅是理论。所以需要提供具体的实现步骤和代码片段,帮助他们快速上手。同时,要提醒他们量化交易的风险,避免盲目跟随策略。 需要确保回答结构清晰,分点说明,让用户逐步理解每个环节。代码部分要简洁明了,注释清楚,方便用户修改和测试。还要强调回测的重要性,确保策略在历史数据上有效,再考虑实盘。</think>好的,我将分步骤为您讲解首板量化策略的构建方法。首板策略主要捕捉股票首次涨停后的动量效应,以下是可落地的实现框架: 一、策略核心逻辑 1. 选股条件 - 非ST股、非科创板(根据风险偏好调整) - 上市时间>60日(排除次新股波动干扰) - 当日首次涨停:$$Close = UpperLimit \quad \&\quad UpperLimitCount == 1$$ - 成交量突破:$$Volume > MA(Volume,5)*2$$ 2. 买入信号 - 集合竞价阶段量价验证: $$OpenPrice \in [Close_{prev}*1.00, Close_{prev}*1.03]$$ $$AuctionVolume > MA(Volume,20)*0.3$$ 3. 仓位管理 - 单票仓位≤5% - 全市场首板≤3只时暂停开仓 、数据准备(以聚宽平台为例) ```python # 获取涨停数据 def is_first_limit(stock): # 获取最近20日涨停状态 limit_status = get_price(stock, count=20, fields='high_limit') # 判断当日涨停且前19日无涨停 return limit_status[-1] and not any(limit_status[:-1]) ``` 三、风险控制模块 1. 止损规则: - 日内回撤≥3%时触发止损 - 跌破当日开盘价2%立即离场 2. 止盈规则: - 阶梯式止盈: $$ \begin{cases} 5\% \leq Profit < 7\% & 保本单跟踪 \\ Profit \geq 7\% & 动态回撤止盈 \end{cases} $$ 四、回测参数优化 1. 关键参数敏感度测试: | 参数 | 测试范围 | 最优区间 | |------------|-------------|---------| | 成交量倍数 | [1.5, 3] | 2.2-2.6 | | 持有周期 | [1,5]日 | 2-3日 | | 开仓阈值 | [2%,4%] | 3% | 五、注意事项 1. 市场环境适应性: - 当沪深300波动率($\sigma$) > 25%时暂停策略 - 涨停封单金额中位数<500万时降低仓位 2. 订单执行优化: - 采用TWAP算法拆分大单 - 设置价格容忍度:$$\Delta P \leq 0.3\%$$ 六、策略示例代码框架 ```python # 首板策略核心逻辑 def handle_data(context): # 获取当日首板股票池 first_limit_pool = [s for s in context.universe if is_first_limit(s)] # 量价过滤 filtered = filter(lambda s: s.volume > s.mavg(5)*2.2, first_limit_pool) # 开盘价验证 for stock in filtered: if check_auction(stock): order_target_percent(stock, 0.05) # 风控执行 run_risk_management(context.portfolio.positions) ``` 建议先使用2018-2023年数据进行多周期回测,特别注意2020年注册制改革前后的市场结构变化。实盘前需测试订单路由延迟,建议使用CTP直连通道。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值