/* * Encog(tm) Examples v2.4 * http://www.heatonresearch.com/encog/ * http://code.google.com/p/encog-java/ * * Copyright 2008-2010 by Heaton Research Inc. * * Released under the LGPL. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * * Encog and Heaton Research are Trademarks of Heaton Research, Inc. * For information on Heaton Research trademarks, visit: * * http://www.heatonresearch.com/copyright.html */ package org.encog.examples.neural.predict.market; import java.io.File; import java.text.DecimalFormat; import java.util.Calendar; import java.util.GregorianCalendar; import org.encog.neural.data.NeuralData; import org.encog.neural.data.NeuralDataPair; import org.encog.neural.data.market.MarketDataDescription; import org.encog.neural.data.market.MarketDataType; import org.encog.neural.data.market.MarketNeuralDataSet; import org.encog.neural.data.market.loader.MarketLoader; import org.encog.neural.data.market.loader.YahooFinanceLoader; import org.encog.neural.networks.BasicNetwork; import org.encog.persist.EncogPersistedCollection; public class MarketEvaluate { enum Direction { up, down }; public static Direction determineDirection(double d) { if (d < 0) return Direction.down; else return Direction.up; } public static MarketNeuralDataSet grabData() { MarketLoader loader = new YahooFinanceLoader(); MarketNeuralDataSet result = new MarketNeuralDataSet(loader, Config.INPUT_WINDOW, Config.PREDICT_WINDOW); MarketDataDescription desc = new MarketDataDescription(Config.TICKER, MarketDataType.ADJUSTED_CLOSE, true, true); result.addDescription(desc); Calendar end = new GregorianCalendar();// end today Calendar begin = (Calendar) end.clone();// begin 30 days ago begin.add(Calendar.DATE, -60); result.load(begin.getTime(), end.getTime()); result.generate(); return result; } public static void evaluate() { File file = new File(Config.FILENAME); if (!file.exists()) { System.out.println("Can't read file: " + file.getAbsolutePath()); return; } EncogPersistedCollection encog = new EncogPersistedCollection(file); BasicNetwork network = (BasicNetwork) encog.find(Config.MARKET_NETWORK); if (network == null) { System.out.println("Can't find network resource: " + Config.MARKET_NETWORK); return; } MarketNeuralDataSet data = grabData(); DecimalFormat format = new DecimalFormat("#0.00"); int count = 0; int correct = 0; for (NeuralDataPair pair : data) { NeuralData input = pair.getInput(); NeuralData actualData = pair.getIdeal(); NeuralData predictData = network.compute(input); double actual = actualData.getData(0); double predict = predictData.getData(0); double diff = Math.abs(predict - actual); Direction actualDirection = determineDirection(actual); Direction predictDirection = determineDirection(predict); if (actualDirection == predictDirection) correct++; count++; System.out.println("Day " + count + ":actual=" + format.format(actual) + "(" + actualDirection + ")" + ",predict=" + format.format(predict) + "(" + predictDirection + ")" + ",diff=" + diff); } double percent = (double) correct / (double) count; System.out.println("Direction correct:" + correct + "/" + count); System.out.println("Directional Accuracy:" + format.format(percent * 100) + "%"); } }