I just wanted to post modifications I used to adjust for stock splits.
Historical data from Yahoo is not adjusted for stock splits, ie open, high, low, and close are quoted unadjusted. However there is a column called adj. price, which can be used to calculate an adjustment coefficient. Another modification I made to YahooEODQuoteFilter object is to add a Symbol variable to toEODQuote method: toEODQuote(String quoteLine, Symbol ticker). This allows you to import Yahoo historical data from .csv files.
Here is the patch:
--- ../../../../../../venice-0.72beta-src/src/org/mov/quote/YahooEODQuoteFilter.java 2006-05-06 01:26:18.000000000 -0700
+++ ../../../../../src/org/mov/quote/YahooEODQuoteFilter.java 2006-04-20 22:30:37.000000000 -0700
@@ -42,8 +42,6 @@
public class YahooEODQuoteFilter implements EODQuoteFilter {
private Symbol symbol;
- //public Symbol symbol;
-
/**
* Creates an instance of the filter.
@@ -51,12 +49,7 @@
public YahooEODQuoteFilter(Symbol symbol) {
this.symbol = symbol;
}
-
- public void TransferSymbol(Symbol symbol) {
- this.symbol = symbol;
- }
-
-
+
/**
* Return the name of the filter.
*
@@ -65,7 +58,7 @@
public String getName() {
return "Yahoo";
}
-
+
/**
* Parse the given text string and returns the stock quote or null
* if it did not contain a valid quote.
@@ -74,11 +67,10 @@
* @exception QuoteFormatException if the quote could not be parsed
* @return the stock quote
*/
- public EODQuote toEODQuote(String quoteLine, Symbol ticker) throws QuoteFormatException {
- Object temp;
+ public EODQuote toEODQuote(String quoteLine) throws QuoteFormatException {
EODQuote quote = null;
- String header = "Date,Open,High,Low,Close,Volume,Adj. Close*";
- if(quoteLine != null & quoteLine.compareTo(header) != 0) {
+
+ if(quoteLine != null) {
String[] quoteParts = quoteLine.split(",");
int i = 0;
@@ -98,36 +90,16 @@
float day_high = Float.parseFloat(quoteParts[i++]);
float day_low = Float.parseFloat(quoteParts[i++]);
float day_close = Float.parseFloat(quoteParts[i++]);
- float unadj_day_volume = Long.parseLong(quoteParts[i++]);
- float adj_day_close=Float.parseFloat(quoteParts[i++]);
-
- float adj_coeff=adj_day_close/day_close; //calculate adjustment coefficient for dividents and splits
- day_open=day_open*adj_coeff; //applying adjustment coefficient
- day_high=day_high*adj_coeff;
- day_low=day_low*adj_coeff;
- long day_volume= (long) (unadj_day_volume/adj_coeff);
- day_close=adj_day_close;
-
- if (day_open==0 || day_high==0 || day_low==0 || day_close==0){
- try {
- Symbol invalid_symbol = Symbol.toSymbol("invalid");
- quote = new EODQuote(invalid_symbol, date, 1, 1, 1, 1, 1);
- } catch (SymbolFormatException ex) {
- ex.printStackTrace();
- }
- }
- else {
- quote = new EODQuote(ticker, date, day_volume, day_low, day_high, day_open, day_close);
- }
+ int day_volume = Integer.parseInt(quoteParts[i++]);
+ // the remaining one is adjusted day close
+ quote = new EODQuote(symbol, date, day_volume, day_low, day_high,
+ day_open, day_close);
}
catch(NumberFormatException e) {
throw new QuoteFormatException(Locale.getString("ERROR_PARSING_NUMBER",
quoteParts[i - 1]));
}
- catch(ArithmeticException e) {
- throw new QuoteFormatException(Locale.getString("ERROR_ARITHMETIC_EXCEPTION"));
- }
}
else
throw new QuoteFormatException(Locale.getString("WRONG_FIELD_COUNT"));
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I just wanted to post modifications I used to adjust for stock splits.
Historical data from Yahoo is not adjusted for stock splits, ie open, high, low, and close are quoted unadjusted. However there is a column called adj. price, which can be used to calculate an adjustment coefficient. Another modification I made to YahooEODQuoteFilter object is to add a Symbol variable to toEODQuote method: toEODQuote(String quoteLine, Symbol ticker). This allows you to import Yahoo historical data from .csv files.
Here is the patch:
--- ../../../../../../venice-0.72beta-src/src/org/mov/quote/YahooEODQuoteFilter.java 2006-05-06 01:26:18.000000000 -0700
+++ ../../../../../src/org/mov/quote/YahooEODQuoteFilter.java 2006-04-20 22:30:37.000000000 -0700
@@ -42,8 +42,6 @@
public class YahooEODQuoteFilter implements EODQuoteFilter {
private Symbol symbol;
- //public Symbol symbol;
-
/**
* Creates an instance of the filter.
@@ -51,12 +49,7 @@
public YahooEODQuoteFilter(Symbol symbol) {
this.symbol = symbol;
}
-
- public void TransferSymbol(Symbol symbol) {
- this.symbol = symbol;
- }
-
-
+
/**
* Return the name of the filter.
*
@@ -65,7 +58,7 @@
public String getName() {
return "Yahoo";
}
-
+
/**
* Parse the given text string and returns the stock quote or null
* if it did not contain a valid quote.
@@ -74,11 +67,10 @@
* @exception QuoteFormatException if the quote could not be parsed
* @return the stock quote
*/
- public EODQuote toEODQuote(String quoteLine, Symbol ticker) throws QuoteFormatException {
- Object temp;
+ public EODQuote toEODQuote(String quoteLine) throws QuoteFormatException {
EODQuote quote = null;
- String header = "Date,Open,High,Low,Close,Volume,Adj. Close*";
- if(quoteLine != null & quoteLine.compareTo(header) != 0) {
+
+ if(quoteLine != null) {
String[] quoteParts = quoteLine.split(",");
int i = 0;
@@ -98,36 +90,16 @@
float day_high = Float.parseFloat(quoteParts[i++]);
float day_low = Float.parseFloat(quoteParts[i++]);
float day_close = Float.parseFloat(quoteParts[i++]);
- float unadj_day_volume = Long.parseLong(quoteParts[i++]);
- float adj_day_close=Float.parseFloat(quoteParts[i++]);
-
- float adj_coeff=adj_day_close/day_close; //calculate adjustment coefficient for dividents and splits
- day_open=day_open*adj_coeff; //applying adjustment coefficient
- day_high=day_high*adj_coeff;
- day_low=day_low*adj_coeff;
- long day_volume= (long) (unadj_day_volume/adj_coeff);
- day_close=adj_day_close;
-
- if (day_open==0 || day_high==0 || day_low==0 || day_close==0){
- try {
- Symbol invalid_symbol = Symbol.toSymbol("invalid");
- quote = new EODQuote(invalid_symbol, date, 1, 1, 1, 1, 1);
- } catch (SymbolFormatException ex) {
- ex.printStackTrace();
- }
- }
- else {
- quote = new EODQuote(ticker, date, day_volume, day_low, day_high, day_open, day_close);
- }
+ int day_volume = Integer.parseInt(quoteParts[i++]);
+ // the remaining one is adjusted day close
+ quote = new EODQuote(symbol, date, day_volume, day_low, day_high,
+ day_open, day_close);
}
catch(NumberFormatException e) {
throw new QuoteFormatException(Locale.getString("ERROR_PARSING_NUMBER",
quoteParts[i - 1]));
}
- catch(ArithmeticException e) {
- throw new QuoteFormatException(Locale.getString("ERROR_ARITHMETIC_EXCEPTION"));
- }
}
else
throw new QuoteFormatException(Locale.getString("WRONG_FIELD_COUNT"));