public class FileTooBigException extends Exception {
public FileTooBigException(String msg) {
super(msg);
}
}
public class NotEnoughDataException extends Exception {
public NotEnoughDataException(String msg) {
super(msg);
}
}
import java.util.Scanner;
public class Day {
private String date;
private double open;
private double high;
private double low;
private double close;
private long volume;
public double getClose() {
return close;
}
public double getVolume() {
return volume;
}
/**
* Creates a new Day object by reading values from istream:
* date, open, high, log, close, volume: in that order.
* We assume the delimiter has been correctly set on istream so values can be read
* by calling nextX()
* @param istream
*/
public Day (Scanner istream) {
date = istream.next();
open = istream.nextDouble();
high = istream.nextDouble();
low = istream.nextDouble();
close = istream.nextDouble();
volume = istream.nextLong();
}
public String toString() {
return date + " " + close + " " + volume;
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;
public class Security {
private Day[] day;
private int lastDay;
private static final int DAY_ARRAY_SIZE = 1000;
/**
* Add day d to the history, but only if its volume > 0.
* @param d
* @throws FileTooBigException
*/
public void addDay(Day d) throws FileTooBigException {
if (d.getVolume() > 0) {
if (lastDay >= DAY_ARRAY_SIZE) {
throw new FileTooBigException("You cannot have more than " + DAY_ARRAY_SIZE + " days.");
}
day[lastDay++] = d;
}
}
public Security () {
day = new Day[DAY_ARRAY_SIZE];
lastDay = 0;
}
/** Read historical values for this security from a csv stream.
*
* @param file
* @throws FileTooBigException
*/
public void readFromStream(Scanner istream) throws FileTooBigException {
istream.useDelimiter("[,\\s]"); //separate on , or on whitespace
if (istream.hasNext()) {
istream.nextLine(); //ignore first line
}
String w = null;
while (istream.hasNext()) {
//System.out.println("----" + istream.next());
Day nextDay = new Day(istream);
addDay(nextDay);
}
}
public double getVolatility(int numDays) throws NotEnoughDataException {
if (numDays > lastDay) {
throw new NotEnoughDataException("Need more historical data");
}
double average = getAverageClose(numDays);
double squareDifference = 0;
for (int i=0; i < numDays; i++) {
squareDifference += Math.pow(day[i].getClose() - average, 2);
}
double deviation = squareDifference / (double) numDays;
return Math.sqrt(deviation);
}
public double getAverageClose(int numDays) {
double sum = 0;
for (int i=0; i< numDays;i++) {
sum += day[i].getClose();
}
return sum / (double)numDays;
}
public String toString() {
String result = "";
for (int i= 0; i < lastDay; i++) {
result += day[i] + "\n";
}
return result;
}
public double getMinClose(int numDays) {
double min = Double.MAX_VALUE; //assume no stock price is ever this high
for (int i = 0; i < numDays; i++) {
if (day[i].getClose() < min)
min = day[i].getClose();
}
return min;
}
public double getMaxClose(int numDays) {
double max = -1;
for (int i = 0; i < numDays; i++) {
if (day[i].getClose() > max)
max = day[i].getClose();
}
return max;
}
/**
* Returns a price distribution array, where the index of the array is the price - getMinClose(numDays)
* whose contents are the number of days we closed at that price within the last numDays.
* @param numDays
* @return array with getMaxClose(numDays) - getMinClose(numDays) + 1 values
*/
public int[] getPriceDistribution(int numDays) {
int min = (int) getMinClose(numDays);
int max = (int) getMaxClose(numDays);
int[] result = new int[max-min + 1];
for (int i =0; i < numDays; i++) {
result[(int)day[i].getClose() - min]++;
}
return result;
}
public void savePriceDistribution(String outFile,int numDays) throws FileNotFoundException {
PrintWriter out = new PrintWriter(new FileOutputStream(outFile, true));
int min = (int) getMinClose(numDays);
int[] distribution = getPriceDistribution(numDays);
for (int i =0; i < distribution.length; i++) {
int p = min + i;
out.write(p + "," + distribution[i] + "\n");
}
out.close();
}
/**
* @param args
*/
public static void main(String[] args) {
Scanner istream = null;
String inputFile = "/Users/jmvidal/data.csv";
try {
istream = new Scanner(new File(inputFile));
} catch (FileNotFoundException e) {
System.out.println("Ooops, no such input file:" + inputFile);
System.exit(1);
}
Security s = new Security(); //Security class will hold all the data
try {
s.readFromStream(istream); //read the contents from istream
} catch (FileTooBigException e1) { //file is to big to read
System.out.println(e1.getMessage());
System.exit(1);
}
System.out.println(s); //print out all the contents. Note: no days with 0 volume.
try {
System.out.println("Volatility in the last 10 days = " + s.getVolatility(10));
System.out.println("Volatility in the last 1000 days = " + s.getVolatility(1000));
} catch (NotEnoughDataException e) {
System.out.println("Sorry, not enough data." + e.getMessage());
}
System.out.println("Price Distribution for the last 10 days.");
System.out.println("price\tnumber of days");
int[] priceDistribution = s.getPriceDistribution(10); //get the distribution array
int minClose = (int)s.getMinClose(10);
for (int i=0; i < priceDistribution.length; i++) { //we need this loop to print it out
int p = minClose + i;
System.out.println(p + "\t" + priceDistribution[i]);
}
try {
//now, save the distribtion for the last 20 days to a file.
s.savePriceDistribution("/Users/jmvidal/distribution-20.csv",20);
} catch (FileNotFoundException e) {
System.out.println("Ooops, bad output file name.");
System.exit(1);
}
}
}
Tuesday, November 9, 2010
HW6 Solution
Below is my solution to HW6:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment