/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.app.quant.loader.yahoo;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;
import org.encog.Encog;
import org.encog.app.quant.QuantTask;
import org.encog.app.quant.loader.LoaderError;
import org.encog.app.quant.loader.MarketLoader;
import org.encog.util.csv.CSVFormat;
import org.encog.util.csv.ReadCSV;
import org.encog.util.http.FormUtility;
import org.encog.util.time.NumericDateUtil;
/**
* Download financial data from Yahoo.
*/
public class YahooDownload implements MarketLoader, QuantTask {
/**
* The Dow Jones Industrial Average.
*/
public static final String INDEX_DJIA = "^dji";
/**
* The S&P 500.
*/
public static final String INDEX_SP500 = "^gspc";
/**
* The NASDAQ.
*/
public static final String INDEX_NASDAQ = "^ixic";
/**
* The precision to use.
*/
private int precision;
/**
* True, if we were canceled.
*/
private boolean cancel;
/**
* Construct the object with default precision.
*/
public YahooDownload() {
setPercision(Encog.DEFAULT_PRECISION);
}
/**
* This method builds a URL to load data from Yahoo Finance for a neural
* network to train with.
*
* @param ticker
* The ticker symbol to access.
* @param from
* The beginning date.
* @param to
* The ending date.
* @return The UEL
* @throws IOException
* An error accessing the data.
*/
private URL buildURL(final String ticker, final Date from, final Date to)
throws IOException {
// process the dates
final Calendar calendarFrom = Calendar.getInstance();
calendarFrom.setTime(from);
final Calendar calendarTo = Calendar.getInstance();
calendarTo.setTime(to);
// construct the URL
final OutputStream os = new ByteArrayOutputStream();
final FormUtility form = new FormUtility(os, null);
form.add("s", ticker.toUpperCase());
form.add("a", "" + calendarFrom.get(Calendar.MONTH));
form.add("b", "" + calendarFrom.get(Calendar.DAY_OF_MONTH));
form.add("c", "" + calendarFrom.get(Calendar.YEAR));
form.add("d", "" + calendarTo.get(Calendar.MONTH));
form.add("e", "" + calendarTo.get(Calendar.DAY_OF_MONTH));
form.add("f", "" + calendarTo.get(Calendar.YEAR));
form.add("g", "d");
form.add("ignore", ".csv");
os.close();
final String str = "http://ichart.finance.yahoo.com/table.csv?"
+ os.toString();
return new URL(str);
}
/**
* @return the precision.
*/
public final int getPrecision() {
return this.precision;
}
/**
* Load all data.
* @param ticker The ticker.
* @param output The output file.
* @param outputFormat The format of the output file.
* @param from Starting date.
* @param to Ending date.
*/
public final void loadAllData(final String ticker,
final File output,
final CSVFormat outputFormat, final Date from, final Date to) {
try {
final URL url = buildURL(ticker, from, to);
final InputStream is = url.openStream();
final ReadCSV csv = new ReadCSV(is, true, CSVFormat.ENGLISH);
final PrintWriter tw = new PrintWriter(new FileWriter(output));
tw.println(
"date,time,open price,high price,low price,"
+ "close price,volume,adjusted price");
while (csv.next() && !shouldStop()) {
final Date date = csv.getDate("date");
final double adjClose = csv.getDouble("adj close");
final double open = csv.getDouble("open");
final double close = csv.getDouble("close");
final double high = csv.getDouble("high");
final double low = csv.getDouble("low");
final double volume = csv.getDouble("volume");
final NumberFormat df = NumberFormat.getInstance();
df.setGroupingUsed(false);
final StringBuilder line = new StringBuilder();
line.append(NumericDateUtil.date2Long(date));
line.append(outputFormat.getSeparator());
line.append(NumericDateUtil.time2Int(date));
line.append(outputFormat.getSeparator());
line.append(outputFormat.format(open, this.precision));
line.append(outputFormat.getSeparator());
line.append(outputFormat.format(high, this.precision));
line.append(outputFormat.getSeparator());
line.append(outputFormat.format(low, this.precision));
line.append(outputFormat.getSeparator());
line.append(outputFormat.format(close, this.precision));
line.append(outputFormat.getSeparator());
line.append(df.format(volume));
line.append(outputFormat.getSeparator());
line.append(outputFormat.format(adjClose, this.precision));
tw.println(line.toString());
}
tw.close();
} catch (final IOException ex) {
throw new LoaderError(ex);
}
}
/**
* Request to stop.
*/
@Override
public final void requestStop() {
this.cancel = true;
}
/**
* @param thePrecision
* the precision to set
*/
public final void setPercision(final int thePrecision) {
this.precision = thePrecision;
}
/**
* @return True, if we should stop.
*/
@Override
public final boolean shouldStop() {
return this.cancel;
}
}