package dailyBot.analysis;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.encog.engine.network.activation.ActivationLinear;
import org.encog.engine.network.activation.ActivationSigmoid;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.basic.BasicMLData;
import org.encog.ml.data.basic.BasicMLDataSet;
import org.encog.neural.data.NeuralDataSet;
import org.encog.neural.data.basic.BasicNeuralDataSet;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.Train;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;
import org.encog.util.simple.EncogUtility;
import dailyBot.model.Pair;
import dailyBot.model.Strategy.StrategyId;
public class NeuralNetworkAnalysis
{
public static void test(double[][] inputValues, double[][] outputValues)
{
NeuralDataSet trainingSet = new BasicNeuralDataSet(inputValues, outputValues);
BasicNetwork network = new BasicNetwork();
network.addLayer(new BasicLayer(new ActivationSigmoid(), false, 4));
network.addLayer(new BasicLayer(new ActivationSigmoid(), false, 1000));
network.addLayer(new BasicLayer(new ActivationLinear(), false, 1));
network.getStructure().finalizeStructure();
network.reset();
final Train train = new ResilientPropagation(network, trainingSet);
int epoch = 1;
do
{
train.iteration();
System.out.println("Epoch #" + epoch + " Error:" + train.getError());
epoch++;
}
while(epoch < 10000);
System.out.println("Neural Network Results:");
for(MLDataPair pair : trainingSet)
{
final MLData output = network.compute(pair.getInput());
System.out.println(pair.getInput().getData(0) + "," + pair.getInput().getData(1) + ", actual="
+ output.getData(0) + ",ideal=" + pair.getIdeal().getData(0));
}
}
static String print(double[] input, double[] output)
{
String ans = "";
for(double d : input)
ans += " " + d;
for(double d : output)
ans += " " + d;
return ans.trim() + '\n';
}
private static BasicNetwork generateNeuralNetwork(StrategyId id, Pair currency, boolean isBuy, int iterations,
int middleNeurons) throws IOException
{
List<SignalHistoryRecord> allEntries = Utils.getStrategyRecords(id, currency);
Collections.shuffle(allEntries);
int validationSize = (int) Math.round(allEntries.size() * 0.2);
double[][] inputs = new double[allEntries.size() - validationSize][];
double[][] outputs = new double[allEntries.size() - validationSize][];
double[][] inputsValidation = new double[validationSize][];
double[][] outputsValidation = new double[validationSize][];
int index = 0;
int indexValidation = 0;
for(SignalHistoryRecord entry : allEntries)
{
if(index < inputs.length)
{
inputs[index] = entry.getCharacteristics();
outputs[index++] = entry.getOutput();
}
else
{
inputsValidation[indexValidation] = entry.getCharacteristics();
outputsValidation[indexValidation++] = entry.getOutput();
}
}
test(inputs, outputs);
BasicNetwork network = EncogUtility.simpleFeedForward(inputs[0].length, 50, 0, outputs[0].length, true);
MLDataSet trainingSet = new BasicMLDataSet(inputs, outputs);
System.out.println("Neural Network Results:");
EncogUtility.trainConsole(network, trainingSet, 1);
for(int i = 0; i < inputs.length; i++)
{
final MLData output = network.compute(new BasicMLData(inputs[i]));
System.out.println(Arrays.toString(inputs[i]) + ", actual=" + output.getData(0) + ", ideal="
+ outputs[i][0]);
}
System.out.println("Validation:");
System.out.println("Validation:");
System.out.println("Validation:");
System.out.println("Validation:");
for(int i = 0; i < inputsValidation.length; i++)
{
final MLData output = network.compute(new BasicMLData(inputsValidation[i]));
System.out.println(Arrays.toString(inputsValidation[i]) + ", actual=" + output.getData(0) + ", ideal="
+ outputsValidation[i][0]);
}
return network;
}
public static void main(String[] args) throws IOException
{
generateNeuralNetwork(StrategyId.MOMENTUM2, Pair.EURAUD, true, 1000, 100);
}
}