FundMethod.java 2.39 KB
Newer Older
zp's avatar
zp committed
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
package com.tanpu.fund.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: zhoupeng
 * @email: zhoupeng_08@163.com
 */
public class FundMethod {

    private static BigDecimal BASE_DIVISOR = new BigDecimal(10000);

    /**
     * <p>盈亏金额</p>
     * 盈亏金额=市值-成本
     *
     * @param market 市值
     * @param cost   成本
     * @return 盈亏金额
     */
    public static String profitLossMoney(String market, String cost) {
        return toBigDecimal(market).subtract(toBigDecimal(cost)).toString();
    }

    /**
     * <p>市值</p>
     * 市值=确认份额*最新净值/10000-确认份额*分红比例/10000
     *
     * @param share 确认份额
     * @param net   最新净值
     * @param bonus 分红比例
     * @return 市值
     */
    public static String marketValue(String share, String net, String bonus) {

        String market;
        if (StringUtils.isNotBlank(bonus)) {

            // TODO 精度待确认
            market = toBigDecimal(share).multiply(toBigDecimal(net).subtract(toBigDecimal(bonus))).divide(BASE_DIVISOR, 6).toString();
        } else {
            market = toBigDecimal(share).multiply(toBigDecimal(net)).divide(BASE_DIVISOR, 6).toString();
        }
        return market;
    }

    /**
     * <p>初始权重</p>
     * 基金初始权重=基金成本/组合基金总成本
     *
     * @param cost    基金成本
     * @param allCost 组合基金总成本
     * @return 基金初始权重
     */
    public static String initWeight(String cost, String allCost) {
        // TODO
        return toBigDecimal(cost).divide(toBigDecimal(allCost), 2).toString();
    }

    public static String maxNet(List<String> nets) {
        List<BigDecimal> bNets = nets.stream().map(FundMethod::toBigDecimal).collect(Collectors.toList());

        BigDecimal max = Collections.max(bNets);
        BigDecimal min = Collections.min(bNets);

        // TODO
        return max.subtract(min).divide(max, 6).toString();
    }

    public static BigDecimal toBigDecimal(String s) {
        return new BigDecimal(s);
    }

    public static BigDecimal toBigDecimal(double s) {
        return new BigDecimal(Double.toString(s));
    }

    public static double toDouble(BigDecimal b) {
        return Double.parseDouble(b.toString());
    }

}