• zp's avatar
    init · f9a4de2a
    zp authored
    f9a4de2a
FormulaToUserUtil.java 3.81 KB
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();
    }

}