瀏覽代碼

新的方法与类迁移

wangzaijun 1 年之前
父節點
當前提交
29b76d635d
共有 31 個文件被更改,包括 641 次插入38 次删除
  1. 1 1
      pom.xml
  2. 3 6
      src/main/java/com/smppw/analysis/application/service/performance/PerformanceService.java
  3. 2 2
      src/main/java/com/smppw/analysis/application/service/position/AbstractAnalysisBizHandler.java
  4. 2 2
      src/main/java/com/smppw/analysis/application/service/position/AbstractBizHandler.java
  5. 13 14
      src/main/java/com/smppw/analysis/application/service/position/future/MarginalRiskContributionBizHandler.java
  6. 1 2
      src/main/java/com/smppw/analysis/application/service/position/stock/BarraSensitivityComponent.java
  7. 1 1
      src/main/java/com/smppw/analysis/application/service/position/stock/RiskExposureBizHandler.java
  8. 1 1
      src/main/java/com/smppw/analysis/application/service/position/stock/StockPerformanceAttributionBizHandler.java
  9. 1 1
      src/main/java/com/smppw/analysis/application/service/position/synthesize/AssetAllocationBizHandler.java
  10. 1 1
      src/main/java/com/smppw/analysis/application/service/position/synthesize/PositionListBizHandler.java
  11. 1 1
      src/main/java/com/smppw/analysis/client/FundPerformanceApi.java
  12. 1 1
      src/main/java/com/smppw/analysis/client/FundPositionApi.java
  13. 1 1
      src/main/java/com/smppw/analysis/domain/dao/PrivatelyOfferedFundNavDao.java
  14. 1 1
      src/main/java/com/smppw/analysis/domain/dao/PubliclyOfferedFundNavDao.java
  15. 62 0
      src/main/java/com/smppw/analysis/infrastructure/consts/BarrConstant.java
  16. 48 0
      src/main/java/com/smppw/analysis/infrastructure/consts/BarraRiskProfitEnum.java
  17. 71 0
      src/main/java/com/smppw/analysis/infrastructure/consts/BarraStyleRespEnum.java
  18. 50 0
      src/main/java/com/smppw/analysis/infrastructure/consts/FutureStyleRespEnum.java
  19. 25 0
      src/main/java/com/smppw/analysis/infrastructure/consts/IndustryType.java
  20. 9 0
      src/main/java/com/smppw/analysis/infrastructure/consts/NavConst.java
  21. 32 0
      src/main/java/com/smppw/analysis/infrastructure/consts/OptionsType.java
  22. 27 0
      src/main/java/com/smppw/analysis/infrastructure/consts/RBSAIndexType.java
  23. 75 0
      src/main/java/com/smppw/analysis/infrastructure/consts/RBSAIndexTypeMap.java
  24. 68 0
      src/main/java/com/smppw/analysis/infrastructure/consts/RedisConst.java
  25. 24 0
      src/main/java/com/smppw/analysis/infrastructure/consts/ValueGrowthType.java
  26. 23 0
      src/main/java/com/smppw/analysis/infrastructure/consts/WinRateBmk.java
  27. 28 0
      src/main/java/com/smppw/analysis/infrastructure/exception/APIException.java
  28. 23 0
      src/main/java/com/smppw/analysis/infrastructure/exception/DataException.java
  29. 2 2
      src/main/java/com/smppw/analysis/infrastructure/persistence/BaseUnderlyingMapper.java
  30. 43 0
      src/main/java/com/smppw/analysis/infrastructure/utils/QuartileUtil.java
  31. 1 1
      src/main/resources/mapping/BaseUnderlyingMapper.xml

+ 1 - 1
pom.xml

@@ -46,7 +46,7 @@
         <dependency>
             <groupId>com.smppw</groupId>
             <artifactId>data-calc</artifactId>
-            <version>0.1.3-SNAPSHOT</version>
+            <version>0.1.4-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>cn.hutool</groupId>

+ 3 - 6
src/main/java/com/smppw/analysis/application/service/performance/PerformanceService.java

@@ -10,8 +10,6 @@ import com.smppw.analysis.application.dto.performance.BaseParams;
 import com.smppw.analysis.application.dto.performance.IndicatorParams;
 import com.smppw.analysis.application.dto.performance.TrendParams;
 import com.smppw.analysis.domain.service.BaseIndicatorServiceV2;
-import com.smppw.common.exception.APIException;
-import com.smppw.common.exception.DataException;
 import com.smppw.common.pojo.IStrategy;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcIndexDataDto;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcPropertyDto;
@@ -20,7 +18,6 @@ import com.smppw.common.pojo.dto.indicator.CalcMultipleSecMultipleTimeRangeIndic
 import com.smppw.common.pojo.dto.indicator.DateIntervalDto;
 import com.smppw.common.pojo.enums.*;
 import com.smppw.constants.Consts;
-import com.smppw.constants.MapFieldConstants;
 import com.smppw.core.reta.calc.PerformanceConsistency;
 import com.smppw.utils.StrategyHandleUtils;
 import org.slf4j.Logger;
@@ -174,7 +171,7 @@ public class PerformanceService {
             Map<String, Object> data = MapUtil.<String, Object>builder().put("maxDown", maxDown).put("maxExtraDown", maxExtraDown).build();
             extInfos.put(refId, data);
         }
-        return MapUtil.<String, Object>builder().put(MapFieldConstants.FIELD_DATASET, dataset).putAll(extInfos).build();
+        return MapUtil.<String, Object>builder().put("dataset", dataset).putAll(extInfos).build();
     }
 
     /**
@@ -279,10 +276,10 @@ public class PerformanceService {
      */
     protected <P extends BaseParams> void checkParams(P params) {
         if (params.getRefIds() == null || params.getRefIds().isEmpty()) {
-            throw new APIException("refIds 参数不能为空");
+            throw new RuntimeException("refIds 参数不能为空");
         }
         if (StrUtil.isBlank(params.getStartDate()) && StrUtil.isBlank(params.getEndDate())) {
-            throw new DataException(null);
+            throw new RuntimeException("时段不能为空");
         }
         if (params.getNavType() == null) {
             logger.warn(String.format("navType 为null, 设置一个初始值:%s", NavType.CumulativeNav));

+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/AbstractAnalysisBizHandler.java

@@ -12,9 +12,9 @@ import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.service.FundPositionAnalysisService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
-import com.smppw.common.exception.APIException;
+import com.smppw.analysis.infrastructure.consts.RedisConst;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.common.pojo.ValueLabelVO;
-import com.smppw.constants.RedisConst;
 import com.smppw.constants.SecType;
 
 import java.math.BigDecimal;

+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/AbstractBizHandler.java

@@ -13,9 +13,9 @@ import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.gateway.CacheGateway;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
-import com.smppw.common.exception.APIException;
+import com.smppw.analysis.infrastructure.consts.RedisConst;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.common.pojo.ValueLabelVO;
-import com.smppw.constants.RedisConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;

+ 13 - 14
src/main/java/com/smppw/analysis/application/service/position/future/MarginalRiskContributionBizHandler.java

@@ -20,11 +20,10 @@ import com.smppw.analysis.application.service.position.PositionLoadFactory;
 import com.smppw.analysis.domain.entity.FutureDailyPriceDO;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.analysis.infrastructure.persistence.BaseUnderlyingMapper;
 import com.smppw.analysis.infrastructure.persistence.IndexesTradeDateDoMapper;
-import com.smppw.common.exception.APIException;
 import com.smppw.common.pojo.FundFuturesOption;
-import com.smppw.common.pojo.ValueLabelDo;
 import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.utils.BigDecimalUtils;
 import org.apache.commons.math3.linear.Array2DRowRealMatrix;
@@ -72,10 +71,10 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
         if (CollUtil.isEmpty(positionInfos)) {
             return resultList;
         }
-        List<ValueLabelDo> breedNameList = this.baseUnderlyingMapper.getOptionTypeList();
+        List<ValueLabelVO> breedNameList = this.baseUnderlyingMapper.getOptionTypeList();
         // 区分金融期货和商品期货,单独取数
-        Map<ValueLabelDo, List<String>> financeRefMap = MapUtil.newHashMap();
-        Map<ValueLabelDo, List<String>> commodityRefMap = MapUtil.newHashMap();
+        Map<ValueLabelVO, List<String>> financeRefMap = MapUtil.newHashMap();
+        Map<ValueLabelVO, List<String>> commodityRefMap = MapUtil.newHashMap();
         this.distRef(breedNameList, positionInfos, financeRefMap, commodityRefMap);
         // 按日期分组
         Map<String, List<FundPositionDetail>> positionMap = positionInfos.stream().collect(Collectors.groupingBy(FundPositionDetail::getDate));
@@ -95,7 +94,7 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
             // 所有品种的近31个交易日日收益率
             List<FutureDailyRet> dataList = dateRetMap.get(k);
             // 得到计算风险贡献的数据,计算风险贡献
-            List<ValueLabelDo> breeds = ListUtil.list(true);
+            List<ValueLabelVO> breeds = ListUtil.list(true);
             List<Double> weightList = ListUtil.list(true);
             double[][] retsMatrix = new double[breedNameList.size()][dateList.size() - 1];
             this.getMatrixData(breedNameList, v, dateList, financeRefMap, commodityRefMap, dataList, breeds, weightList, retsMatrix);
@@ -115,7 +114,7 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
                 .sorted(Comparator.reverseOrder()).limit(31).sorted().collect(Collectors.toList());
     }
 
-    private MarginalRiskContributionVO calcRiskContAndBuildVo(String k, List<ValueLabelDo> breeds, List<Double> weightList, double[][] retsMatrix) {
+    private MarginalRiskContributionVO calcRiskContAndBuildVo(String k, List<ValueLabelVO> breeds, List<Double> weightList, double[][] retsMatrix) {
         int size = weightList.size();
         double[][] covList = this.getCovByRet(retsMatrix);
         double[] realWeightList = new double[size];
@@ -129,7 +128,7 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
 
         List<MarginalRiskContribution> breedRiskContList = ListUtil.list(false);
         for (int i = 0; i < breeds.size(); i++) {
-            ValueLabelDo breed = breeds.get(i);
+            ValueLabelVO breed = breeds.get(i);
             String breedValue = breed.getValue();
             ValueLabelVO asset;
             if (PositionConstants.BOND_BREEDS.contains(breedValue)) {
@@ -155,11 +154,11 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
         return vo;
     }
 
-    private void getMatrixData(List<ValueLabelDo> breedNameList, List<FundPositionDetail> v, List<String> dateList,
-                               Map<ValueLabelDo, List<String>> financeRefMap, Map<ValueLabelDo, List<String>> commodityRefMap,
-                               List<FutureDailyRet> dataList, List<ValueLabelDo> breeds, List<Double> weightList, double[][] retsMatrix) {
+    private void getMatrixData(List<ValueLabelVO> breedNameList, List<FundPositionDetail> v, List<String> dateList,
+                               Map<ValueLabelVO, List<String>> financeRefMap, Map<ValueLabelVO, List<String>> commodityRefMap,
+                               List<FutureDailyRet> dataList, List<ValueLabelVO> breeds, List<Double> weightList, double[][] retsMatrix) {
         for (int i = 0; i < breedNameList.size(); i++) {
-            ValueLabelDo breed = breedNameList.get(i);
+            ValueLabelVO breed = breedNameList.get(i);
             List<String> refIds = ListUtil.list(false);
             List<String> finance = financeRefMap.getOrDefault(breed, ListUtil.empty());
             if (CollUtil.isNotEmpty(finance)) {
@@ -204,7 +203,7 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
         }
     }
 
-    private List<FutureDailyRet> getFutureDailyRets(String k, List<String> dateList, String firstDate, Map<ValueLabelDo, List<String>> financeRefMap, Map<ValueLabelDo, List<String>> commodityRefMap) {
+    private List<FutureDailyRet> getFutureDailyRets(String k, List<String> dateList, String firstDate, Map<ValueLabelVO, List<String>> financeRefMap, Map<ValueLabelVO, List<String>> commodityRefMap) {
         List<FutureDailyRet> dataList = ListUtil.list(false);
         List<String> financeRefIds = financeRefMap.values().stream().flatMap(Collection::stream).distinct().collect(Collectors.toList());
         List<String> commodityRefIds = commodityRefMap.values().stream().flatMap(Collection::stream).distinct().collect(Collectors.toList());
@@ -245,7 +244,7 @@ public class MarginalRiskContributionBizHandler extends AbstractBizHandler<Margi
         return dataList;
     }
 
-    private void distRef(List<ValueLabelDo> breedNameList, List<FundPositionDetail> v, Map<ValueLabelDo, List<String>> financeRefMap, Map<ValueLabelDo, List<String>> commodityRefMap) {
+    private void distRef(List<ValueLabelVO> breedNameList, List<FundPositionDetail> v, Map<ValueLabelVO, List<String>> financeRefMap, Map<ValueLabelVO, List<String>> commodityRefMap) {
         // 遍历品种获取各品种下的合约
         breedNameList.forEach(breed -> {
             String breedValue = breed.getValue();

+ 1 - 2
src/main/java/com/smppw/analysis/application/service/position/stock/BarraSensitivityComponent.java

@@ -6,12 +6,11 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.smppw.analysis.application.dto.position.stock.BarraSensitivityParams;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
+import com.smppw.analysis.infrastructure.consts.BarraStyleRespEnum;
 import com.smppw.common.pojo.ValueLabelVO;
-import com.smppw.common.pojo.enums.BarraStyleRespEnum;
 import com.smppw.common.pojo.enums.RaiseType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;

+ 1 - 1
src/main/java/com/smppw/analysis/application/service/position/stock/RiskExposureBizHandler.java

@@ -10,7 +10,7 @@ import com.smppw.analysis.application.service.position.BizHandlerConstants;
 import com.smppw.analysis.application.service.position.PositionLoadFactory;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
-import com.smppw.common.exception.APIException;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.constants.SecType;
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 1
src/main/java/com/smppw/analysis/application/service/position/stock/StockPerformanceAttributionBizHandler.java

@@ -16,10 +16,10 @@ import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.service.FundPositionAnalysisService;
 import com.smppw.analysis.domain.service.NavService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
+import com.smppw.analysis.infrastructure.consts.RedisConst;
 import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.NavType;
-import com.smppw.constants.RedisConst;
 import com.smppw.constants.SecType;
 import com.smppw.utils.BigDecimalUtils;
 import org.springframework.stereotype.Component;

+ 1 - 1
src/main/java/com/smppw/analysis/application/service/position/synthesize/AssetAllocationBizHandler.java

@@ -13,7 +13,7 @@ import com.smppw.analysis.domain.dao.PubliclyFundPositionDao;
 import com.smppw.analysis.domain.entity.FundPositionBaseInfoDO;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
-import com.smppw.common.exception.APIException;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.constants.SecType;
 import org.springframework.stereotype.Component;

+ 1 - 1
src/main/java/com/smppw/analysis/application/service/position/synthesize/PositionListBizHandler.java

@@ -14,7 +14,7 @@ import com.smppw.analysis.application.service.position.BizHandlerConstants;
 import com.smppw.analysis.application.service.position.PositionLoadFactory;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
-import com.smppw.common.exception.APIException;
+import com.smppw.analysis.infrastructure.exception.APIException;
 import com.smppw.constants.SecType;
 import org.springframework.stereotype.Service;
 

+ 1 - 1
src/main/java/com/smppw/analysis/client/FundPerformanceApi.java

@@ -5,7 +5,7 @@ import com.smppw.analysis.application.dto.performance.IndicatorParams;
 import com.smppw.analysis.application.dto.performance.TrendParams;
 import com.smppw.analysis.application.service.performance.CommonService;
 import com.smppw.analysis.application.service.performance.PerformanceService;
-import com.smppw.common.pojo.vo.ResultVo;
+import com.smppw.common.pojo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;

+ 1 - 1
src/main/java/com/smppw/analysis/client/FundPositionApi.java

@@ -4,7 +4,7 @@ import com.smppw.analysis.application.dto.position.stock.*;
 import com.smppw.analysis.application.dto.position.synthesize.*;
 import com.smppw.analysis.application.service.StockPositionAnalysis;
 import com.smppw.analysis.application.service.SynthesizePositionAnalysis;
-import com.smppw.common.pojo.vo.ResultVo;
+import com.smppw.common.pojo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;

+ 1 - 1
src/main/java/com/smppw/analysis/domain/dao/PrivatelyOfferedFundNavDao.java

@@ -1,11 +1,11 @@
 package com.smppw.analysis.domain.dao;
 
 import com.smppw.analysis.domain.entity.NavDo;
+import com.smppw.analysis.infrastructure.consts.NavConst;
 import com.smppw.analysis.infrastructure.persistence.NavDoMapper;
 import com.smppw.common.pojo.dto.NavDto;
 import com.smppw.common.pojo.enums.NavType;
 import com.smppw.constants.DateConst;
-import com.smppw.constants.NavConst;
 import com.smppw.utils.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;

+ 1 - 1
src/main/java/com/smppw/analysis/domain/dao/PubliclyOfferedFundNavDao.java

@@ -1,11 +1,11 @@
 package com.smppw.analysis.domain.dao;
 
 import com.smppw.analysis.domain.entity.PublicNavDo;
+import com.smppw.analysis.infrastructure.consts.NavConst;
 import com.smppw.analysis.infrastructure.persistence.PublicNavDoMapper;
 import com.smppw.common.pojo.dto.NavDto;
 import com.smppw.common.pojo.enums.NavType;
 import com.smppw.constants.DateConst;
-import com.smppw.constants.NavConst;
 import com.smppw.utils.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;

+ 62 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/BarrConstant.java

@@ -0,0 +1,62 @@
+package com.smppw.analysis.infrastructure.consts;
+
+/**
+ * barra因子相关的常量
+ * @author lwq
+ */
+public final class BarrConstant {
+
+    private BarrConstant(){}
+
+    /**
+     * 计算给定时间段的总的业绩归因
+     */
+    public static final int CONTROL_ZERO = 0;
+
+    /**
+     * 计算给定时间段的各个时间点上的的所有Beta值和因子业绩归因
+     */
+    public static final int CONTROL_ONE = 1;
+
+    /**
+     * 敏感度趋势
+     */
+    public static final int CONTROL_TWO = 2;
+
+    /**
+     * 查询因子时固定的参数顺序
+     */
+    public static final String BARRA_FACTOR_INDEXS = "beta_book-to-price-ratio_earnings-yield_growth_leverage_liquidity_momentum_non-linear-size_residual-volatility_size";
+    public static final String FUTURE_INDEXS = "ts22_cs5_cs22_skew22_skew66_ts5_wh22_cv22_tr22_basis22_vol5_vol22";
+
+    /**
+     * 股票池为全市场
+     */
+    public static final String POOL_CACHE_ALL = "all_market";
+
+    /**
+     * 请求Python的URL
+     */
+    public static final String FACTOR_URL = "getBarraSensitivity";
+
+    public static final String FUTURE_URL = "futuresStyle";
+
+    /**
+     * R的方
+     */
+    public static final String R_SQUARED = "r_squared";
+
+    public static final String RSQUARED_S = "rSquared";
+
+    public static final String PRODUCT = "product";
+
+    public static final String EXPOSE = "expose";
+
+    public static final String STATUS = "status";
+
+    public static final String END_DATE = "end_date";
+    public static final String SPECIAL_FACTOR_RET = "special_factor_ret";
+    public static final String NAV_R_SQUARED = "nav_r_squared";
+
+
+}

+ 48 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/BarraRiskProfitEnum.java

@@ -0,0 +1,48 @@
+package com.smppw.analysis.infrastructure.consts;
+
+/**
+ * @author Rain
+ * @date 2023/3/14 23:05
+ * @description
+ */
+public enum BarraRiskProfitEnum {
+
+    PRODUCT_RET(1, "productRet", "product_ret", "产品波动率", "产品收益率"),
+    SPECIAL_FACTOR_RET(2, "specialFactorRet", "special_factor_ret", "特质因子贡献波动率", "特质因子贡献收益率"),
+    MARKET_RET(3, "marketRet", "market_ret", "风格因子贡献波动率", "风格因子贡献收益率"),
+    R_SQUARE(4, "r2", "r_squared", "R2值", "R2值");
+
+    BarraRiskProfitEnum(int type, String key, String code, String risk, String profit) {
+        this.type = type;
+        this.key = key;
+        this.code = code;
+        this.risk = risk;
+        this.profit = profit;
+    }
+
+    private final int type;
+    private final String key;
+    private final String code;
+    private final String risk;
+    private final String profit;
+
+    public int getType() {
+        return type;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getRisk() {
+        return risk;
+    }
+
+    public String getProfit() {
+        return profit;
+    }
+}

+ 71 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/BarraStyleRespEnum.java

@@ -0,0 +1,71 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import lombok.Getter;
+
+@Getter
+public enum BarraStyleRespEnum {
+    //beta_book-to-price-ratio_earnings-yield_growth_leverage_liquidity_momentum_non-linear-size_residual-volatility_size
+    BETA(1,2,"beta","贝塔","beta因子"),
+    BOOKTOPRICERATIO(2,10,"bookToPriceRatio","账面市值比","账面市值比因子"),
+    EARNINGSYIELD(3,9,"earningsYield","盈利率","盈利预期因子"),
+    GROWTH(4,4,"growth","成长性","成长因子"),
+    LEVERAGE(5,6,"leverage","杠杆率","杠杆因子"),
+    LIQUIDITY(6,1,"liquidity","流动性","流动性因子"),
+    MOMENTUM(7,5,"momentum","动量","动量因子"),
+    NONLINEARSIZE(8,7,"nonLinearSize","非线性市值","非线性市值因子"),
+    RESIDUALVOLATILITY(9,3,"residualVolatility","残差波动率","残差波动因子"),
+    SIZE(10,8,"size","规模","市值因子"),
+    ;
+
+    private Integer num;
+    private Integer posNum;
+    private String name;
+    private String cName;
+    private String yName;
+
+    BarraStyleRespEnum(Integer num, Integer posNum, String name, String cName, String yName) {
+        this.num = num;
+        this.posNum = posNum;
+        this.name = name;
+        this.cName = cName;
+        this.yName = yName;
+    }
+
+    public static String getBarrCname(int num){
+        for (BarraStyleRespEnum barrNum : BarraStyleRespEnum.values()){
+            if (barrNum.getNum() == num) {
+                return barrNum.getCName();
+            }
+        }
+        return "";
+    }
+
+    public static BarraStyleRespEnum getBarrEnum(int num){
+        for (BarraStyleRespEnum barrNum : BarraStyleRespEnum.values()){
+            if (barrNum.getNum().intValue() == num) {
+                return barrNum;
+            }
+        }
+        return null;
+    }
+
+    public static BarraStyleRespEnum getBarrEnumPos(int posNum){
+        for (BarraStyleRespEnum barrNum : BarraStyleRespEnum.values()){
+            if (barrNum.getPosNum().intValue() == posNum) {
+                return barrNum;
+            }
+        }
+        return null;
+    }
+
+
+    public static String getBarrYNameByName(String name){
+        for (BarraStyleRespEnum barrNum : BarraStyleRespEnum.values()){
+            if (barrNum.getName().equals(name)) {
+                return barrNum.getYName();
+            }
+        }
+        return "";
+    }
+
+}

+ 50 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/FutureStyleRespEnum.java

@@ -0,0 +1,50 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import lombok.Getter;
+
+@Getter
+public enum FutureStyleRespEnum {
+    //ts22_cs5_cs22_skew22_skew66_ts5_wh22_cv22_tr22_basis22_vol5_vol22
+    TS22(1,"ts22","时序动量因子"),
+    CS5(2,"cs5","短周期截面动量因子"),
+    CS22(3,"cs22","截面动量因子"),
+    SKEW22(4,"skew22","偏度因子"),
+    SKEW66(5,"skew66","长周期偏度因子"),
+    TS5(6,"ts5","短周期时序动量因子"),
+    WH22(7,"wh22","仓单因子"),
+    CV22(8,"cv22","基差因子"),
+    TR22(9,"tr22","展期收益率因子"),
+    BASIS22(10,"basis22","基差动量因子"),
+    VOL5(11,"vol5","短周期波动因子"),
+    VOL22(12,"vol22","波动因子"),
+    ;
+
+    private Integer num;
+    private String name;
+    private String cName;
+
+    FutureStyleRespEnum(Integer num, String name, String cName) {
+        this.num = num;
+        this.name = name;
+        this.cName = cName;
+    }
+
+    public static String getFutureCname(int num){
+        for (FutureStyleRespEnum futureNum : FutureStyleRespEnum.values()){
+            if (futureNum.getNum() == num) {
+                return futureNum.getCName();
+            }
+        }
+        return "";
+    }
+
+    public static String getFutureName(int num){
+        for (FutureStyleRespEnum futureNum : FutureStyleRespEnum.values()){
+            if (futureNum.getNum() == num) {
+                return futureNum.getName();
+            }
+        }
+        return "";
+    }
+
+}

+ 25 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/IndustryType.java

@@ -0,0 +1,25 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import java.util.stream.Stream;
+
+/**
+ * @author zhengsongliang
+ * @datetime 2017年8月7日 下午4:22:10
+ */
+public enum IndustryType {
+	CSI10(1), CITIC5(2),ShenWan(3);
+	private int id;
+
+	private IndustryType(int id) {
+		this.id = id;
+	}
+
+	public static IndustryType getIndustryIndexByNum(int id) {
+		return Stream.of(IndustryType.values()).filter(e -> e.id == id).findFirst().orElse(null);
+	}
+
+	public int getId() {
+		return id;
+	}
+
+}

+ 9 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/NavConst.java

@@ -0,0 +1,9 @@
+package com.smppw.analysis.infrastructure.consts;
+
+public class NavConst {
+
+    public final static String CUMULATIVE_NAV_SQL_FIELD = "cumulative_nav";
+    public final static String COMBINATION_CUMULATIVE_NAV_SQL_FIELD = "cm_cumulative_nav";
+    public final static String NAV_SQL_FIELD = "nav";
+    public final static String CUMULATIVE_NAV_WITHDRAWAL_SQL_FIELD = "cumulative_nav_withdrawal";
+}

+ 32 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/OptionsType.java

@@ -0,0 +1,32 @@
+package com.smppw.analysis.infrastructure.consts;
+
+/**
+ * @author fwz
+ * @date 2023/2/16 17:40
+ * @description
+ */
+public enum OptionsType {
+    ETF50("MF00003UC2","华夏上证50ETF"),
+    ZHONGZHENG1000("SE000040MY", "中证1000"),
+    HUSHEN300("SE0000E4CC", "沪深300"),
+    HUATAI300ETF("MF00003UAZ","华泰300ETF"),
+    JIASHI300ETF("MF00003TGP", "嘉实沪深300ETF"),
+    NANFANG500ETF("MF00003UB7", "南方500ETF"),
+    JIASHI500ETF("MF00003TGS", "嘉实中证500ETF");
+
+    private final String secId;
+    private final String name;
+
+    OptionsType(String secId, String name) {
+        this.secId = secId;
+        this.name = name;
+    }
+
+    public String getSecId() {
+        return secId;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 27 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/RBSAIndexType.java

@@ -0,0 +1,27 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import java.util.stream.Stream;
+
+/**
+ * 
+ * @author diaofan
+ * @date 2017年11月8日 下午3:52:24
+ * @description
+ */
+public enum RBSAIndexType {
+	CNI7Style(1), CNI3Style(2), CNI7Strategy(3), CSI11(4), CITIC6(5), RZ5Strategy(7), Large4Assets(
+			8), SegmentationAsset(10), ShenWan(9);
+	private int id;
+
+	private RBSAIndexType(int id) {
+		this.id = id;
+	}
+
+	public static RBSAIndexType getRbsaIndexs(int id) {
+		return Stream.of(RBSAIndexType.values()).filter(e -> e.id == id).findFirst().orElse(null);
+	}
+
+	public int getId() {
+		return id;
+	}
+}

+ 75 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/RBSAIndexTypeMap.java

@@ -0,0 +1,75 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import cn.hutool.core.map.MapUtil;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class RBSAIndexTypeMap {
+    private static RBSAIndexTypeMap instance;
+    private final Map<RBSAIndexType, List<String>> map = MapUtil.newHashMap();
+
+    private RBSAIndexTypeMap() {
+        map.put(RBSAIndexType.CNI7Style, Arrays.asList("IN0000000S", "IN0000000T", "IN0000000W", "IN0000000X",
+                "IN0000000U", "IN0000000V"));
+        map.put(RBSAIndexType.CNI3Style, Arrays.asList("IN0000001T", "IN0000001U"));
+        map.put(RBSAIndexType.CNI7Strategy, Arrays.asList("IN00000020", "IN00000021", "IN00000022", "IN00000023",
+                "IN00000024", "IN00000025"));
+        map.put(RBSAIndexType.CSI11, Arrays.asList("IN0000000Y", "IN0000000Z", "IN00000010", "IN00000011", "IN00000012",
+                "IN00000013", "IN00000014", "IN00000015", "IN00000016", "IN00000017"));
+        map.put(RBSAIndexType.CITIC6,
+                Arrays.asList("IN0000001V", "IN0000001W", "IN0000001X", "IN0000001Y", "IN0000001Z"));
+        map.put(RBSAIndexType.RZ5Strategy,
+                Arrays.asList("IN0000001B", "IN0000001H", "IN0000001E", "IN0000001G"));
+        map.put(RBSAIndexType.Large4Assets, Arrays.asList("IN00000008", "IN000002C0", "IN0000008S"));
+
+        //细分指数: 沪深300,中证500,中证1000,恒生指数,中证海外(不含香港),中债总指数,南华商品指数,现金
+        map.put(RBSAIndexType.SegmentationAsset,
+                Arrays.asList("IN00000008", "IN0000007M", "IN0000008O", "IN00000009", "IN00000284", "IN000002C0", "IN0000008S"));
+
+        map.put(RBSAIndexType.ShenWan,
+                Arrays.asList("IN000002D1",
+                        "IN000002D0",
+                        "IN000002CZ",
+                        "IN000002CY",
+                        "IN000000OX",
+                        "IN000000OW",
+                        "IN000000OV",
+                        "IN000000OU",
+                        "IN000000OT",
+                        "IN000000OS",
+                        "IN000000OR",
+                        "IN000000OQ",
+                        "IN000000OP",
+                        "IN000000OO",
+                        "IN000000ON",
+                        "IN000000OM",
+                        "IN000000OL",
+                        "IN000000OK",
+                        "IN000000OJ",
+                        "IN000000OI",
+                        "IN000000OH",
+                        "IN000000OG",
+                        "IN000000OF",
+                        "IN000000OE",
+                        "IN000000OD",
+                        "IN000000OC",
+                        "IN000000OB",
+                        "IN000000OA",
+                        "IN000000O9",
+                        "IN000000O8",
+                        "IN000000O6"));
+    }
+
+    public synchronized static RBSAIndexTypeMap getInstance() {
+        if (null == instance) {
+            instance = new RBSAIndexTypeMap();
+        }
+        return instance;
+    }
+
+    public List<String> getIndexIds(RBSAIndexType tIndexType) {
+        return map.get(tIndexType);
+    }
+}

+ 68 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/RedisConst.java

@@ -0,0 +1,68 @@
+package com.smppw.analysis.infrastructure.consts;
+
+/**
+ * @author Rain
+ * @date 2023/3/26 14:31
+ * @description redis相关的前缀或者后缀key 在此统一维护
+ */
+public final class RedisConst {
+    /**
+     * 用户中心登录成功后生成token用于后续验权
+     */
+    public static final String USER_CENTER_TOKEN_KEY = "user_center_token_key:";
+    /**
+     * 全局搜索历史记录缓存
+     */
+    public static final String SEARCH_HISTORY = "search_history:";
+    /**
+     * 获取基金分布式锁key
+     */
+    public static final String GENERATE_FUND_ID_KEY = "fundId:generate";
+    /**
+     * 获取缓存基金最大值key
+     */
+    public static final String MAX_FUND_ID = "fundId:max";
+    /**
+     * 获取组合分布式锁key
+     */
+    public static final String GENERATE_PORTFOLIO_ID_KEY = "portfolioId:generate";
+    /**
+     * 获取缓存组合最大值key
+     */
+    public static final String MAX_PORTFOLIO_ID = "portfolioId:max";
+    /**
+     * 存储和获取组合拟合净值任务key
+     */
+    public static final String PORTFOLIO_NAV_TASK_KEY = "portfolio:nav:task:";
+
+
+    // -------------- 基金持仓分析key 和 超时时间 -------------------------------
+
+
+    public static final long POSITION_MONTH_TTL = 28 * 24 * 60 * 60L;
+    public static final long POSITION_YEAR_TTL = 365 * 24 * 60 * 60L;
+    public static final long POSITION_DAY_TTL = 24 * 60 * 60L;
+
+    /**
+     * (沪深300、中证500和中证1000)成分股占比,原则上每月更新一次,目前先设置超时时间28天
+     * todo 提供接口在成分股更新时刷新缓存
+     */
+    public static final String POSITION_INDEX_WEIGHT_KEY = "position:index:weight:";
+    /**
+     * 所有股票与行业对应关系,每天都有更新,设置超时时间1天
+     * todo 做一个定时任务每天预缓存该数据
+     */
+    public static final String POSITION_STOCK_INDUSTRY_KEY = "position:stock:industry";
+    /**
+     * 估值表详情信息
+     * todo 基金估值表解析时要更新
+     */
+    public static final String POSITION_DETAIL_KEY = "position:detail:";
+    /**
+     * 市场上的股票收盘价缓存,A股(沪深、创业板),缓存一年吧
+     */
+    public static final String POSITION_STOCK_PRICE_KEY = "position:stock:price";
+
+    private RedisConst() {
+    }
+}

+ 24 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/ValueGrowthType.java

@@ -0,0 +1,24 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import java.util.stream.Stream;
+
+/**
+ * @author zhengsongliang
+ * @datetime 2017年8月7日 下午4:27:35
+ */
+public enum ValueGrowthType {
+	CNI6Style(1), CNI2Style(2),CNI6Strategy(3);
+	private int id;
+
+	private ValueGrowthType(int id) {
+		this.id=id;
+	}
+	public int getId() {
+		return id;
+	}
+
+	public static ValueGrowthType getAllocationIndex(int id) {
+		return Stream.of(ValueGrowthType.values()).filter(e -> e.id == id).findFirst().orElse(null);
+	}
+	
+}

+ 23 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/WinRateBmk.java

@@ -0,0 +1,23 @@
+package com.smppw.analysis.infrastructure.consts;
+
+import java.util.stream.Stream;
+
+/**
+ * @author zhengsongliang
+ */
+public enum WinRateBmk {
+	Benchmark(1), Zero(2),AssetModel(3);
+	private final int id;
+
+	WinRateBmk(int id) {
+		this.id = id;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public static WinRateBmk getWinningRateBmk(int id) {
+		return Stream.of(WinRateBmk.values()).filter(e -> e.id == id).findFirst().orElse(null);
+	}
+}

+ 28 - 0
src/main/java/com/smppw/analysis/infrastructure/exception/APIException.java

@@ -0,0 +1,28 @@
+package com.smppw.analysis.infrastructure.exception;
+
+import com.smppw.common.pojo.enums.status.ResultCode;
+import com.smppw.common.pojo.enums.status.StatusCode;
+import lombok.Getter;
+
+@Getter
+public class APIException extends RuntimeException {
+    private final int code;
+    private final String msg;
+
+    // 手动设置异常
+    public APIException(StatusCode statusCode, String message) {
+        // message用于用户设置抛出错误详情,例如:当前价格-5,小于0
+        super(message);
+        // 状态码
+        this.code = statusCode.getCode();
+        // 状态码配套的msg
+        this.msg = statusCode.getMsg();
+    }
+
+    // 默认异常使用APP_ERROR状态码
+    public APIException(String message) {
+        super(message);
+        this.code = ResultCode.COMMON_ERROR.getCode();
+        this.msg = message;
+    }
+}

+ 23 - 0
src/main/java/com/smppw/analysis/infrastructure/exception/DataException.java

@@ -0,0 +1,23 @@
+package com.smppw.analysis.infrastructure.exception;
+
+import com.smppw.common.pojo.enums.status.ResultCode;
+
+/**
+ * @author Rain
+ * @date 2023/4/6 18:02
+ * @description
+ */
+public class DataException extends RuntimeException {
+
+    private static final long serialVersionUID = 8706998320785170500L;
+    private final int code = ResultCode.DATA_PRE_SHOW_MESSAGE_ERROR.getCode();
+
+    public DataException(String message) {
+        super(message);
+    }
+
+
+    public int getCode() {
+        return code;
+    }
+}

+ 2 - 2
src/main/java/com/smppw/analysis/infrastructure/persistence/BaseUnderlyingMapper.java

@@ -1,7 +1,7 @@
 package com.smppw.analysis.infrastructure.persistence;
 
 import com.smppw.analysis.domain.entity.*;
-import com.smppw.common.pojo.ValueLabelDo;
+import com.smppw.common.pojo.ValueLabelVO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -94,5 +94,5 @@ public interface BaseUnderlyingMapper {
      */
     List<FutureDailyPriceDO> getFinanceSecClosePrice(@Param("secCodes") List<String> secCodes, @Param("startDate") String valuationDate, @Param("endDate") String endDate);
 
-    List<ValueLabelDo> getOptionTypeList();
+    List<ValueLabelVO> getOptionTypeList();
 }

+ 43 - 0
src/main/java/com/smppw/analysis/infrastructure/utils/QuartileUtil.java

@@ -0,0 +1,43 @@
+package com.smppw.analysis.infrastructure.utils;
+
+/**
+ * @author Rain
+ * @date 2023/5/15 19:13
+ * @description
+ */
+public class QuartileUtil {
+
+    /**
+     * 根据相对排名计算 四分位
+     *
+     * @param absrank
+     * @return
+     */
+    public static String handleQuartile(String absrank) {
+        if (absrank != null && absrank.contains("/")) {
+            String[] split = absrank.split("/");
+            int rank = Integer.parseInt(split[0]);
+            int total = Integer.parseInt(split[1]);
+            return handleQuartile(rank, total);
+        }
+        return null;
+    }
+
+    public static String handleQuartile(Integer rank, Integer total) {
+        if (rank == null || total == null) {
+            return null;
+        }
+        int average = total / 4;
+        if (rank <= average) {
+            return "4";
+        } else if (rank <= average * 2) {
+            return "3";
+        } else if (rank <= average * 3) {
+            return "2";
+        } else if (rank <= total) {
+            return "1";
+        } else {
+            return null;
+        }
+    }
+}

+ 1 - 1
src/main/resources/mapping/BaseUnderlyingMapper.xml

@@ -157,7 +157,7 @@
         </foreach>
     </select>
 
-    <select id="getOptionTypeList" resultType="com.smppw.common.pojo.ValueLabelDo">
+    <select id="getOptionTypeList" resultType="com.smppw.common.pojo.ValueLabelVO">
         select distinct a.trading_code as value, a.product_name as label from product_trading_mapping a where a.isvalid = 1
     </select>
 </mapper>