需求:已知一个数组(array) A, A代表某一支股票的历史的开盘价;以及用于预测未来价格时所考虑的历史天数K,现在要大家写一个函数,将A中的用于预测开盘价所参考的历史值和所预测当天的实际值提取出来。
比如,A是这样一个数组 a=[1,2,3,4,5,6,7,8], 意思是这个股票过期期间的股票价格分别为第一天1刀,第二天2刀,以此类推。K如果等于2,意思是我们在预测股价的时候只考虑过去两个交易日的价格。即如果知道第一天和第二天的价格分别是1刀和2刀,那么预测的第三天价格应该是3刀;如果知道第二天和第三天的价格分别是2刀和3刀,那么预测的第四天价格应该是4刀。
RegressionEquation类:
package PredictBonus;
import org.apache.commons.math3.stat.descriptive.moment.Mean;
/***
* least squares method
* @author miaoyibo
*
*/
public class RegressionEquation {
private double[] dependentValues;
private double[] independentValues;
public RegressionEquation(double[] dependentValues, double[] independentValues) {
this.dependentValues = dependentValues;
this.independentValues = independentValues;
}
public double getMean(double[] dd) {
Mean meanUtil = new Mean();
return meanUtil.evaluate(dd);
}
public double[] getRegressionModel() {
if(dependentValues.length!=independentValues.length) {
return null;
}
Mean meanUtil = new Mean();
double xmean=meanUtil.evaluate(independentValues);
double ymean=meanUtil.evaluate(dependentValues);
double numerator=0d;
double denominator=0d;
for(int i=0;i<dependentValues.length;i++) {
double x=independentValues[i];
double y=dependentValues[i];
numerator=numerator+(x-xmean)*(y-ymean);
denominator=denominator+(x-xmean)*(x-xmean);
}
double b1=numerator/denominator;
double b0=ymean-b1*xmean;
double[] model= {b0,b1};//b0值代表y轴的截距,b1值代表斜率。
return model;
}
}
Predict类:
package PredictBonus;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Predict {
public Map kmom(double[]a, int k){
ArrayList<Double> b=new ArrayList();//预测的历史数据
for (int i=a.length-k;i<a.length;i++){
b.add(a[i]);
}
double[] independentValues=new double[k];//independent:自变量
for (int i=0;i<k;i++){
independentValues[i]=i;
}
double[] dependentValues=new double[b.size()];//自变量
for (int i=0;i<dependentValues.length;i++){
dependentValues[i]=b.get(i);
}
Map<Integer,double[]> map=new HashMap<>();
map.put(1,independentValues);
map.put(2,dependentValues);
return map;
}
public static void main(String[] args) {
int k=2;
Predict p=new Predict();
Map map = p.kmom(new double[]{2, 3, 8, 23}, k);
RegressionEquation regressionEquation=new RegressionEquation((double[]) map.get(2),(double[]) map.get(1));
double[] regressionModel = regressionEquation.getRegressionModel();
double predect =k*regressionModel[1]+regressionModel[0];
System.out.println("预测的值为:"+predect);
}
}