去年在项目里写了一个计算投资风险指标的计算工具类,包含夏普比率,波动率,Var值,最大回撤率四个指标。 计算全部采用BigDecimal类型,开方计算采用牛顿迭代法计算。 其计算公式如下: 工具类实现:
/**
* @describe 投资分析数学计算工具类
*/
public class MathUtil {
/**
* 默认保留小数位数
*/
private final static Integer DECIMAL_SCALE = 15;
/**
* 默认牛顿迭代法计算平方根时迭代次数
*/
private final static Integer PRECISION = 20;
private final static Integer COUNT = 0;
/**
* @describe 计算收益率 * @params startNav 期初单位净值 endNav 期末单位净值
*/
public static BigDecimal dayYield(BigDecimal startNav, BigDecimal endNav) {
return dayYield(startNav, endNav, DECIMAL_SCALE);
}
public static BigDecimal dayYield(BigDecimal startNav, BigDecimal endNav, int decimalScale) {
return dayYield(startNav, endNav, decimalScale, BigDecimal.ROUND_HALF_UP);
}
public static BigDecimal dayYield(BigDecimal startNav, BigDecimal endNav, int decimalScale, int roundingMode) {
BigDecimal dValue = endNav.subtract(startNav);
return dValue.divide(startNav, decimalScale, roundingMode);
}
/**
* @describe 计算累计求和
*/
public static BigDecimal sum(BigDecimal[] dataArray) {
BigDecimal sum = BigDecimal.ZERO;
for (BigDecimal data : dataArray) {
sum = sum.add(data);
}
return sum;
}
/**
* @describe 计算算术平均值
*/
public static BigDecimal avg(BigDecimal[] dataArray) {
return avg(dataArray, DECIMAL_SCALE);
}
public static BigDecimal avg(BigDecimal[] dataArray, int decimalScale) {
return avg(dataArray, decimalScale, BigDecimal.ROUND_HALF_UP);
}
public static BigDecimal avg(BigDecimal[] dataArray, int decimalScale, int roundingMode) {
BigDecimal sum = sum(dataArray);
BigDecimal count = new BigDecimal(dataArray.len
|