18
|
1 |
// Part 2 about Buy-Low-Sell-High using Yahoo Financial Data
|
|
2 |
//===========================================================
|
|
3 |
|
|
4 |
|
|
5 |
// (1) Complete the function that is given a list of floats
|
|
6 |
// and calculuates the indices for when to buy the commodity
|
|
7 |
// and when to sell
|
|
8 |
|
|
9 |
def trade_times(xs: List[Double]): (Int, Int) = {
|
|
10 |
val low = xs.min
|
|
11 |
val low_index = xs.indexOf(low)
|
|
12 |
val rest = xs.drop(low_index)
|
|
13 |
val high = rest.max
|
|
14 |
val high_index = rest.indexOf(high)
|
|
15 |
(low_index, low_index + high_index)
|
|
16 |
}
|
|
17 |
|
|
18 |
val prices = List(28.0, 18.0, 20.0, 26.0, 24.0)
|
|
19 |
assert(trade_times(prices) == (1, 3), "the trade_times test fails")
|
|
20 |
|
|
21 |
|
|
22 |
// (2) Complete the ``get webpage'' function that takes a
|
|
23 |
// a stock symbol as argument and queries the Yahoo server
|
|
24 |
// at
|
|
25 |
// http://ichart.yahoo.com/table.csv?s=<<insert stock symbol>>
|
|
26 |
//
|
|
27 |
// This servive returns a CSV-list that needs to be separated into
|
|
28 |
// a list of strings.
|
|
29 |
|
|
30 |
import io.Source
|
|
31 |
import scala.util._
|
|
32 |
|
|
33 |
def get_yahoo_page(symbol: String): List[String] = {
|
|
34 |
val url = """http://ichart.yahoo.com/table.csv?s=""" + symbol
|
|
35 |
Try(Source.fromURL(url)("ISO-8859-1").getLines.toList).
|
|
36 |
getOrElse { println(s" Problem with: $url"); List() }
|
|
37 |
}
|
|
38 |
|
|
39 |
// (3) Complete the function that processes the CSV list
|
|
40 |
// extracting the dates and anjusted close prices. The
|
|
41 |
// prices need to be transformed into Doubles.
|
|
42 |
|
|
43 |
def process_page(symbol: String): List[(String, Double)] = {
|
|
44 |
get_yahoo_page(symbol).drop(1).map(_.split(",").toList).map((xs) => (xs(0), xs(6).toDouble))
|
|
45 |
}
|
|
46 |
|
|
47 |
|
|
48 |
// (4) Complete the query_company function that obtains the
|
|
49 |
// processed CSV-list for a stock symbol. It should return
|
|
50 |
// the dates for when to buy and sell the stocks of that company.
|
|
51 |
|
|
52 |
def query_company(symbol: String): (String, String) = {
|
|
53 |
val list = process_page(symbol).reverse
|
|
54 |
val (tbuy, tsell) = trade_times(list.map(_._2))
|
|
55 |
(list(tbuy)._1, list(tsell)._1)
|
|
56 |
}
|
|
57 |
|
|
58 |
//query_company("GOOG")
|
|
59 |
|
|
60 |
|
|
61 |
val indices = List("GOOG", "AAPL", "MSFT", "IBM", "FB", "YHOO", "AMZN", "BIDU")
|
|
62 |
|
|
63 |
for (name <- indices) {
|
|
64 |
val times = query_company(name)
|
|
65 |
println(s"Buy ${name} on ${times._1} and sell on ${times._2}")
|
|
66 |
}
|
|
67 |
|
|
68 |
|
|
69 |
|
|
70 |
/*
|
|
71 |
scala trade.scala 2> /dev/null || echo "command1 borked it"
|
|
72 |
|
|
73 |
command1
|
|
74 |
if [ $? -ne 0 ]; then
|
|
75 |
echo "command1 borked it"
|
|
76 |
fi
|
|
77 |
*/
|
|
78 |
|
|
79 |
|