1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.tanpu.fund.utils;
import com.tanpu.common.utils.BigDecimalUtil;
import com.tanpu.fund.utils.model.FundListMixtureRatio;
import com.tanpu.fund.utils.model.FundMixtureRatio;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
* 基金公式管理
*/
public class FormulaToUserUtil {
/**
* 求用户组合基金中单只基金配比
*
* @param fundId
* @param list
* @return
*/
public static String mixtureRatio(String fundId, List<FundMixtureRatio> list) {
if (StringUtils.isEmpty(fundId) || CollectionUtils.isEmpty(list)) {
return null;
}
//基金
FundMixtureRatio fundMixtureRatio = list.stream().filter(item -> StringUtils.equals(item.getFundId(), fundId)).findAny().orElse(null);
if (fundMixtureRatio != null) {
BigDecimal curFundVal = BigDecimalUtil.toBigDecimal(fundMixtureRatio.getNav()).multiply(BigDecimalUtil.toBigDecimal(fundMixtureRatio.getShares()));
List<BigDecimal> collect = list.stream().map(item -> BigDecimalUtil.toBigDecimal(item.getNav()).multiply(BigDecimalUtil.toBigDecimal(item.getShares())))
.collect(Collectors.toList());
BigDecimal sum = BigDecimal.ZERO;
for (BigDecimal k : collect) {
sum = sum.add(k);
}
return curFundVal.divide(sum, 6, BigDecimal.ROUND_HALF_UP).toString();
}
return null;
}
/**
* 求用户组合基金中用户每只基金配比
*
* @param list
* @return
*/
public static List<FundListMixtureRatio> moreMixtureRatio(List<FundMixtureRatio> list) {
if (CollectionUtils.isEmpty(list)) {
return null;
}
List<BigDecimal> collect = list.stream().map(item -> BigDecimalUtil.toBigDecimal(item.getNav()).multiply(BigDecimalUtil.toBigDecimal(item.getShares()))).collect(Collectors.toList());
BigDecimal sum = BigDecimalUtil.sum(collect);
return list.stream().map(item -> {
BigDecimal b = BigDecimalUtil.toBigDecimal(item.getNav()).multiply(BigDecimalUtil.toBigDecimal(item.getShares()));
return FundListMixtureRatio.builder()
.fundId(item.getFundId())
.ratio(sum.divide(b, 6, BigDecimal.ROUND_HALF_UP).toString())
.build();
}).collect(Collectors.toList());
}
/**
* 求用户基金的持仓份额
*
* @param amount 确认金额
* @param subscribeRatio 确认申购费率
* @param nav 确认净值
* @return
*/
public static BigDecimal positionShare(BigDecimal amount, BigDecimal subscribeRatio, BigDecimal nav) {
if (subscribeRatio != null || nav == null) {
return null;
}
BigDecimal b = amount.subtract(amount.multiply(subscribeRatio));
return b.divide(nav, 6, BigDecimal.ROUND_HALF_UP);
}
/**
* 回撤
*
* @param curNav
* @param historyMaxNav
* @return
*/
public static String retracement(String curNav, String historyMaxNav) {
BigDecimal a = BigDecimalUtil.toBigDecimal(curNav);
BigDecimal b = BigDecimalUtil.toBigDecimal(historyMaxNav);
return a.divide(b, 6, BigDecimal.ROUND_HALF_UP).subtract(BigDecimalUtil.toBigDecimal(1)).toString();
}
/**
* 组合收益率
*
* @param list
* @return
*/
public static String combinationRate(List<FundListMixtureRatio> list) {
return BigDecimalUtil.sum(list.stream().map(item -> BigDecimalUtil.toBigDecimal(item.getRatio()).multiply(BigDecimalUtil.toBigDecimal(item.getWeekProfitRate())))
.collect(Collectors.toList())).toString();
}
}