Ver Fonte

fix:依赖升级,代码优化,提供job的指标计算方法

wangzaijun há 10 meses atrás
pai
commit
6cb890af3d
88 ficheiros alterados com 718 adições e 852 exclusões
  1. 6 6
      pom.xml
  2. 1 1
      src/main/java/com/smppw/common/pojo/dto/indicator/CalcMultipleSecMultipleTimeRangeIndicatorReq.java
  3. 1 1
      src/main/java/com/smppw/common/pojo/enums/CurveType.java
  4. 1 1
      src/main/java/com/smppw/common/pojo/IStrategy.java
  5. 1 1
      src/main/java/com/smppw/common/pojo/NewPublicSubStrategy.java
  6. 42 41
      src/main/java/com/smppw/common/pojo/NewSubStrategy.java
  7. 1 1
      src/main/java/com/smppw/common/pojo/PublicSubStrategyFullName.java
  8. 220 223
      src/main/java/com/smppw/common/pojo/enums/strategy/Strategy.java
  9. 0 69
      src/main/java/com/smppw/common/pojo/enums/strategy/SubStrategy.java
  10. 0 72
      src/main/java/com/smppw/common/pojo/enums/strategy/SysStrategy.java
  11. 0 2
      src/main/java/com/smppw/common/pojo/enums/strategy/ThirdStrategy.java
  12. 2 0
      src/main/java/com/smppw/constants/IndicatorConst.java
  13. 161 199
      src/main/java/com/smppw/core/IndicatorService.java
  14. 2 2
      src/main/java/com/smppw/core/reta/IndicatorFactory.java
  15. 1 1
      src/main/java/com/smppw/core/reta/Rate.java
  16. 3 3
      src/main/java/com/smppw/core/reta/calc/Alpha.java
  17. 3 3
      src/main/java/com/smppw/core/reta/calc/AnnualReturn.java
  18. 5 5
      src/main/java/com/smppw/core/reta/calc/AnnualReturnAlg.java
  19. 2 2
      src/main/java/com/smppw/core/reta/calc/AnnualStdDev.java
  20. 2 2
      src/main/java/com/smppw/core/reta/calc/BestRet.java
  21. 2 2
      src/main/java/com/smppw/core/reta/calc/Beta.java
  22. 19 13
      src/main/java/com/smppw/core/reta/calc/CalmarRatio.java
  23. 2 2
      src/main/java/com/smppw/core/reta/calc/DownCaptureRatio.java
  24. 2 2
      src/main/java/com/smppw/core/reta/calc/DownCaptureReturn.java
  25. 3 3
      src/main/java/com/smppw/core/reta/calc/DownsideDeviation.java
  26. 2 2
      src/main/java/com/smppw/core/reta/calc/DownsideStdDev.java
  27. 3 3
      src/main/java/com/smppw/core/reta/calc/ExcessAnnualAriIntervalReturn.java
  28. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessAriIntervalReturn.java
  29. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturn.java
  30. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnAnnualStdDevExtra.java
  31. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnAnnualized.java
  32. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnCalmarRatio.java
  33. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnDownsideStdDev.java
  34. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnDynamic.java
  35. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnLongestNoNewHighDays.java
  36. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdown.java
  37. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownNav.java
  38. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownRecureDateExtra.java
  39. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownRecureIntervalExtra.java
  40. 3 3
      src/main/java/com/smppw/core/reta/calc/ExcessReturnRealTimeCalc.java
  41. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnSharpeRatio.java
  42. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnSharpeRatioExtra.java
  43. 2 2
      src/main/java/com/smppw/core/reta/calc/ExcessReturnSortinoRatio.java
  44. 1 1
      src/main/java/com/smppw/core/reta/calc/ExtraNav.java
  45. 2 2
      src/main/java/com/smppw/core/reta/calc/HistoricalCVaR.java
  46. 2 2
      src/main/java/com/smppw/core/reta/calc/HistoricalVaR.java
  47. 3 4
      src/main/java/com/smppw/core/reta/calc/Hurst.java
  48. 11 5
      src/main/java/com/smppw/core/reta/calc/InformationRatio.java
  49. 2 2
      src/main/java/com/smppw/core/reta/calc/IntervalReturn.java
  50. 3 3
      src/main/java/com/smppw/core/reta/calc/Jensen.java
  51. 12 7
      src/main/java/com/smppw/core/reta/calc/Kappa.java
  52. 2 2
      src/main/java/com/smppw/core/reta/calc/Kurtosis.java
  53. 1 1
      src/main/java/com/smppw/core/reta/calc/LPM.java
  54. 2 2
      src/main/java/com/smppw/core/reta/calc/LongestNoNewHighDays.java
  55. 3 3
      src/main/java/com/smppw/core/reta/calc/M2.java
  56. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxContinuouslyDrawdownCount.java
  57. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdown.java
  58. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownInterval.java
  59. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownPeakDate.java
  60. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureDate.java
  61. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureInterval.java
  62. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureIntervalDays.java
  63. 2 2
      src/main/java/com/smppw/core/reta/calc/MaxDrawdownValleyDate.java
  64. 12 5
      src/main/java/com/smppw/core/reta/calc/Omega.java
  65. 23 25
      src/main/java/com/smppw/core/reta/calc/PerformanceConsistency.java
  66. 2 2
      src/main/java/com/smppw/core/reta/calc/ProfitLossRatio.java
  67. 2 2
      src/main/java/com/smppw/core/reta/calc/RangeReturn.java
  68. 3 3
      src/main/java/com/smppw/core/reta/calc/SMDDCVaR.java
  69. 2 2
      src/main/java/com/smppw/core/reta/calc/SMDDLPM1.java
  70. 2 2
      src/main/java/com/smppw/core/reta/calc/SMDDLPM2.java
  71. 2 2
      src/main/java/com/smppw/core/reta/calc/SMDDVaR.java
  72. 16 11
      src/main/java/com/smppw/core/reta/calc/SharpeRatio.java
  73. 2 2
      src/main/java/com/smppw/core/reta/calc/SingleMaxDrawdown.java
  74. 2 2
      src/main/java/com/smppw/core/reta/calc/Skewness.java
  75. 14 9
      src/main/java/com/smppw/core/reta/calc/SortinoRatio.java
  76. 16 8
      src/main/java/com/smppw/core/reta/calc/SortinoRatioMAR.java
  77. 2 2
      src/main/java/com/smppw/core/reta/calc/TrackingError.java
  78. 17 9
      src/main/java/com/smppw/core/reta/calc/TreynorRatio.java
  79. 2 2
      src/main/java/com/smppw/core/reta/calc/UpCaptureRatio.java
  80. 2 2
      src/main/java/com/smppw/core/reta/calc/UpCaptureReturn.java
  81. 1 1
      src/main/java/com/smppw/core/reta/calc/VaRFunction.java
  82. 2 2
      src/main/java/com/smppw/core/reta/calc/WinRate.java
  83. 2 2
      src/main/java/com/smppw/core/reta/calc/WinRateWithZero.java
  84. 2 2
      src/main/java/com/smppw/core/reta/calc/WorstRet.java
  85. 2 2
      src/main/java/com/smppw/core/reta/calc/XIRR.java
  86. 1 1
      src/main/java/com/smppw/utils/FunctionUtil.java
  87. 3 3
      src/main/java/com/smppw/utils/IndicatorCalcUtil.java
  88. 4 4
      src/main/java/com/smppw/utils/StrategyHandleUtils.java

+ 6 - 6
pom.xml

@@ -6,17 +6,17 @@
 
     <groupId>com.smppw</groupId>
     <artifactId>data-calc</artifactId>
-    <version>0.1.7-SNAPSHOT</version>
+    <version>0.1.8-SNAPSHOT</version>
 
     <properties>
         <maven.compiler.source>17</maven.compiler.source>
         <maven.compiler.target>17</maven.compiler.target>
-        <lombok-version>1.18.26</lombok-version>
-        <hutool-version>5.8.12</hutool-version>
+        <lombok-version>1.18.34</lombok-version>
+        <hutool-version>5.8.31</hutool-version>
         <common-math3-version>3.6.1</common-math3-version>
-        <common-lang3-version>3.12.0</common-lang3-version>
-        <caffeine-version>2.8.8</caffeine-version>
-        <joda-version>2.10.13</joda-version>
+        <common-lang3-version>3.16.0</common-lang3-version>
+        <caffeine-version>3.1.8</caffeine-version>
+        <joda-version>2.12.7</joda-version>
     </properties>
 
     <dependencies>

+ 1 - 1
src/main/java/com/smppw/common/pojo/dto/indicator/CalcMultipleSecMultipleTimeRangeIndicatorReq.java

@@ -1,6 +1,6 @@
 package com.smppw.common.pojo.dto.indicator;
 
-import com.smppw.common.pojo.IStrategy;
+import com.smppw.common.pojo.enums.strategy.IStrategy;
 import com.smppw.common.pojo.enums.*;
 import lombok.Builder;
 import lombok.Data;

+ 1 - 1
src/main/java/com/smppw/common/pojo/enums/CurveType.java

@@ -1,6 +1,6 @@
 package com.smppw.common.pojo.enums;
 
-import com.smppw.common.pojo.IStrategy;
+import com.smppw.common.pojo.enums.strategy.IStrategy;
 import com.smppw.common.pojo.enums.strategy.Strategy;
 
 import java.util.Arrays;

+ 1 - 1
src/main/java/com/smppw/common/pojo/IStrategy.java

@@ -1,4 +1,4 @@
-package com.smppw.common.pojo;
+package com.smppw.common.pojo.enums.strategy;
 
 /**
  * @author Rain

+ 1 - 1
src/main/java/com/smppw/common/pojo/NewPublicSubStrategy.java

@@ -1,4 +1,4 @@
-package com.smppw.common.pojo;
+package com.smppw.common.pojo.enums.strategy;
 
 import java.util.stream.Stream;
 

+ 42 - 41
src/main/java/com/smppw/common/pojo/NewSubStrategy.java

@@ -1,35 +1,35 @@
-package com.smppw.common.pojo;
+package com.smppw.common.pojo.enums.strategy;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Stream;
 
 // 新策略 - 第二级策略
-public enum NewSubStrategy implements IStrategy{
+public enum NewSubStrategy implements IStrategy {
     OtherStrategy(-1, "其他策略", "", "IN00000008"), /**/
-    EquityLongOnly(100101, "主观多头", "IN000002D7", "IN00000008"), /**/
-    EquityQuantitative(100102, "量化多头", "IN000002D8", "IN00000008"), /**/
-    EquityLongShort(100103, "股票多空", "IN000002D9", "IN00000008"), /**/
-    EquityNeutral(100104, "股票市场中性", "IN000002DA", "IN00000008"), /**/
-    BondPure(100201, "纯债策略", "IN000002DB", "IN00000077"), /**/
-    BondStrong(100202, "债券增强", "IN000002DC", "IN00000077"), /**/
-    BondMultiple(100203, "债券复合", "IN000002DD", "IN00000077"), /**/
-    CnvtbBondTrd(100204, "转债交易策略", "IN000002DE", "IN0000008J"),
-    ActMgtFut(100301, "主观CTA", "IN000002DF", "IN0000008S"),
-    MgtFutQuant(100302, "量化CTA", "IN000002DG", "IN0000008S"),
-    OptionStrgy(100303, "期权策略", "IN000002DH", "IN0000008S"),
-    OtherFutures(100304, "其他衍生品策略", "IN000002DI", "IN0000008S"),
-    MacroStrgy(100401, "宏观策略", "IN000002DJ", "IN00000008"),
-    ArbitrageStrgy(100402, "套利策略", "IN000002DK", "IN00000008"),
-    CombinedStrgy(100403, "复合策略", "IN000002DL", "IN00000008"),
-    SubFOF(100501, "FOF", "IN000002DM", "IN00000008"), /**/
-    MOM(100502, "MOM", "IN000002DN", "IN00000008"),
+    EquityLongOnly(100101, "主观多头", "IN000002FP", "IN00000008"), /**/
+    EquityQuantitative(100102, "量化多头", "IN000002FQ", "IN00000008"), /**/
+    EquityLongShort(100103, "股票多空", "IN000002FR", "IN00000008"), /**/
+    EquityNeutral(100104, "股票市场中性", "IN000002FS", "IN00000008"), /**/
+    BondPure(100201, "纯债策略", "IN000002FT", "IN00000077"), /**/
+    BondStrong(100202, "债券增强", "IN000002FU", "IN00000077"), /**/
+    BondMultiple(100203, "债券复合", "IN000002FV", "IN00000077"), /**/
+    CnvtbBondTrd(100204, "转债交易策略", "IN000002FW", "IN0000008J"),
+    ActMgtFut(100301, "主观CTA", "IN000002FX", "IN0000008S"),
+    MgtFutQuant(100302, "量化CTA", "IN000002FY", "IN0000008S"),
+    OptionStrgy(100303, "期权策略", "IN000002FZ", "IN0000008S"),
+    //    OtherFutures(100304, "其他衍生品策略", "IN000002DI", "IN0000008S"),
+    MacroStrgy(100401, "宏观策略", "IN000002G0", "IN00000008"),
+    ArbitrageStrgy(100402, "套利策略", "IN000002G1", "IN00000008"),
+    CombinedStrgy(100403, "复合策略", "IN000002G2", "IN00000008"),
+    SubFOF(100501, "FOF", "IN000002G3", "IN00000008"), /**/
+    MOM(100502, "MOM", "IN000002G4", "IN00000008"),
     ; /**/
 
 
     public static final List<NewSubStrategy> STRATEGY_LIST = Arrays.asList(EquityLongOnly, EquityQuantitative, EquityLongShort, EquityNeutral,
             BondPure, BondStrong,
-            BondMultiple, CnvtbBondTrd, ActMgtFut, MgtFutQuant, OptionStrgy, OtherFutures,MacroStrgy,ArbitrageStrgy,CombinedStrgy, SubFOF,MOM);
+            BondMultiple, CnvtbBondTrd, ActMgtFut, MgtFutQuant, OptionStrgy, MacroStrgy, ArbitrageStrgy, CombinedStrgy, SubFOF, MOM);
 
     private Integer id;
     private String nameDesc;
@@ -43,31 +43,16 @@ public enum NewSubStrategy implements IStrategy{
         this.benchmark = benchmark;
     }
 
-    public Integer getId() {
-        return id;
-    }
-    public String getNameDesc() {
-        return nameDesc;
-    }
-
-    public String getRongZhiIndex() {
-        return rongZhiIndex;
-    }
-
-    public String getBenchmark() {
-        return benchmark;
-    }
-
     public static NewSubStrategy getSubStrategy(int id) {
         return Stream.of(NewSubStrategy.values()).filter(e -> e.id == id).findFirst().orElse(null);
     }
 
     public static NewSubStrategy getStrategyByName(String name) {
-        if (null == name){
+        if (null == name) {
             return null;
         }
-        for(NewSubStrategy s : NewSubStrategy.values()){
-            if(name.equals(s.getNameDesc()+"")){
+        for (NewSubStrategy s : NewSubStrategy.values()) {
+            if (name.equals(s.getNameDesc() + "")) {
                 return s;
             }
         }
@@ -75,11 +60,11 @@ public enum NewSubStrategy implements IStrategy{
     }
 
     public static NewSubStrategy getStrategyByN(String name) {
-        if (null == name){
+        if (null == name) {
             return null;
         }
-        for(NewSubStrategy s : NewSubStrategy.values()){
-            if(name.equals(s.name())){
+        for (NewSubStrategy s : NewSubStrategy.values()) {
+            if (name.equals(s.name())) {
                 return s;
             }
         }
@@ -90,6 +75,22 @@ public enum NewSubStrategy implements IStrategy{
         return Stream.of(NewSubStrategy.values()).filter(e -> e.id.equals(id)).findFirst().orElse(null);
     }
 
+    public Integer getId() {
+        return id;
+    }
+
+    public String getNameDesc() {
+        return nameDesc;
+    }
+
+    public String getRongZhiIndex() {
+        return rongZhiIndex;
+    }
+
+    public String getBenchmark() {
+        return benchmark;
+    }
+
     @Override
     public Integer getStrategyId() {
         return this.getId();

+ 1 - 1
src/main/java/com/smppw/common/pojo/PublicSubStrategyFullName.java

@@ -1,4 +1,4 @@
-package com.smppw.common.pojo;
+package com.smppw.common.pojo.enums.strategy;
 
 import java.util.stream.Stream;
 

+ 220 - 223
src/main/java/com/smppw/common/pojo/enums/strategy/Strategy.java

@@ -1,6 +1,5 @@
 package com.smppw.common.pojo.enums.strategy;
 
-import com.smppw.common.pojo.IStrategy;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.Arrays;
@@ -14,250 +13,248 @@ import java.util.stream.Stream;
  */
 public enum Strategy implements IStrategy {
 
-	/** 私募策略 新融智策略 **/
-	Others(-1, "其它", "", ""),
+    /**
+     * 私募策略 新融智策略
+     **/
+    Others(-1, "其它", "", "IN00000008"),
 
-	All(0, "全部", "", "IN00000008"),
+    All(0, "全部", "", "IN00000008"),
 
-	Equity(1001, "股票策略", "IN000002D2", "IN00000008"),
+    Equity(1001, "股票策略", "IN000002FK", "IN00000008"),
 
-	Bond(1002, "债券策略", "IN000002D3", "IN00000077"),
+    Bond(1002, "债券策略", "IN000002FL", "IN00000077"),
 
-	Future(1003, "期货及衍生品策略","IN000002D4", "IN0000008S"),
+    Future(1003, "期货及衍生品策略", "IN000002FM", "IN0000008S"),
 
-	Multiple(1004, "多资产策略","IN000002D5", "IN00000008"),
+    Multiple(1004, "多资产策略", "IN000002FN", "IN00000008"),
 
-	Portfolio(1005,"组合基金", "IN000002D6", "IN00000008"),
+    Portfolio(1005, "组合基金", "IN000002FO", "IN00000008"),
 
-	Rights(9, "权益类", "IN0000001B", "IN00000008"),
-
-	/** 公募策略 **/
-	Equity2(101, "股票","IN0000001C", "IN00000008"),
-
-	OverseeFund(108, "海外","IN0000001C", "IN00000009"),
-
-	Hybrid(102,"混合", "IN0000001J", "IN00000008"),
-
-	Bond2(103, "债券","IN0000001H", "IN00000077"),
-
-	Cash(104,"货币", "IN0000001H", "IN00000077"),
-
-	Commodity(105, "商品","IN0000001E", "IN0000008S"),
-
-	MarketNeutral(106, "市场中性","IN0000001G", "IN00000008"),
-
-	FOF(107, "FOF","IN0000001G", "IN00000008"),
-
-	Others2(-100, "其他","", "");
-
-	private Integer id;
-	private String nameDesc;
-	private String rongZhiIndex;
-	private String benchmark;
-
-	private Strategy(Integer id, String nameDesc, String rongZhiIndex, String benchmark) {
-		this.id = id;
-		this.nameDesc = nameDesc;
-		this.rongZhiIndex = rongZhiIndex;
-		this.benchmark = benchmark;
-	}
-
-	public int getId() {
-		return id;
-	}
-
-	public String getRongZhiIndex() {
-		return rongZhiIndex;
-	}
-
-	public String getBenchmark() {
-		return benchmark;
-	}
-
-
-	public String getNameDesc() {
-		return nameDesc;
-	}
-
-	public static boolean isStrategy(String str) {
-		if (StringUtils.isEmpty(str))
-			return false;
-
-		for (Strategy s : Strategy.values()) {
-			if (str.equals(s.getId() + "") || str.equals(s.name())) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	public static Strategy getStrategy(Integer id) {
-		return Stream.of(Strategy.values()).filter(e -> e.id.equals(id)).findFirst().orElse(null);
-	}
-
-	// 已修正
-	/**新的策略归为原来的策略*/
-	public static Strategy getOldStrategy(Integer id) {
-		if(Math.abs(id) >= 100 && Math.abs(id) < 1000){
-			switch (id) {
-				case 101:
-				case 108:
-					return Strategy.Equity;
-				case 102:
-					return Strategy.Multiple;
-				case 103:
-				case 104:
-					return Strategy.Bond;
-				case 105:
-					return Strategy.Future;
-				case 106:
-					return Strategy.Equity;	// 对应策略:股票 - 股票市场中性
-				case 107:
-					return Strategy.Portfolio;
-
-				default:
-					return Strategy.Others;
-			}
-		}
-		return Stream.of(Strategy.values()).filter(e -> e.id.equals(id)).findFirst().orElse(null);
-	}
-
-
-
-	public static Strategy getStrategy(String id) {
-		if (null == id){
-			return null;
-		}
-		for(Strategy s : Strategy.values()){
-			if(id.equals(s.getId()+"") || id.equals(s.name())){
-				return s;
-			}
-		}
-		return null;
-	}
-
-	public static Strategy getStrategyByName(String name) {
-		if (null == name){
-			return null;
-		}
-		for(Strategy s : Strategy.values()){
-			if(name.equals(s.getNameDesc()+"")){
-				return s;
-			}
-		}
-		return null;
-	}
-
-	public static Strategy getStrategyByRongZhiIndex(String rongZhiIndex) {
-		return Stream.of(Strategy.values()).filter(e -> e.rongZhiIndex.equals(rongZhiIndex)).findFirst().orElse(null);
-	}
-
-	// 已修正
-	//	1-股票策略,2-宏观策略,3-管理期货,4-事件驱动,5-相对价值策略,6-债券策略,7-组合基金,8-复合策略,-1-其它策略
-	private static final Map<String, String> EIGHT_TRATEGY_NAME_MAP = new HashMap<>();
-	static {
-		EIGHT_TRATEGY_NAME_MAP.put("1001", "股票策略");
-		EIGHT_TRATEGY_NAME_MAP.put("1002", "债券策略");
-		EIGHT_TRATEGY_NAME_MAP.put("1003", "期货及衍生品策略");
-		EIGHT_TRATEGY_NAME_MAP.put("1004", "多资产策略");
-		EIGHT_TRATEGY_NAME_MAP.put("1005", "组合基金");
-		EIGHT_TRATEGY_NAME_MAP.put("-1", "其它策略");
-
-		EIGHT_TRATEGY_NAME_MAP.put("101", "股票");
-		EIGHT_TRATEGY_NAME_MAP.put("102", "混合");
-		EIGHT_TRATEGY_NAME_MAP.put("103", "债券");
-		EIGHT_TRATEGY_NAME_MAP.put("104", "货币");
-		EIGHT_TRATEGY_NAME_MAP.put("105", "商品");
-		EIGHT_TRATEGY_NAME_MAP.put("106", "市场中性");
-		EIGHT_TRATEGY_NAME_MAP.put("107", "FOF");
-		EIGHT_TRATEGY_NAME_MAP.put("108", "海外");
-		EIGHT_TRATEGY_NAME_MAP.put("-100", "其他");
-
-	}
-
-	public static String getStrategyName(String stragegyId, String defaultValue) {
-		return EIGHT_TRATEGY_NAME_MAP.getOrDefault(stragegyId, defaultValue);
-	}
-
-
-	public static final List<Strategy> STRATEGY_LIST = Arrays.asList(All, Equity, Bond, Future, Multiple, Portfolio, Equity2,
-			OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF);
-
-	public static final List<Strategy> EIGHT_STRATEGY = Arrays.asList(Equity, Future, Bond, Portfolio, Multiple);
-
-	public static final List<Strategy> EIGHT_STRATEGY_WITH_RIGHTS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio);
-
-	public static final List<Strategy> EIGHT_STRATEGY_WITH_OTHERS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio, Others);
-
-	/** 新添加了公募基金策略 */
-	public static final List<Strategy> NEW_STRATEGY_WITH_OTHERS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio, Others,
-			Equity2, OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF, Others2);
-
-	public static final List<Strategy> STRATEGY_WITHOUT_OTHERS = Arrays.asList(All, Equity, Bond, Future, Multiple, Portfolio);
-
-	// 公募策略集合
-	public static final List<Strategy> PUBLIC_STRATEGY = Arrays.asList(All,Equity2, OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF, Others2);
-	// 公募策略id集合
-	public static final List<Integer> PUBLIC_STRATEGY_ID_LIST = Arrays.asList(All.getId(),Equity2.getId(), OverseeFund.getId(), Hybrid.getId(),
-			Bond2.getId(), Cash.getId(), Commodity.getId(), MarketNeutral.getId(), FOF.getId(), Others2.getId());
+    Rights(9, "权益类", "IN000002GN", "IN00000008"),
+
+    /**
+     * 公募策略
+     **/
+    Equity2(101, "股票", "IN0000001C", "IN00000008"),
+
+    OverseeFund(108, "海外", "IN0000001C", "IN00000009"),
+
+    Hybrid(102, "混合", "IN0000001J", "IN00000008"),
+
+    Bond2(103, "债券", "IN0000001H", "IN00000077"),
+
+    Cash(104, "货币", "IN0000001H", "IN00000077"),
+
+    Commodity(105, "商品", "IN0000001E", "IN0000008S"),
+
+    MarketNeutral(106, "市场中性", "IN0000001G", "IN00000008"),
+
+    FOF(107, "FOF", "IN0000001G", "IN00000008"),
+
+    Others2(-100, "其他", "", "");
+
+    public static final List<Strategy> STRATEGY_LIST = Arrays.asList(All, Equity, Bond, Future, Multiple, Portfolio, Equity2,
+            OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF);
+    public static final List<Strategy> EIGHT_STRATEGY = Arrays.asList(Equity, Future, Bond, Portfolio, Multiple);
+    public static final List<Strategy> EIGHT_STRATEGY_WITH_RIGHTS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio);
+    public static final List<Strategy> EIGHT_STRATEGY_WITH_OTHERS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio, Others);
+    /**
+     * 新添加了公募基金策略
+     */
+    public static final List<Strategy> NEW_STRATEGY_WITH_OTHERS = Arrays.asList(Equity, Bond, Future, Multiple, Portfolio, Others,
+            Equity2, OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF, Others2);
+    public static final List<Strategy> STRATEGY_WITHOUT_OTHERS = Arrays.asList(All, Equity, Bond, Future, Multiple, Portfolio);
+    // 公募策略集合
+    public static final List<Strategy> PUBLIC_STRATEGY = Arrays.asList(All, Equity2, OverseeFund, Hybrid, Bond2, Cash, Commodity, MarketNeutral, FOF, Others2);
+    // 公募策略id集合
+    public static final List<Integer> PUBLIC_STRATEGY_ID_LIST = Arrays.asList(All.getId(), Equity2.getId(), OverseeFund.getId(), Hybrid.getId(),
+            Bond2.getId(), Cash.getId(), Commodity.getId(), MarketNeutral.getId(), FOF.getId(), Others2.getId());
+    // 已修正
+    //	1-股票策略,2-宏观策略,3-管理期货,4-事件驱动,5-相对价值策略,6-债券策略,7-组合基金,8-复合策略,-1-其它策略
+    private static final Map<String, String> EIGHT_TRATEGY_NAME_MAP = new HashMap<>();
+
+    static {
+        EIGHT_TRATEGY_NAME_MAP.put("1001", "股票策略");
+        EIGHT_TRATEGY_NAME_MAP.put("1002", "债券策略");
+        EIGHT_TRATEGY_NAME_MAP.put("1003", "期货及衍生品策略");
+        EIGHT_TRATEGY_NAME_MAP.put("1004", "多资产策略");
+        EIGHT_TRATEGY_NAME_MAP.put("1005", "组合基金");
+        EIGHT_TRATEGY_NAME_MAP.put("-1", "其它策略");
+
+        EIGHT_TRATEGY_NAME_MAP.put("101", "股票");
+        EIGHT_TRATEGY_NAME_MAP.put("102", "混合");
+        EIGHT_TRATEGY_NAME_MAP.put("103", "债券");
+        EIGHT_TRATEGY_NAME_MAP.put("104", "货币");
+        EIGHT_TRATEGY_NAME_MAP.put("105", "商品");
+        EIGHT_TRATEGY_NAME_MAP.put("106", "市场中性");
+        EIGHT_TRATEGY_NAME_MAP.put("107", "FOF");
+        EIGHT_TRATEGY_NAME_MAP.put("108", "海外");
+        EIGHT_TRATEGY_NAME_MAP.put("-100", "其他");
+
+    }
+
+    private Integer id;
+
+    // 已修正
+    private String nameDesc;
+    private String rongZhiIndex;
+    private String benchmark;
+
+    private Strategy(Integer id, String nameDesc, String rongZhiIndex, String benchmark) {
+        this.id = id;
+        this.nameDesc = nameDesc;
+        this.rongZhiIndex = rongZhiIndex;
+        this.benchmark = benchmark;
+    }
+
+    public static boolean isStrategy(String str) {
+        if (StringUtils.isEmpty(str))
+            return false;
+
+        for (Strategy s : Strategy.values()) {
+            if (str.equals(s.getId() + "") || str.equals(s.name())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public static Strategy getStrategy(Integer id) {
+        return Stream.of(Strategy.values()).filter(e -> e.id.equals(id)).findFirst().orElse(null);
+    }
+
+    /**
+     * 新的策略归为原来的策略
+     */
+    public static Strategy getOldStrategy(Integer id) {
+        if (Math.abs(id) >= 100 && Math.abs(id) < 1000) {
+            switch (id) {
+                case 101:
+                case 108:
+                    return Strategy.Equity;
+                case 102:
+                    return Strategy.Multiple;
+                case 103:
+                case 104:
+                    return Strategy.Bond;
+                case 105:
+                    return Strategy.Future;
+                case 106:
+                    return Strategy.Equity;    // 对应策略:股票 - 股票市场中性
+                case 107:
+                    return Strategy.Portfolio;
+
+                default:
+                    return Strategy.Others;
+            }
+        }
+        return Stream.of(Strategy.values()).filter(e -> e.id.equals(id)).findFirst().orElse(null);
+    }
+
+    public static Strategy getStrategy(String id) {
+        if (null == id) {
+            return null;
+        }
+        for (Strategy s : Strategy.values()) {
+            if (id.equals(s.getId() + "") || id.equals(s.name())) {
+                return s;
+            }
+        }
+        return null;
+    }
+
+    public static Strategy getStrategyByName(String name) {
+        if (null == name) {
+            return null;
+        }
+        for (Strategy s : Strategy.values()) {
+            if (name.equals(s.getNameDesc() + "")) {
+                return s;
+            }
+        }
+        return null;
+    }
+
+    public static Strategy getStrategyByRongZhiIndex(String rongZhiIndex) {
+        return Stream.of(Strategy.values()).filter(e -> e.rongZhiIndex.equals(rongZhiIndex)).findFirst().orElse(null);
+    }
+
+    public static String getStrategyName(String stragegyId, String defaultValue) {
+        return EIGHT_TRATEGY_NAME_MAP.getOrDefault(stragegyId, defaultValue);
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getRongZhiIndex() {
+        return rongZhiIndex;
+    }
+
+    public String getBenchmark() {
+        return benchmark;
+    }
+
+    public String getNameDesc() {
+        return nameDesc;
+    }
 
 //	public static Map<Strategy, List<Strategy.RzSubstrategy>> rzStrategySubstrategy() {
 //		return StrategyDao.getInstance().rzStrategySubstrategy();
 //	}
 
-	@Override
-	public Integer getStrategyId() {
-		return this.getId();
-	}
+    @Override
+    public Integer getStrategyId() {
+        return this.getId();
+    }
 
-	@Override
-	public String getStrategyOriginName() {
-		return this.name();
-	}
+    @Override
+    public String getStrategyOriginName() {
+        return this.name();
+    }
 
-	@Override
-	public String getStrategyNameDesc() {
-		return this.getNameDesc();
-	}
+    @Override
+    public String getStrategyNameDesc() {
+        return this.getNameDesc();
+    }
 
 
+    public class RzSubstrategy {
+        private String substrategyId;
+        private String indexId;
+        private String indexCode;
 
-	public class RzSubstrategy {
-		private String substrategyId;
-		private String indexId;
-		private String indexCode;
+        public RzSubstrategy(String substrategyId, String indexCode, String indexId) {
+            super();
+            this.substrategyId = substrategyId;
+            this.indexCode = indexCode;
+            this.indexId = indexId;
+        }
 
-		public RzSubstrategy(String substrategyId, String indexCode, String indexId) {
-			super();
-			this.substrategyId = substrategyId;
-			this.indexCode = indexCode;
-			this.indexId = indexId;
-		}
+        public String getSubstrategyId() {
+            return substrategyId;
+        }
 
-		public String getSubstrategyId() {
-			return substrategyId;
-		}
+        public void setSubstrategyId(String substrategyId) {
+            this.substrategyId = substrategyId;
+        }
 
-		public void setSubstrategyId(String substrategyId) {
-			this.substrategyId = substrategyId;
-		}
+        public String getIndexId() {
+            return indexId;
+        }
 
-		public String getIndexId() {
-			return indexId;
-		}
+        public void setIndexId(String indexId) {
+            this.indexId = indexId;
+        }
 
-		public void setIndexId(String indexId) {
-			this.indexId = indexId;
-		}
+        public String getIndexCode() {
+            return indexCode;
+        }
 
-		public String getIndexCode() {
-			return indexCode;
-		}
+        public void setIndexCode(String indexCode) {
+            this.indexCode = indexCode;
+        }
+    }
 
-		public void setIndexCode(String indexCode) {
-			this.indexCode = indexCode;
-		}
-	}
-	
 }

+ 0 - 69
src/main/java/com/smppw/common/pojo/enums/strategy/SubStrategy.java

@@ -1,69 +0,0 @@
-package com.smppw.common.pojo.enums.strategy;
-
-import java.util.stream.Stream;
-
-// 新策略 - 第二级策略
-public enum SubStrategy {
-    OtherStrategy(-1, "其他策略", "", ""), /**/
-    EquityLongOnly(100101, "主观多头", "IN000002D7", ""), /**/
-    EquityQuantitative(100102, "量化多头", "IN000002D8", ""), /**/
-    EquityLongShort(100103, "股票多空", "IN000002D9", "IN00000008"), /**/
-    EquityNeutral(100104, "股票市场中性", "IN000002DA", "IN00000008"), /**/
-    BondPure(100201, "纯债策略", "IN000002DB", "IN00000077"), /**/
-    BondStrong(100202, "债券增强", "IN000002DC", "IN00000077"), /**/
-    BondMultiple(100203, "债券复合", "IN000002DD", "IN00000077"), /**/
-    CnvtbBondTrd(100204, "转债交易策略", "IN000002DE", "IN0000008J"),
-    ActMgtFut(100301, "主观CTA", "IN000002DF", ""),
-    MgtFutQuant(100302, "量化CTA", "IN000002DG", ""),
-    OptionStrgy(100303, "期权策略", "IN000002DH", "IN0000008S"),
-    OtherFutures(100304, "其他衍生品策略", "IN000002DI", "IN0000008S"),
-    MacroStrgy(100401, "宏观策略", "IN000002DJ", "IN00000008"),
-    ArbitrageStrgy(100402, "套利策略", "IN000002DK", "IN00000008"),
-    CombinedStrgy(100403, "复合策略", "IN000002DL", "IN00000008"),
-    FOF(100501, "FOF", "IN000002DM", ""), /**/
-    MOM(100502, "MOM", "IN000002DN", ""),
-    ; /**/
-
-    private int id;
-    private String name;
-    private String rongZhiIndex;
-    private String benchmark;
-
-    private SubStrategy(int id, String name, String rongZhiIndex, String benchmark) {
-        this.id = id;
-        this.name = name;
-        this.rongZhiIndex = rongZhiIndex;
-        this.benchmark = benchmark;
-    }
-
-    public int getId() {
-        return id;
-    }
-    public String getName() {
-        return name;
-    }
-
-    public String getRongZhiIndex() {
-        return rongZhiIndex;
-    }
-
-    public String getBenchmark() {
-        return benchmark;
-    }
-
-    public static SubStrategy getSubStrategy(int id) {
-        return Stream.of(SubStrategy.values()).filter(e -> e.id == id).findFirst().orElse(OtherStrategy);
-    }
-
-    public static SubStrategy getStrategyByName(String name) {
-        if (null == name){
-            return null;
-        }
-        for(SubStrategy s : SubStrategy.values()){
-            if(name.equals(s.getName()+"")){
-                return s;
-            }
-        }
-        return null;
-    }
-}

+ 0 - 72
src/main/java/com/smppw/common/pojo/enums/strategy/SysStrategy.java

@@ -1,72 +0,0 @@
-package com.smppw.common.pojo.enums.strategy;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.stream.Stream;
-
-public enum SysStrategy {
-
-    OtherStrategy(-1, "其他策略", ""), /**/
-    EquityLongOnly(100101,"主观多头", "IN00000008"), /**/
-    EquityQuantitative(100102,"量化多头", ""), /**/
-    EquityLongShort(100103, "股票多空", "IN00000008"), /**/
-    EquityNeutral(100104,"股票市场中性", "IN00000008"), /**/
-    BondPure(100201,"纯债策略", "IN00000077"), /**/
-    BondStrong(100202,"债券增强", "IN00000077"), /**/
-    BondMultiple(100203,"债券复合", "IN00000077"), /**/
-    CnvtbBondTrd(100204,"转债交易", "IN0000008J"),
-    OptionStrgy(100303, "期权策略", "IN0000008S"),
-    OtherFutures(100304, "其他衍生品", "IN0000008S"),
-    MacroStrgy(100401, "宏观策略", "IN00000008"),
-    ArbitrageStrgy(100402, "套利策略", "IN00000008"),
-    CombinedStrgy(100403, "复合策略", "IN00000008"),
-    FOF(100501, "FOF", ""), /**/
-    MOM(100502, "MOM", ""),
-
-    ActTrendFlw(10030101, "主观趋势", "IN0000008S"),
-    ActMktNutrl(10030102, "主观套利", "IN0000008S"),
-    MltFutMgtStrgy(10030103, "主观多策略", "IN0000008S"),
-    TrendFlwQuant(10030201, "量化趋势", "IN0000008S"),
-    MktNutrlQuant(10030202, "量化套利", "IN0000008S"),
-    MltFutMgtQuant(10030203, "量化多策略", "IN0000008S");
-
-    private Integer id;
-    private String name;
-    private String benchmark;
-
-    private SysStrategy(Integer id, String name, String benchmark) {
-        this.id = id;
-        this.name = name;
-        this.benchmark = benchmark;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getBenchmark() {
-        return benchmark;
-    }
-
-    public static SysStrategy getSysStrategy(int id) {
-        return Stream.of(SysStrategy.values()).filter(e -> e.id == id).findFirst().orElse(OtherStrategy);
-    }
-
-    public static boolean isStrategy(String str) {
-        if (StringUtils.isEmpty(str)) {
-            return false;
-        }
-
-        for (SysStrategy s : SysStrategy.values()) {
-            if (str.equals(s.getId() + "") || str.equals(s.name())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}

+ 0 - 2
src/main/java/com/smppw/common/pojo/enums/strategy/ThirdStrategy.java

@@ -1,7 +1,5 @@
 package com.smppw.common.pojo.enums.strategy;
 
-import com.smppw.common.pojo.IStrategy;
-
 import java.util.stream.Stream;
 
 // 第三级策略

+ 2 - 0
src/main/java/com/smppw/constants/IndicatorConst.java

@@ -11,4 +11,6 @@ public class IndicatorConst {
     public static final String MIN_INDICATOR_VALUE_STRING = "-999999999999999.999999";
     public static final Double MIN_DENOMINATOR_VALUE = 0.00000001;
     public static final Double ZERO = 0.0;
+
+    public static final double BEST_INDICATOR_VALUE = 999999d;
 }

+ 161 - 199
src/main/java/com/smppw/core/IndicatorService.java

@@ -3,8 +3,6 @@ package com.smppw.core;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import com.smppw.common.pojo.IStrategy;
 import com.smppw.common.pojo.IndexesTradeDate;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.dto.DateValue;
@@ -14,6 +12,8 @@ import com.smppw.common.pojo.dto.calc.IndicatorCalcTimeRangeDto;
 import com.smppw.common.pojo.dto.indicator.CalcMultipleSecMultipleTimeRangeIndicatorReq;
 import com.smppw.common.pojo.dto.indicator.DateIntervalDto;
 import com.smppw.common.pojo.enums.*;
+import com.smppw.common.pojo.enums.strategy.IStrategy;
+import com.smppw.common.pojo.enums.strategy.Strategy;
 import com.smppw.utils.DateIntervalUtil;
 import com.smppw.utils.IndicatorCalcUtil;
 import com.smppw.utils.NavUtil;
@@ -21,9 +21,9 @@ import com.smppw.utils.TradeDateUtil;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @author wangzaijun
@@ -39,6 +39,27 @@ public class IndicatorService {
     }
 
     public Map<String, List<IndicatorCalcPropertyDto>> getMultipleSecTrend(List<String> mainSecIdList, Map<String, String> secBenchmarkIdMap, List<String> indexIdList,
+                                                                           DateIntervalDto dateIntervalDto, Frequency frequency, List<TrendType> trendTypeV2List,
+                                                                           Map<String, Frequency> secFreqMap, Map<String, List<DateValue>> allNavMap) {
+        return this.getMultipleSecTrend(mainSecIdList, secBenchmarkIdMap, indexIdList, dateIntervalDto, null, null, frequency, trendTypeV2List, secFreqMap, allNavMap);
+    }
+
+    /**
+     * 计算多标的的业绩走势图
+     *
+     * @param mainSecIdList
+     * @param secBenchmarkIdMap
+     * @param indexIdList
+     * @param dateIntervalDto
+     * @param fixedIncome
+     * @param initValue
+     * @param frequency
+     * @param trendTypeV2List
+     * @param secFreqMap
+     * @param allNavMap
+     * @return
+     */
+    public Map<String, List<IndicatorCalcPropertyDto>> getMultipleSecTrend(List<String> mainSecIdList, Map<String, String> secBenchmarkIdMap, List<String> indexIdList,
                                                                            DateIntervalDto dateIntervalDto, BigDecimal fixedIncome, BigDecimal initValue, Frequency frequency,
                                                                            List<TrendType> trendTypeV2List, Map<String, Frequency> secFreqMap, Map<String, List<DateValue>> allNavMap) {
         // 实际频率时净值还是取日频的
@@ -107,13 +128,11 @@ public class IndicatorService {
      * @param req        请求参数
      * @param allNavMap  所有标的的净值
      * @param secFreqMap 标的的净值频率
-     * @param tradeDates 所有要计算的交易日序列
      * @return /
      */
     public Map<String, List<IndicatorCalcPropertyDto>> calcMultipleSecMultipleTimeRangeIndicator(CalcMultipleSecMultipleTimeRangeIndicatorReq req,
                                                                                                  Map<String, List<DateValue>> allNavMap,
-                                                                                                 Map<String, Frequency> secFreqMap,
-                                                                                                 List<IndexesTradeDate> tradeDates) {
+                                                                                                 Map<String, Frequency> secFreqMap) {
 
         List<String> mainSecIdList = req.getMainSecIdList();
         Map<String, String> secBenchmarkIdMap = req.getSecBenchmarkIdMap();
@@ -156,13 +175,9 @@ public class IndicatorService {
                 theFirstNavDate = mainSecIdNavList.get(0).getDate();
                 theLastNavDate = mainSecIdNavList.get(mainSecIdNavList.size() - 1).getDate();
             }
-            if (StrUtil.isAllNotBlank(theFirstNavDate, theLastNavDate)) {
-                String finalTheFirstNavDate = theFirstNavDate;
-                String finalTheLastNavDate = theLastNavDate;
-                tradeDates = tradeDates.stream().filter(e -> e.getTradeDate().compareTo(finalTheFirstNavDate) >= 0)
-                        .filter(e -> e.getTradeDate().compareTo(finalTheLastNavDate) <= 0).collect(Collectors.toList());
-            }
-            List<DateValue> validMainSecNavList = NavUtil.filterFrequencyNav(mainSecIdNavList, tradeDates, navFrequency);
+            List<IndexesTradeDate> indexesTradeDateList = TradeDateUtil.listInfoByDateInterval(theFirstNavDate, theLastNavDate);
+
+            List<DateValue> validMainSecNavList = NavUtil.filterFrequencyNav(mainSecIdNavList, indexesTradeDateList, navFrequency);
             secAllNavMap.put(mainSecId, validMainSecNavList);
 
             Frequency defaultFrequency = secFreqMap.getOrDefault(mainSecId, Frequency.Daily);
@@ -175,9 +190,9 @@ public class IndicatorService {
 
             for (DateIntervalDto dateIntervalDto : dateIntervalDtoList) {
 
-                rollFindStartDate(mainSecId, dateIntervalDto, tradeDates, allNavMap, calcFrequency);
+                rollFindStartDate(mainSecId, dateIntervalDto, indexesTradeDateList, allNavMap, calcFrequency);
 
-                List<IndicatorCalcTimeRangeDto> indicatorCalcTimeRangeDtoList = DateIntervalUtil.getIndicatorCalcTimeRangeDto(dateIntervalDto, validMainSecNavList, tradeDates
+                List<IndicatorCalcTimeRangeDto> indicatorCalcTimeRangeDtoList = DateIntervalUtil.getIndicatorCalcTimeRangeDto(dateIntervalDto, validMainSecNavList, indexesTradeDateList
                         , dateIntervalDto.getId());
 
                 for (IndicatorCalcTimeRangeDto indicatorCalcTimeRangeDto : indicatorCalcTimeRangeDtoList) {
@@ -209,6 +224,127 @@ public class IndicatorService {
         return indicatorCalcPropertyDtoListMap;
     }
 
+    /**
+     * 提供给指标计算服务的接口,支持多标的多频率的指标计算
+     *
+     * @param mainSecIdList
+     * @param secBenchmarkIdMap
+     * @param indexIdList
+     * @param dateIntervalDtoList
+     * @param dataFrequencyList
+     * @param dataFrequencyIndicatorListMap
+     * @param dataFrequencyGeoExtraIndicatorListMap
+     * @param riskOfFreeId
+     * @param riskOfFreeValue
+     * @param ifAnnualize
+     * @param calcIndexRetIndicatorValue
+     * @param needRet
+     * @param needExtraRet
+     * @param leastRetNum
+     * @param allNavMap
+     * @param secFreqMap
+     * @return
+     */
+    public Map<String, Map<Frequency, List<IndicatorCalcPropertyDto>>> calcMultipleSecMultipleTimeRangeIndicator(List<String> mainSecIdList, Map<String, String> secBenchmarkIdMap, List<String> indexIdList, List<DateIntervalDto> dateIntervalDtoList,
+                                                                                                                 List<Frequency> dataFrequencyList, Map<Frequency, List<Indicator>> dataFrequencyIndicatorListMap,
+                                                                                                                 Map<Frequency, List<Indicator>> dataFrequencyGeoExtraIndicatorListMap, String riskOfFreeId, Double riskOfFreeValue,
+                                                                                                                 boolean ifAnnualize, boolean calcIndexRetIndicatorValue, boolean needRet, boolean needExtraRet,
+                                                                                                                 int leastRetNum, Map<String, List<DateValue>> allNavMap, Map<String, Frequency> secFreqMap) {
+
+        Map<String, Map<Frequency, List<IndicatorCalcPropertyDto>>> indicatorCalcPropertyDtoListMapMap = MapUtil.newHashMap(mainSecIdList.size());
+        for (String mainSecId : mainSecIdList) {
+
+            String benchmarkId = secBenchmarkIdMap.get(mainSecId);
+
+            Map<Frequency, List<IndicatorCalcPropertyDto>> indicatorCalcPropertyDtoListMap = MapUtil.newHashMap(dataFrequencyList.size());
+            for (Frequency dataFrequency : dataFrequencyList) {
+                Map<String, List<DateValue>> secAllNavMap = MapUtil.newHashMap(3 + indexIdList.size());
+                secAllNavMap.put(mainSecId, NavUtil.getNewNavList(allNavMap.get(mainSecId)));
+                secAllNavMap.put(benchmarkId, NavUtil.getNewNavList(allNavMap.get(benchmarkId)));
+                for (String indexId : indexIdList) {
+                    secAllNavMap.put(indexId, NavUtil.getNewNavList(allNavMap.get(indexId)));
+                }
+                if (StringUtils.isNotEmpty(riskOfFreeId)) {
+                    secAllNavMap.put(riskOfFreeId, NavUtil.getNewNavList(allNavMap.get(riskOfFreeId)));
+                }
+
+                Frequency navFrequency = dataFrequency == null || dataFrequency == Frequency.Default ? Frequency.Daily : dataFrequency;
+                List<DateValue> mainSecIdNavList = secAllNavMap.get(mainSecId);
+
+                String theFirstNavDate = "";
+                String theLastNavDate = "";
+                if (mainSecIdNavList != null && mainSecIdNavList.size() > 0) {
+                    theFirstNavDate = mainSecIdNavList.get(0).getDate();
+                    theLastNavDate = mainSecIdNavList.get(mainSecIdNavList.size() - 1).getDate();
+                }
+
+                List<IndexesTradeDate> indexesTradeDateDoList = TradeDateUtil.listInfoByDateInterval(theFirstNavDate, theLastNavDate);
+
+                List<DateValue> validMainSecNavList = NavUtil.filterFrequencyNav(mainSecIdNavList, indexesTradeDateDoList, navFrequency);
+                secAllNavMap.put(mainSecId, validMainSecNavList);
+
+                Frequency calcFrequency = null;
+                Frequency defaultFrequency = secFreqMap.get(mainSecId);
+                if (dataFrequency == Frequency.Default) {
+                    calcFrequency = defaultFrequency;
+                } else {
+                    calcFrequency = dataFrequency;
+                }
+
+                List<Indicator> indicatorList = dataFrequencyIndicatorListMap.get(dataFrequency);
+                List<Indicator> geoExtraIndicatorList = dataFrequencyGeoExtraIndicatorListMap.get(dataFrequency);
+
+                List<IndicatorCalcPropertyDto> indicatorCalcPropertyDtoList = new ArrayList<>();
+                for (DateIntervalDto dateIntervalDto : dateIntervalDtoList) {
+
+                    rollFindStartDate(mainSecId, dateIntervalDto, indexesTradeDateDoList, allNavMap, defaultFrequency);
+
+                    List<IndicatorCalcTimeRangeDto> indicatorCalcTimeRangeDtoList = DateIntervalUtil.getIndicatorCalcTimeRangeDto(dateIntervalDto, validMainSecNavList, indexesTradeDateDoList
+                            , dateIntervalDto.getId());
+
+                    for (IndicatorCalcTimeRangeDto indicatorCalcTimeRangeDto : indicatorCalcTimeRangeDtoList) {
+
+                        Map<String, List<DateValue>> dateSecAllNavMap = MapUtil.newHashMap(3 + indexIdList.size());
+                        dateSecAllNavMap.put(mainSecId, NavUtil.getNewNavList(secAllNavMap.get(mainSecId)));
+                        dateSecAllNavMap.put(benchmarkId, NavUtil.getNewNavList(secAllNavMap.get(benchmarkId)));
+                        for (String indexId : indexIdList) {
+                            dateSecAllNavMap.put(indexId, NavUtil.getNewNavList(secAllNavMap.get(indexId)));
+                        }
+                        if (StringUtils.isNotEmpty(riskOfFreeId)) {
+                            dateSecAllNavMap.put(riskOfFreeId, NavUtil.getNewNavList(secAllNavMap.get(riskOfFreeId)));
+                        }
+
+                        if (validMainSecNavList.size() > 0) {
+                            IndicatorCalcReqPropertyDto indicatorCalcReq = prepareIndicatorCalcReq(mainSecId, benchmarkId, indexIdList, indicatorCalcTimeRangeDto,
+                                    dateSecAllNavMap, riskOfFreeId, riskOfFreeValue, null, calcFrequency, defaultFrequency, indicatorList, geoExtraIndicatorList, ifAnnualize, calcIndexRetIndicatorValue,
+                                    needRet, needExtraRet, false);
+                            indicatorCalcReq.setLeastRetNum(leastRetNum);
+
+                            IndicatorCalcPropertyDto indicatorCalcPropertyDto = CalcService.getInstance().indicatorCalc(indicatorCalcReq);
+
+                            indicatorCalcPropertyDto.getIndicatorCalcReq().setAllNavMap(null);
+                            indicatorCalcPropertyDto.setRiskFreeData(null);
+                            indicatorCalcPropertyDto.getSecData().setOriNavList(null);
+                            indicatorCalcPropertyDto.getSecData().setExtraNavList(null);
+                            indicatorCalcPropertyDto.getSecData().setRetList(null);
+                            indicatorCalcPropertyDto.getSecData().setExtraRetGeoList(null);
+                            indicatorCalcPropertyDto.getBenchmarkData().setBenchmarkNavList(null);
+                            indicatorCalcPropertyDto.getBenchmarkData().setOriBenchmarkNavList(null);
+                            indicatorCalcPropertyDto.getBenchmarkData().setBenchmarkRetList(null);
+
+                            indicatorCalcPropertyDtoList.add(indicatorCalcPropertyDto);
+                        }
+                    }
+                }
+
+                indicatorCalcPropertyDtoListMap.put(dataFrequency, indicatorCalcPropertyDtoList);
+            }
+            indicatorCalcPropertyDtoListMapMap.put(mainSecId, indicatorCalcPropertyDtoListMap);
+        }
+
+        return indicatorCalcPropertyDtoListMapMap;
+    }
+
     public List<IndicatorCalcTimeRangeDto> getSecTimeRange(String mainSecId, Frequency frequency, Map<String, List<DateValue>> allNavMap) {
         List<IndicatorCalcTimeRangeDto> indicatorCalcTimeRangeDtoList = CollectionUtil.newArrayList();
 
@@ -261,9 +397,17 @@ public class IndicatorService {
 
     public Map<String, List<IndicatorCalcPropertyDto>> getMultiSecRetListNew(List<String> mainSecIdList, List<String> indexIdList, Frequency frequency,
                                                                              Frequency rollingFrequency, String startDate, String endDate,
+                                                                             boolean ifExcessReturn, String benchmarkId, NavType navType,
+                                                                             Map<String, List<DateValue>> allNavMap, Map<String, Frequency> secFreqMap) {
+        return this.getMultiSecRetListNew(mainSecIdList, indexIdList, frequency, rollingFrequency, startDate, endDate, ifExcessReturn,
+                benchmarkId, RaiseType.Both, Strategy.All, Visibility.Both, navType, allNavMap, secFreqMap);
+    }
+
+    public Map<String, List<IndicatorCalcPropertyDto>> getMultiSecRetListNew(List<String> mainSecIdList, List<String> indexIdList, Frequency frequency,
+                                                                             Frequency rollingFrequency, String startDate, String endDate,
                                                                              boolean ifExcessReturn, String benchmarkId, RaiseType raiseType, IStrategy strategy,
                                                                              Visibility visibility, NavType navType,
-                                                                             Map<String, List<DateValue>> allNavMap, Map<String, Frequency> secFreqMap, List<IndexesTradeDate> tradeDates) {
+                                                                             Map<String, List<DateValue>> allNavMap, Map<String, Frequency> secFreqMap) {
         List<DateIntervalDto> dateIntervalDtoList = ListUtil.list(false);
         DateIntervalDto defaultIntervalDto = new DateIntervalDto();
         defaultIntervalDto.setStartDate(startDate);
@@ -310,191 +454,9 @@ public class IndicatorService {
         calcMultipleSecMultipleTimeRangeIndicatorReq.setNeedExtraRet(false);
         calcMultipleSecMultipleTimeRangeIndicatorReq.setIfConvertPerformanceConsistencyWord(true);
 
-        return calcMultipleSecMultipleTimeRangeIndicator(calcMultipleSecMultipleTimeRangeIndicatorReq, allNavMap, secFreqMap, tradeDates);
+        return calcMultipleSecMultipleTimeRangeIndicator(calcMultipleSecMultipleTimeRangeIndicatorReq, allNavMap, secFreqMap);
     }
 
-//
-//    public Map<Integer, Map<String, String>> calcMultipleSecMultipleTimeRangeIndicator(List<String> mainSecIdList, List<Integer> idList, Map<String, String> idBenchmarkMap, List<String> indexIdList,
-//                                                                                       Map<String, DateIntervalDto> idDateIntervalDtoMap, Map<String, Frequency> idNavFrequencyMap,
-//                                                                                       Map<String, Frequency> idCalcFrequencyMap, Map<String, NavType> idNavTypeMap,
-//                                                                                       Map<String, List<Indicator>> idIndicatorListMap, Map<String, List<Indicator>> idGeoExtraindicatorListMap,
-//                                                                                       Map<String, String> idRiskOfFreeIdMap, Map<String, Double> idRiskOfFreeValueMap, Map<String, Benchmark> benchmarkMap) {
-//
-//        List<String> benchmarkIdList = ListUtil.list(false);
-//        for (Map.Entry<String, String> secBenchmarkIdMapEntry : idBenchmarkMap.entrySet()) {
-//            String benchmarkId = secBenchmarkIdMapEntry.getValue();
-//            if (BenchmarkConfig.rz_strategy.name().equals(benchmarkId)) {
-//                for (Map.Entry<String, Benchmark> benchmarkMapEntry : benchmarkMap.entrySet()) {
-//                    String bk = benchmarkMapEntry.getValue().getBenchmarkId();
-//                    if (StringUtils.isNotEmpty(bk) && !benchmarkIdList.contains(bk)) {
-//                        benchmarkIdList.add(bk);
-//                    }
-//                }
-//            } else if (BenchmarkConfig.rz_bfi.name().equals(benchmarkId)) {
-//                for (Map.Entry<String, Benchmark> benchmarkMapEntry : benchmarkMap.entrySet()) {
-//                    String bk = benchmarkMapEntry.getValue().getRZIndexId();
-//                    if (StringUtils.isNotEmpty(bk) && !benchmarkIdList.contains(bk)) {
-//                        benchmarkIdList.add(bk);
-//                    }
-//                }
-//            } else {
-//                if (StringUtils.isNotEmpty(benchmarkId) && !benchmarkIdList.contains(benchmarkId)) {
-//                    benchmarkIdList.add(benchmarkId);
-//                }
-//            }
-//        }
-//
-//        List<NavType> navTypeList = ListUtil.list(false);
-//        Map<NavType, List<String>> navTypeIdListMap = new HashMap<>();
-//        for (Map.Entry<String, NavType> idNavTypeMapEntry : idNavTypeMap.entrySet()) {
-//            NavType value = idNavTypeMapEntry.getValue();
-//            if (!navTypeIdListMap.containsKey(value)) {
-//                List<String> list = ListUtil.list(false);
-//                list.add(idNavTypeMapEntry.getKey());
-//                navTypeIdListMap.put(value, list);
-//            } else {
-//                navTypeIdListMap.get(value).add(idNavTypeMapEntry.getKey());
-//            }
-//        }
-//
-//        List<String> riskOfFreeIdList = ListUtil.list(false);
-//        for (Map.Entry<String, String> idRiskOfFreeIdMapEntry : idRiskOfFreeIdMap.entrySet()) {
-//            String value = idRiskOfFreeIdMapEntry.getValue();
-//            if (StringUtils.isNotEmpty(value) && !riskOfFreeIdList.contains(value)) {
-//                riskOfFreeIdList.add(value);
-//            }
-//        }
-//        benchmarkIdList.addAll(riskOfFreeIdList);
-//
-//        Map<NavType, Map<String, List<DateValue>>> navTypeAllNavMapMap = new HashMap<>();
-//        for (Map.Entry<NavType, List<String>> navTypeIdListMapEntry : navTypeIdListMap.entrySet()) {
-//            Map<String, List<DateValue>> allNavList = navService.getSecIdDateValueNavListMapFromRedisAndDB(navTypeIdListMapEntry.getValue(), benchmarkIdList, indexIdList,
-//                    null, null, NavType.CumulativeNav, Visibility.Both, 1, 0, new HashMap<>(), false, null);
-//            navTypeAllNavMapMap.put(navTypeIdListMapEntry.getKey(), allNavList);
-//        }
-//
-//        Map<String, Frequency> secDefaultFrequency = fundInformationDao.getNavFrequency(mainSecIdList);
-//
-//        Map<String, Map<Frequency, List<DateValue>>> secFreValidMainSecNavListMapMap = new HashMap<>();
-//
-//        Map<Integer, Map<String, String>> result = new HashMap<>();
-//        for (Integer id : idList) {
-//            String idStr = id + "";
-//            String benchmarkId = idBenchmarkMap.get(idStr);
-//            NavType navType = idNavTypeMap.get(idStr);
-//            Map<String, List<DateValue>> allNavMap = navTypeAllNavMapMap.get(navType);
-//            String riskOfFreeId = idRiskOfFreeIdMap.get(idStr);
-//
-//            Double riskOfFreeValue = idRiskOfFreeValueMap.get(idStr);
-//
-//            Frequency navFrequency = idNavFrequencyMap.get(idStr);
-//            Frequency calcFrequency = idCalcFrequencyMap.get(idStr);
-//
-//            List<Indicator> indicatorList = idIndicatorListMap.get(idStr);
-//            List<Indicator> geoExtraindicatorList = idGeoExtraindicatorListMap.get(idStr);
-//
-//            Map<String, String> secIdValueMap = new HashMap<>();
-//            for (String mainSecId : mainSecIdList) {
-//                if (StringUtils.isNotEmpty(benchmarkId)) {
-//                    Benchmark benchmark = benchmarkMap.get(mainSecId);
-//                    if (BenchmarkConfig.rz_strategy.name().equals(benchmarkId)) {
-//                        if (benchmark != null) {
-//                            benchmarkId = benchmark.getBenchmarkId();
-//                        }
-//                    } else if (BenchmarkConfig.rz_bfi.name().equals(benchmarkId)) {
-//                        if (benchmark != null) {
-//                            benchmarkId = benchmark.getRZIndexId();
-//                        }
-//                    }
-//                }
-//
-//                Map<String, List<DateValue>> secAllNavMap = new HashMap();
-//                secAllNavMap.put(mainSecId, NavUtil.getNewNavList(allNavMap.get(mainSecId)));
-//                secAllNavMap.put(benchmarkId, NavUtil.getNewNavList(allNavMap.get(benchmarkId)));
-//                for (String indexId : indexIdList) {
-//                    secAllNavMap.put(indexId, NavUtil.getNewNavList(allNavMap.get(indexId)));
-//                }
-//                if (StringUtils.isNotEmpty(riskOfFreeId)) {
-//                    secAllNavMap.put(riskOfFreeId, NavUtil.getNewNavList(allNavMap.get(riskOfFreeId)));
-//                }
-//
-//                List<IndicatorCalcPropertyDto> indicatorCalcPropertyDtoList = ListUtil.list(false);
-//
-//                List<DateValue> mainSecIdNavList = secAllNavMap.get(mainSecId);
-//
-//                String theFirstNavDate = "";
-//                String theLastNavDate = "";
-//                if (mainSecIdNavList != null && mainSecIdNavList.size() > 0) {
-//                    theFirstNavDate = mainSecIdNavList.get(0).getDate();
-//                    theLastNavDate = mainSecIdNavList.get(mainSecIdNavList.size() - 1).getDate();
-//                }
-//
-//                List<IndexesTradeDateDo> indexesTradeDateDoList = TradeDateUtil.listInfoByDateInterval(theFirstNavDate, theLastNavDate);
-//
-//                List<DateValue> validMainSecNavList = null;
-//                if (secFreValidMainSecNavListMapMap.containsKey(mainSecId)) {
-//                    Map<Frequency, List<DateValue>> frequencyListMap = secFreValidMainSecNavListMapMap.get(mainSecId);
-//                    if (frequencyListMap.containsKey(navFrequency)) {
-//                        validMainSecNavList = frequencyListMap.get(navFrequency);
-//                        secAllNavMap.put(mainSecId, NavUtil.getNewNavList(validMainSecNavList));
-//                    } else {
-//                        validMainSecNavList = NavUtil.filterFrequencyNav(mainSecIdNavList, indexesTradeDateDoList, navFrequency);
-//                        secAllNavMap.put(mainSecId, NavUtil.getNewNavList(validMainSecNavList));
-//                        frequencyListMap.put(navFrequency, validMainSecNavList);
-//                    }
-//                } else {
-//                    validMainSecNavList = NavUtil.filterFrequencyNav(mainSecIdNavList, indexesTradeDateDoList, navFrequency);
-//                    secAllNavMap.put(mainSecId, NavUtil.getNewNavList(validMainSecNavList));
-//                    Map<Frequency, List<DateValue>> freValidMainSecNavListMap = new HashMap<>();
-//                    freValidMainSecNavListMap.put(navFrequency, validMainSecNavList);
-//                    secFreValidMainSecNavListMapMap.put(mainSecId, freValidMainSecNavListMap);
-//                }
-//
-//                Frequency defaultFrequency = secDefaultFrequency.get(mainSecId);
-//
-//                DateIntervalDto dateIntervalDto = idDateIntervalDtoMap.get(idStr);
-//
-//                List<IndicatorCalcTimeRangeDto> indicatorCalcTimeRangeDtoList = DateIntervalUtil.getIndicatorCalcTimeRangeDto(dateIntervalDto, secAllNavMap.get(mainSecId), indexesTradeDateDoList
-//                        , dateIntervalDto.getId());
-//                for (IndicatorCalcTimeRangeDto indicatorCalcTimeRangeDto : indicatorCalcTimeRangeDtoList) {
-//
-//                    Map<String, List<DateValue>> dateSecAllNavMap = new HashMap();
-//                    dateSecAllNavMap.put(mainSecId, NavUtil.getNewNavList(secAllNavMap.get(mainSecId)));
-//                    dateSecAllNavMap.put(benchmarkId, NavUtil.getNewNavList(secAllNavMap.get(benchmarkId)));
-//                    for (String indexId : indexIdList) {
-//                        dateSecAllNavMap.put(indexId, NavUtil.getNewNavList(secAllNavMap.get(indexId)));
-//                    }
-//                    if (StringUtils.isNotEmpty(riskOfFreeId)) {
-//                        dateSecAllNavMap.put(riskOfFreeId, NavUtil.getNewNavList(secAllNavMap.get(riskOfFreeId)));
-//                    }
-//
-//                    IndicatorCalcReqPropertyDto indicatorCalcReq = prepareIndicatorCalcReq(mainSecId, benchmarkId, indexIdList, indicatorCalcTimeRangeDto,
-//                            dateSecAllNavMap, riskOfFreeId, riskOfFreeValue, null, calcFrequency, defaultFrequency, indicatorList, geoExtraindicatorList, true, true,
-//                            false, false, true);
-//
-//                    IndicatorCalcPropertyDto indicatorCalcPropertyDto = calcService.indicatorCalc(indicatorCalcReq);
-//
-//                    indicatorCalcPropertyDtoList.add(indicatorCalcPropertyDto);
-//                }
-//
-//                String value = null;
-//                if (indicatorCalcPropertyDtoList != null && indicatorCalcPropertyDtoList.size() > 0) {
-//                    IndicatorCalcPropertyDto indicatorCalcPropertyDto = indicatorCalcPropertyDtoList.get(0);
-//                    if (indicatorList.size() > 0) {
-//                        value = indicatorCalcPropertyDto.getSecData().getIndicatorValueMap().get(indicatorList.get(0).name());
-//                    } else {
-//                        value = indicatorCalcPropertyDto.getSecData().getExtraGeoIndicatorValueMap().get(geoExtraindicatorList.get(0).name());
-//                    }
-//                }
-//                secIdValueMap.put(mainSecId, value);
-//            }
-//
-//            result.put(id, secIdValueMap);
-//        }
-//
-//        return result;
-//    }
-
     private IndicatorCalcReqPropertyDto prepareTrendReq(String mainSecId, String benchmarkId, List<String> indexList, IndicatorCalcTimeRangeDto indicatorCalcTimeRangeDto,
                                                         Map<String, List<DateValue>> allNavMap, Frequency frequency, Frequency defaultFrequency,
                                                         List<TrendType> trendTypeV2List, BigDecimal fixedIncome, BigDecimal initValue) {

+ 2 - 2
src/main/java/com/smppw/core/reta/IndicatorFactory.java

@@ -1,7 +1,7 @@
-package com.smppw.core.reta;
+package com.smppw.core.rate;
 
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.calc.*;
+import com.smppw.core.rate.calc.*;
 
 import java.util.HashMap;
 import java.util.Map;

+ 1 - 1
src/main/java/com/smppw/core/reta/Rate.java

@@ -1,4 +1,4 @@
-package com.smppw.core.reta;
+package com.smppw.core.rate;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/Alpha.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/AnnualReturn.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DateUtil;
 import org.joda.time.DateTime;
 

+ 5 - 5
src/main/java/com/smppw/core/reta/calc/AnnualReturnAlg.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 
@@ -14,13 +14,13 @@ public class AnnualReturnAlg extends Rate {
 
 	@Override
 	public Double calc(List<CompoundRet> list, Frequency frequency, boolean ifAnnualized) {
-		double sum = 0;
+		double sum = 1d;
 		for (CompoundRet value : list) {
 			if (value.getRetOfFund() != null) {
-				sum += value.getRetOfFund();
+				sum *= (1d + value.getRetOfFund());
 			}
 		}
-		return sum / (list.size() - 1) * frequency.getNum();
+		return (sum - 1d) / (list.size() - 1) * frequency.getNum();
 	}
 
 }

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/AnnualStdDev.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.Statistics;
 
 import java.util.ArrayList;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/BestRet.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/Beta.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;

+ 19 - 13
src/main/java/com/smppw/core/reta/calc/CalmarRatio.java

@@ -1,10 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.constants.IndicatorConst;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;
@@ -16,20 +17,25 @@ public class CalmarRatio extends Rate {
 		Rate rateAnnualRet = IndicatorFactory.getInstance().get(Indicator.AnnualReturn);
 		Double ratesAnnual = rateAnnualRet.calc(dateValues);
 
-//		if (ratesAnnual == null || ratesAnnual == 0 || maxDrawdown == null || maxDrawdown == 0)
-//			return null;
-		
 		if(null == ratesAnnual || 0 == ratesAnnual)
 			return 0D;
-		
+
 		Rate rate = IndicatorFactory.getInstance().get(Indicator.MaxDrawdown);
 		Double maxDrawdown = rate.calc(dateValues);
-		
-//		if(null == maxDrawdown || 0 == maxDrawdown) {
-//			return DataUtil.handleZeroValue(ratesAnnual);
-//		}
-//
-//		Double result = ratesAnnual / maxDrawdown;
+
+		if (null == maxDrawdown || 0 == maxDrawdown) {
+			if (maxDrawdown != null && maxDrawdown.compareTo(0d) == 0) {
+				// 如果分子也是0,结果无意义
+				if (ratesAnnual == 0.) {
+					return null;
+				} else if (ratesAnnual < 0.) {
+					return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+				}
+				return IndicatorConst.BEST_INDICATOR_VALUE;
+			}
+			return DataUtil.handleZeroValue(ratesAnnual);
+		}
+
 		return DataUtil.divNearZeroValue(ratesAnnual, maxDrawdown);
 	}
 }

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/DownCaptureRatio.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/DownCaptureReturn.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/DownsideDeviation.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/DownsideStdDev.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/ExcessAnnualAriIntervalReturn.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DateUtil;
 import org.joda.time.DateTime;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessAriIntervalReturn.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturn.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.MathUtils;
 
 import java.util.ArrayList;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnAnnualStdDevExtra.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnAnnualized.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnCalmarRatio.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.DateUtil;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnDownsideStdDev.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnDynamic.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DateUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnLongestNoNewHighDays.java

@@ -1,7 +1,7 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.DateValue;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdown.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.ArrayList;
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownNav.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.ArrayList;
 import java.util.HashMap;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownRecureDateExtra.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import cn.hutool.core.util.NumberUtil;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnMaxDrawdownRecureIntervalExtra.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import cn.hutool.core.util.NumberUtil;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/ExcessReturnRealTimeCalc.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DateUtil;
 
 import java.util.ArrayList;
@@ -99,7 +99,7 @@ public class ExcessReturnRealTimeCalc extends Rate {
             Double fundRet = ret.getRetOfFund();
             Double bmkRet = ret.getRetOfBmk();
             String date = ret.getEndDate();
-            if (fundRet == null || bmkRet == null || date == null || fundRet == 0D || bmkRet == 0D || date.isEmpty()) {
+            if (fundRet == null || bmkRet == null || date == null || date.isEmpty()) {
                 continue;
             }
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnSharpeRatio.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnSharpeRatioExtra.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ExcessReturnSortinoRatio.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 1 - 1
src/main/java/com/smppw/core/reta/calc/ExtraNav.java

@@ -1,4 +1,4 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/HistoricalCVaR.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.Consts;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/HistoricalVaR.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.Consts;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 
 import java.util.List;

+ 3 - 4
src/main/java/com/smppw/core/reta/calc/Hurst.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import com.smppw.common.pojo.dto.DateValue;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.BigDecimalUtils;
 import com.smppw.utils.Statistics;
 import org.apache.commons.math3.linear.Array2DRowRealMatrix;
@@ -59,8 +59,7 @@ public class Hurst extends Rate {
             Double nav = navList.get(i);
             if (prevNav != null && nav != null) {
                 // 不用double计算,有精度丢失问题
-                ret = BigDecimalUtils.toBigDecimal(nav).divide(BigDecimalUtils.toBigDecimal(prevNav), 20, RoundingMode.HALF_UP)
-                        .subtract(BigDecimal.ONE).doubleValue();
+                ret = nav / prevNav - 1;
             }
             rets.add(ret);
             prevNav = navList.get(i);

+ 11 - 5
src/main/java/com/smppw/core/reta/calc/InformationRatio.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.IndicatorConst;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.Statistics;
 
@@ -35,9 +35,15 @@ public class InformationRatio extends Rate {
 		}
 
 		double TracingError = Statistics.stdDevUnbiased(dValues);
-//		if (TracingError == 0) {
-//			return DataUtil.handleZeroValue(avg);
-//		}
+		if (TracingError == 0 || Double.isNaN(TracingError)) {
+			// 如果分子也是0,结果无意义
+			if (avg == 0.) {
+				return null;
+			} else if (avg < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
 
 		Double informationRatio = DataUtil.divNearZeroValue(avg, TracingError);
 		if (informationRatio == null) {

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/IntervalReturn.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/Jensen.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 12 - 7
src/main/java/com/smppw/core/reta/calc/Kappa.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import cn.hutool.core.collection.ListUtil;
 import com.smppw.constants.IndicatorConst;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.MathUtils;
 
@@ -22,6 +22,7 @@ public class Kappa extends Rate {
 		List<String> dateList = ListUtil.list(true);
 		for (CompoundRet value : list) {
 			if (value.getRetOfFund() == null || value.getRetOfRf() == null) {
+				dateList.add(value.getEndDate());
 				continue;
 			}
 			double max = value.getRetOfRf() - value.getRetOfFund();
@@ -41,13 +42,17 @@ public class Kappa extends Rate {
 		}
 
 		double minusValue = ratesAnnual - rfsAnnual;
-		if (LPM3 <= IndicatorConst.MIN_DENOMINATOR_VALUE) {
-			return null;
-		}
 		LPM3 /= list.size() - 1;
 		LPM3 = Math.pow(LPM3 * frequency.getNum(), 1.0 / 3);
-
-//		Double result = minusValue / LPM3;
+		if (Math.abs(LPM3) <= IndicatorConst.MIN_DENOMINATOR_VALUE) {
+			// 如果分子也是0,结果无意义
+			if (minusValue == 0.) {
+				return null;
+			} else if (minusValue < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
 		return DataUtil.divNearZeroValue(minusValue, LPM3);
 	}
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/Kurtosis.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.IndicatorConst;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.Statistics;
 

+ 1 - 1
src/main/java/com/smppw/core/reta/calc/LPM.java

@@ -1,4 +1,4 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import org.apache.commons.math3.analysis.UnivariateFunction;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/LongestNoNewHighDays.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DateUtil;
 
 import java.util.List;

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/M2.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.Statistics;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxContinuouslyDrawdownCount.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.ArrayList;
 import java.util.Collections;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdown.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownInterval.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownPeakDate.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureDate.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureInterval.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownRecureIntervalDays.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/MaxDrawdownValleyDate.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.utils.CalcUtils;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.CommonUtil;
 
 import java.util.List;

+ 12 - 5
src/main/java/com/smppw/core/reta/calc/Omega.java

@@ -1,11 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import cn.hutool.core.collection.ListUtil;
 import com.smppw.constants.IndicatorConst;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.MathUtils;
 
@@ -22,6 +22,7 @@ public class Omega extends Rate {
 		List<String> dateList = ListUtil.list(true);
 		for (CompoundRet value : list) {
 			if (value.getRetOfFund() == null || value.getRetOfRf() == null) {
+				dateList.add(value.getEndDate());
 				continue;
 			}
 			double max = value.getRetOfRf() - value.getRetOfFund();
@@ -38,12 +39,18 @@ public class Omega extends Rate {
 		if (list.size() <= 1 || ratesAnnual == null || rfsAnnual == null) {
 			return null;
 		}
+		double minusValue = ratesAnnual - rfsAnnual;
 		LPM1 /= list.size() - 1;
 		LPM1 *= frequency.getNum();
-		if (LPM1 <= IndicatorConst.MIN_DENOMINATOR_VALUE) {
-			return null;
+		if (Math.abs(LPM1 + 1) <= IndicatorConst.MIN_DENOMINATOR_VALUE) {
+			// 如果分子也是0,结果无意义
+			if (minusValue == 0.) {
+				return null;
+			} else if (minusValue < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
 		}
-
 		Double result = (ratesAnnual - rfsAnnual) / LPM1 + 1;
 		return DataUtil.handleOverflowData(result);
 	}

+ 23 - 25
src/main/java/com/smppw/core/reta/calc/PerformanceConsistency.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 
@@ -13,12 +13,20 @@ import java.util.List;
  */
 public class PerformanceConsistency extends Rate {
 
-	// 切换到 Hurst 指标计算
-	@Override
-	public Double calc(List<DateValue> dateValues) {
-		Rate rate = IndicatorFactory.getInstance().get(Indicator.HURST);
-		return rate.calc(dateValues);
-	}
+    public static String convert2Word(Double consistency) {
+        if (consistency == null) {
+            return null;
+        }
+        if (consistency >= 0 && consistency < 0.5) {
+            return "无";
+        } else if (consistency >= 0.5 && consistency < 0.6) {
+            return "不明显";
+        } else if (consistency >= 0.6 && consistency < 0.8) {
+            return "强";
+        } else {
+            return "非常强";
+        }
+    }
 
 	/*@Override
 	public Double calc(List<CompoundRet> list, Frequency frequency, boolean ifAnnualized) {
@@ -52,21 +60,11 @@ public class PerformanceConsistency extends Rate {
 		return markSum / levels.size();
 	}*/
 
-	public static String convert2Word(Double consistency) {
-		if(consistency == null){
-			return "无法判断";
-		}
-		if (consistency >= 0 && consistency <= 3.5)
-			return "不明显";
-		else if (consistency > 3.5 && consistency <= 3.8)
-			return "一般";
-		else if (consistency > 3.8 && consistency <= 4.1)
-			return "强";
-		else if (consistency > 4.1 && consistency <= 4.4)
-			return "比较强";
-		else if (consistency > 4.4)
-			return "非常强";
-		return "无法判断";
-	}
+    // 切换到 Hurst 指标计算
+    @Override
+    public Double calc(List<DateValue> dateValues) {
+        Rate rate = IndicatorFactory.getInstance().get(Indicator.HURST);
+        return rate.calc(dateValues);
+    }
 
 }

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/ProfitLossRatio.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/RangeReturn.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.MathUtils;
 
 import java.util.ArrayList;

+ 3 - 3
src/main/java/com/smppw/core/reta/calc/SMDDCVaR.java

@@ -1,12 +1,12 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.Consts;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/SMDDLPM1.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 import org.apache.commons.math3.distribution.NormalDistribution;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/SMDDLPM2.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 import org.apache.commons.math3.distribution.NormalDistribution;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/SMDDVaR.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.Consts;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.FunctionUtil;
 
 import java.util.List;

+ 16 - 11
src/main/java/com/smppw/core/reta/calc/SharpeRatio.java

@@ -1,9 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.constants.IndicatorConst;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.Statistics;
 
@@ -26,15 +27,19 @@ public class SharpeRatio extends Rate {
 		}
 		
 		sharp /= (list.size() - 1);
-		
-		Double stdDev = Statistics.stdDevUnbiased(rets);
-		
-//		if (stdDev == null) {
-//			return null;
-//		} else if (stdDev == 0) {
-//			return DataUtil.handleZeroValue(sharp);
-//		}
-//		sharp /= stdDev;
+
+		double stdDev = Statistics.stdDevUnbiased(rets);
+
+		if (stdDev == 0) {
+			// 如果分子也是0,结果无意义
+			if (sharp == 0.) {
+				return null;
+			} else if (sharp < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
+
 		Double sharpDou = DataUtil.divNearZeroValue(sharp, stdDev);
 		if (sharpDou == null) {
 			return null;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/SingleMaxDrawdown.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.IndicatorCalcUtil;
 
 import java.util.Collections;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/Skewness.java

@@ -1,10 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.constants.IndicatorConst;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.Statistics;
 

+ 14 - 9
src/main/java/com/smppw/core/reta/calc/SortinoRatio.java

@@ -1,9 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.constants.IndicatorConst;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;
@@ -27,13 +28,17 @@ public class SortinoRatio extends Rate {
 		SortinoRatio /= count;
 
 		Double downsideStdDev = new DownsideStdDev().calc(list, frequency, false);
-//		if (downsideStdDev == null) {
-//			return null;
-//		} else if (downsideStdDev == 0) {
-//			return DataUtil.handleZeroValue(SortinoRatio);
-//		}
-//
-//		SortinoRatio /= downsideStdDev;
+
+		if (downsideStdDev != null && (downsideStdDev.compareTo(0d) == 0 || Double.isNaN(downsideStdDev))) {
+			// 如果分子也是0,结果无意义
+			if (SortinoRatio == 0.) {
+				return null;
+			} else if (SortinoRatio < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
+
 		SortinoRatio = DataUtil.divNearZeroValue(SortinoRatio, downsideStdDev);
 		if (SortinoRatio == null) {
 			return null;

+ 16 - 8
src/main/java/com/smppw/core/reta/calc/SortinoRatioMAR.java

@@ -1,9 +1,10 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.constants.IndicatorConst;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;
@@ -34,12 +35,19 @@ public class SortinoRatioMAR extends Rate {
 		SortinoRatioMAR /= (list.size() - 1);
 
 		Double downSideStdDev = new DownsideStdDev().calc(list, frequency, false);
-//		if (downSideStdDev == null) {
-//			return null;
-//		} else if (downSideStdDev == 0) {
-//			return DataUtil.handleZeroValue(SortinoRatioMAR);
-//		}
-//		SortinoRatioMAR /= downSideStdDev;
+
+		if (downSideStdDev == null) {
+			return null;
+		} else if (downSideStdDev == 0 || Double.isNaN(downSideStdDev)) {
+			// 如果分子也是0,结果无意义
+			if (SortinoRatioMAR == 0.) {
+				return null;
+			} else if (SortinoRatioMAR < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
+
 		SortinoRatioMAR = DataUtil.divNearZeroValue(SortinoRatioMAR, downSideStdDev);
 		if (SortinoRatioMAR == null) {
 			return null;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/TrackingError.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.Statistics;
 
 import java.util.ArrayList;

+ 17 - 9
src/main/java/com/smppw/core/reta/calc/TreynorRatio.java

@@ -1,10 +1,11 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import cn.hutool.core.collection.ListUtil;
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.constants.IndicatorConst;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 import com.smppw.utils.MathUtils;
 
@@ -19,8 +20,10 @@ public class TreynorRatio extends Rate {
 		List<Double> rates = new ArrayList<>();
 		List<Double> rfs = new ArrayList<>();
 		for (CompoundRet value : list) {
-			if (value.getRetOfFund() == null && value.getRetOfRf() != null)
+			if (value.getRetOfFund() == null && value.getRetOfRf() != null) {
+				dateList.add(value.getEndDate());
 				continue;
+			}
 			rates.add(value.getRetOfFund());
 			rfs.add(value.getRetOfRf());
 			dateList.add(value.getEndDate());
@@ -32,12 +35,17 @@ public class TreynorRatio extends Rate {
 		if (beta == null || rfsAnnual == null || ratesAnnual == null) {
 			return null;
 		}
-//		} else if (beta == 0) {
-//			return DataUtil.handleZeroValue(ratesAnnual - rfsAnnual);
-//		}
-//
-//		Double result = (ratesAnnual - rfsAnnual) / beta;
-		return DataUtil.divNearZeroValue(ratesAnnual - rfsAnnual, beta);
+		double minusValue = ratesAnnual - rfsAnnual;
+		if (beta.compareTo(0d) == 0 || Double.isNaN(beta)) {
+			// 如果分子也是0,结果无意义
+			if (minusValue == 0.) {
+				return null;
+			} else if (minusValue < 0.) {
+				return IndicatorConst.BEST_INDICATOR_VALUE * -1;
+			}
+			return IndicatorConst.BEST_INDICATOR_VALUE;
+		}
+		return DataUtil.divNearZeroValue(minusValue, beta);
 	}
 
 }

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/UpCaptureRatio.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import com.smppw.utils.DataUtil;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/UpCaptureReturn.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 1 - 1
src/main/java/com/smppw/core/reta/calc/VaRFunction.java

@@ -1,4 +1,4 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import org.apache.commons.math3.analysis.UnivariateFunction;
 import org.apache.commons.math3.distribution.NormalDistribution;

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/WinRate.java

@@ -1,8 +1,8 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/WinRateWithZero.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/WorstRet.java

@@ -1,9 +1,9 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 
 import com.smppw.common.pojo.dto.CompoundRet;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 
 import java.util.List;
 

+ 2 - 2
src/main/java/com/smppw/core/reta/calc/XIRR.java

@@ -1,7 +1,7 @@
-package com.smppw.core.reta.calc;
+package com.smppw.core.rate.calc;
 
 import com.smppw.common.pojo.dto.DateValue;
-import com.smppw.core.reta.Rate;
+import com.smppw.core.rate.Rate;
 import org.joda.time.DateTime;
 
 import java.util.ArrayList;

+ 1 - 1
src/main/java/com/smppw/utils/FunctionUtil.java

@@ -1,7 +1,7 @@
 package com.smppw.utils;
 
 import com.smppw.common.pojo.dto.CompoundRet;
-import com.smppw.core.reta.calc.VaRFunction;
+import com.smppw.core.rate.calc.VaRFunction;
 import org.apache.commons.math3.analysis.solvers.BrentSolver;
 
 import java.util.ArrayList;

+ 3 - 3
src/main/java/com/smppw/utils/IndicatorCalcUtil.java

@@ -11,9 +11,9 @@ import com.smppw.common.pojo.enums.TimeRange;
 import com.smppw.common.pojo.enums.TrendType;
 import com.smppw.constants.DateConst;
 import com.smppw.constants.IndicatorConst;
-import com.smppw.core.reta.IndicatorFactory;
-import com.smppw.core.reta.Rate;
-import com.smppw.core.reta.calc.PerformanceConsistency;
+import com.smppw.core.rate.IndicatorFactory;
+import com.smppw.core.rate.Rate;
+import com.smppw.core.rate.calc.PerformanceConsistency;
 import com.smppw.core.trend.Trend;
 import com.smppw.core.trend.TrendFactory;
 import org.apache.commons.lang3.StringUtils;

+ 4 - 4
src/main/java/com/smppw/utils/StrategyHandleUtils.java

@@ -2,10 +2,10 @@ package com.smppw.utils;
 
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.NumberUtil;
-import com.smppw.common.pojo.IStrategy;
-import com.smppw.common.pojo.NewPublicSubStrategy;
-import com.smppw.common.pojo.NewSubStrategy;
-import com.smppw.common.pojo.PublicSubStrategyFullName;
+import com.smppw.common.pojo.enums.strategy.IStrategy;
+import com.smppw.common.pojo.enums.strategy.NewPublicSubStrategy;
+import com.smppw.common.pojo.enums.strategy.NewSubStrategy;
+import com.smppw.common.pojo.enums.strategy.PublicSubStrategyFullName;
 import com.smppw.common.pojo.enums.strategy.Strategy;
 import com.smppw.common.pojo.enums.strategy.ThirdStrategy;
 import org.apache.commons.lang3.StringUtils;