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(); } }