Фон: Имя метода - computeStatsMean (). Он берет начальное значение 100 и добавляет к нему недельную прибыль путем случайной выборки средней недельной прибыли из нормального распределения. Необходимо вычислить, во сколько превратится значение 100 за 3582 недели. Мне нужно провести 1000 испытаний этого метода, чтобы увидеть, как разные значения средней недельной прибыли от нормального распределения дают нам разные значения прибыли. Мне нужно сохранить доходность 1000 акций (значения прибыли или «новые значения») в ArrayList и получить от него максимум, минимум, медианное значение.
Проблема: Я могу запустить метод, сделать выборку и все такое. Но я не могу запустить его на 1000 испытаний. Я пробовал вызвать метод в основном 1000 раз (1000 для цикла), но он заменил старое значение новым в ArrayList.
Код:
class Sample extends SimulateMarket{
public ArrayList<Double> data = new ArrayList<Double>();
public ArrayList<Double> myData = new ArrayList<Double>();
private double mean, stdDev;
private Random random;
private SimulateMarket mySim = new SimulateMarket(); //mySim is an instance of SimulateMarket class used to access variables of Simulate Class
//Constructor
public Sample(){ //Constructor used for the Distributional Technique
random = new Random();
int size = 3582;
for(int i=0; i<size ; i++)
data.add(0.0016+random.nextGaussian()*0.0205); //Random sampling from Normal Distribution
System.out.println(this); //for printing the results
}
//Getters (Mean, Standard Deviation, Median)
public double getMean(){
double sum=0;
for(int i=0; i<mySim.WEEK; i++)
sum += data.get(i);
return sum/data.size();
}
public void computeStatsMean(){
double equity = 100;
for(int i=0; i<100; i++){
equity = equity*(1+getMean());
}
myData.add(equity);
System.out.println("mean : " + getMean());
for(Double num: myData){
System.out.println("with mean:" + num);
}
}
class SimulateMarket{
public static void main(String[] args){
for(int i=0; i<1000; i++){
Sample equity = new Sample();
equity.computeStatsMean();
}
}
}
Как вы вызываете computeStatsMean () из main ()?
Вы расширяете SimulaeMarket, вам не нужно создавать его экземпляр (подумайте о наследовании). Используйте, например, this.WEEK для доступа к участникам SimulateMarket. Вы можете удалить эту строку «private SimulateMarket mySim = ....»
Кроме того, вы можете показать здесь свой main ()? Возможно, вы сбрасываете данные или myData при каждом экземпляре этого класса в main ()
Я отредактировал код и добавил основной метод. @nabsATX, конечно, я сделаю это!
@GokulNathKP Я отредактировал код и добавил основной метод выше.
Вы создаете новый экземпляр Sample
каждый раз внутри for-loop
в main()
.
Sample equity = new Sample();
Следовательно, при вызове equity.computeStatsMean();
старые значения теряются.
Попробуйте, как показано ниже:
Sample equity;
public static void main(String[] args) {
equity = new Sample();
for(int i = 0; i < 1000; i++) {
equity.computeStatsMean();
}
}
В computeStatsMean()
меняем:
equity = equity*(1+getMean());
к
equity = equity*(i+getMean()); // use i instead of 1
В computeStatsMean()
начните значение счетчика с 1 вместо 0. (Надеюсь, вы сможете понять, почему!)
да. Вместо добавления в ArrayList в классе Sample сделайте computeStatsMean () для возврата значений и создайте ArrayList в вашем main () и добавьте значения.
я разместил код выше. Это дает мне те же «1000 значений».
Изменить эквити = эквити * (1 + getMean ()); к эквити = эквити * (я + getMean ());
Сэр, на выходе получается "Бесконечность".
Я поместил метод computeStatsMean () переименовал его в Distributional в класс SimulateMarket и использовал класс Sample для хранения значений. Теперь работает.
class SimulateMarket{ //Application Class (it contains the Main Method)
//public instance variables
public double meanWeekly = 0.0016; //Average weekly return
public double median = 0.0029; //the middle value is known as Median
public final int WEEK = 3582; //Data calculate over the course of 3582 weeks
public final int WEEK_YEAR = 52; //The number can never changes; hence, "final."
//private instance variables
private double meanYearly = meanWeekly * WEEK_YEAR; //Formula for average yearly return
private double stdDev = 0.0205;
public double Distributional(){
Sample mySampleA = new Sample();
double equity = 100;
for(int i=0; i<3582; i++){
equity = equity*(1+mySampleA.getMean());
}
return equity;
}
public static void main(String[] args){
Sample b = new Sample();
b.computeStats();
}
}
class Sample{
public void computeStats(){
for(int i=0; i<4; i++){
myDataA.add(super.Distributional());
}
for(Double num: myDataA){
System.out.println(num);
}
System.out.println(toStringA());
}
public String toStringA(){
return String.format("\nDistrubution: size = %d, mean = %.2f, stdDev = %.2f, min = %.2f, max = %.2f, median = %.2f", myDataA.size(), getMeanA(), getStdDevA(mean), Collections.min(myDataA), Collections.max(myDataA), getMedianA());
}
}
Зачем вам mySim, если ваш класс расширяет SimulateMarket? Кроме того, ваш класс выполняет случайные действия в конструкторе, поэтому вам следует создать новый экземпляр, когда вы хотите получить новые результаты (или переделать свой код). В любом случае, в будущем вам также следует опубликовать свой файл main.