progs/trade_sol.scala
changeset 18 87e55eb309ed
equal deleted inserted replaced
17:ecf83084e41d 18:87e55eb309ed
       
     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