43   for (year <- years.toList) yield  | 
    43   for (year <- years.toList) yield  | 
    44     for (symbol <- portfolio) yield get_first_price(symbol, year)  | 
    44     for (symbol <- portfolio) yield get_first_price(symbol, year)  | 
    45   | 
    45   | 
    46   | 
    46   | 
    47 // test case  | 
    47 // test case  | 
    48 val prices_fb    = get_prices(List("FB"), 2012 to 2014) | 
    48 val p_fb = get_prices(List("FB"), 2012 to 2014) | 
    49 val prices_goap = get_prices(List("GOOG", "AAPL"), 2010 to 2014) | 
    49 val p = get_prices(List("GOOG", "AAPL"), 2010 to 2012) | 
    50 val prices_bidu = get_prices(List("BIDU"), 2004 to 2008) | 
    50   | 
    51 val prices_goapfb = get_prices(List("GOOG", "AAPL", "FB"), 2010 to 2016) | 
    51 val tt = get_prices(List("BIDU"), 2004 to 2008) | 
    52   | 
    52   | 
    53 // (2) The first function below calculates the change factor (delta) between  | 
    53 // (2) The first function below calculates the change factor (delta) between  | 
    54 // a price in year n and a price in year n+1. The second function calculates  | 
    54 // a price in year n and a price in year n+1. The second function calculates  | 
    55 // all change factors for all prices (from a portfolio).  | 
    55 // all change factors for all prices (from a portfolio).  | 
    56   | 
    56   | 
    65   for (i <- (0 until (data.length - 1)).toList) yield   | 
    65   for (i <- (0 until (data.length - 1)).toList) yield   | 
    66     for (j <- (0 until (data(0).length)).toList) yield get_delta(data(i)(j), data(i + 1)(j))  | 
    66     for (j <- (0 until (data(0).length)).toList) yield get_delta(data(i)(j), data(i + 1)(j))  | 
    67   | 
    67   | 
    68   | 
    68   | 
    69 // test case using the prices calculated above  | 
    69 // test case using the prices calculated above  | 
    70 val deltas_fb   = get_deltas(prices_fb)  | 
    70 val d = get_deltas(p)  | 
    71 val deltas_goap = get_deltas(prices_goap)  | 
    71 val ttd = get_deltas(tt)  | 
    72 val deltas_bidu = get_deltas(prices_bidu)  | 
         | 
    73 val deltas_goapfb = get_deltas(prices_goapfb)  | 
         | 
    74   | 
         | 
    75   | 
    72   | 
    76 // (3) Write a function that given change factors, a starting balance and a year  | 
    73 // (3) Write a function that given change factors, a starting balance and a year  | 
    77 // calculates the yearly yield, i.e. new balanace, according to our dump investment   | 
    74 // calculates the yearly yield, i.e. new balanace, according to our dump investment   | 
    78 // strategy. Another function calculates given the same data calculates the  | 
    75 // strategy. Another function calculates given the same data calculates the  | 
    79 // compound yield up to a given year. Finally a function combines all   | 
    76 // compound yield up to a given year. Finally a function combines all   | 
    85   val somes = data(year).flatten  | 
    82   val somes = data(year).flatten  | 
    86   val somes_length = somes.length  | 
    83   val somes_length = somes.length  | 
    87   if (somes_length == 0) balance  | 
    84   if (somes_length == 0) balance  | 
    88   else { | 
    85   else { | 
    89     val portion: Double = balance.toDouble / somes_length.toDouble  | 
    86     val portion: Double = balance.toDouble / somes_length.toDouble  | 
    90     (for (x <- somes) yield ((1.0 + x) * portion)).sum.toLong  | 
    87     balance + (for (x <- somes) yield (x * portion)).sum.toLong  | 
    91     //balance + (for (x <- somes) yield (x * portion)).sum.toLong  | 
         | 
    92   }  | 
         | 
    93 }  | 
         | 
    94   | 
         | 
    95 def yearly_yield_double(data: List[List[Option[Double]]], balance: Double, year: Int): Double = { | 
         | 
    96   val somes = data(year).flatten  | 
         | 
    97   val somes_length = somes.length  | 
         | 
    98   if (somes_length == 0) balance  | 
         | 
    99   else { | 
         | 
   100     val portion: Double = balance / somes_length.toDouble  | 
         | 
   101     balance + (for (x <- somes) yield (x * portion)).sum  | 
         | 
   102   }  | 
    88   }  | 
   103 }  | 
    89 }  | 
   104   | 
    90   | 
   105 def compound_yield(data: List[List[Option[Double]]], balance: Long, year: Int): Long = { | 
    91 def compound_yield(data: List[List[Option[Double]]], balance: Long, year: Int): Long = { | 
   106   println(balance)  | 
         | 
   107   if (year >= data.length) balance else { | 
    92   if (year >= data.length) balance else { | 
   108     val new_balance = yearly_yield(data, balance, year)  | 
    93     val new_balance = yearly_yield(data, balance, year)  | 
   109     compound_yield(data, new_balance, year + 1)  | 
    94     compound_yield(data, new_balance, year + 1)  | 
   110   }  | 
    95   }  | 
   111 }  | 
    96 }  | 
   112   | 
         | 
   113 def compound_yield_double(data: List[List[Option[Double]]], balance: Double, year: Int): Long = { | 
         | 
   114   if (year >= data.length) balance.toLong else { | 
         | 
   115     val new_balance = yearly_yield_double(data, balance.toDouble, year)  | 
         | 
   116     compound_yield_double(data, new_balance, year + 1)  | 
         | 
   117   }  | 
         | 
   118 }  | 
         | 
   119   | 
         | 
   120 val prices_fb    = get_prices(List("FB"), 2012 to 2014) | 
         | 
   121 val prices_goap = get_prices(List("GOOG", "AAPL"), 2010 to 2014) | 
         | 
   122 val prices_bidu = get_prices(List("BIDU"), 2004 to 2008) | 
         | 
   123 val prices_goapfb = get_prices(List("GOOG", "AAPL", "FB"), 2010 to 2016) | 
         | 
   124   | 
         | 
   125 val deltas_fb   = get_deltas(prices_fb)  | 
         | 
   126 val deltas_goap = get_deltas(prices_goap)  | 
         | 
   127 val deltas_bidu = get_deltas(prices_bidu)  | 
         | 
   128 val deltas_goapfb = get_deltas(prices_goapfb)  | 
         | 
   129   | 
         | 
   130   | 
         | 
   131 yearly_yield(deltas_bidu, 100, 0)  | 
         | 
   132 yearly_yield(deltas_bidu, 100, 1)  | 
         | 
   133 yearly_yield(deltas_bidu, 100, 2)  | 
         | 
   134 yearly_yield(deltas_bidu, 192, 3)  | 
         | 
   135 //598  | 
         | 
   136   | 
         | 
   137 yearly_yield(deltas_fb, 100, 0)  | 
         | 
   138 yearly_yield(deltas_fb, 100, 1)  | 
         | 
   139 //yearly_yield(deltas_fb, 195, 2)  | 
         | 
   140   | 
         | 
   141 yearly_yield(deltas_goap, 100, 0)  | 
         | 
   142 yearly_yield(deltas_goap, 125, 1)  | 
         | 
   143 yearly_yield(deltas_goap, 146, 2)  | 
         | 
   144 yearly_yield(deltas_goap, 177, 3)  | 
         | 
   145 //yearly_yield(deltas_goap, 227, 4)  | 
         | 
   146   | 
         | 
   147 yearly_yield(deltas_goapfb, 100, 0)  | 
         | 
   148 yearly_yield(deltas_goapfb, 125, 1)  | 
         | 
   149 yearly_yield(deltas_goapfb, 146, 2)  | 
         | 
   150 yearly_yield(deltas_goapfb, 177, 3)  | 
         | 
   151 yearly_yield(deltas_goapfb, 267, 4)  | 
         | 
   152 yearly_yield(deltas_goapfb, 337, 5)  | 
         | 
   153 //416  | 
         | 
   154   | 
         | 
   155 compound_yield(deltas_goapfb.take(1), 100, 0)  | 
         | 
   156 compound_yield(deltas_goapfb.take(2), 100, 0)  | 
         | 
   157 compound_yield(deltas_goapfb.take(3), 100, 0)  | 
         | 
   158 compound_yield(deltas_goapfb.take(4), 100, 0)  | 
         | 
   159 compound_yield(deltas_goapfb.take(5), 100, 0)  | 
         | 
   160 compound_yield(deltas_goapfb.take(6), 100, 0)  | 
         | 
   161   | 
         | 
   162 compound_yield_double(deltas_goapfb.take(1), 100.0, 0)  | 
         | 
   163 compound_yield_double(deltas_goapfb.take(2), 100.0, 0)  | 
         | 
   164 compound_yield_double(deltas_goapfb.take(3), 100.0, 0)  | 
         | 
   165 compound_yield_double(deltas_goapfb.take(4), 100.0, 0)  | 
         | 
   166 compound_yield_double(deltas_goapfb.take(5), 100.0, 0)  | 
         | 
   167 compound_yield_double(deltas_goapfb.take(6), 100.0, 0)  | 
         | 
   168   | 
    97   | 
   169 //yearly_yield(d, 100, 0)  | 
    98 //yearly_yield(d, 100, 0)  | 
   170 //compound_yield(d.take(6), 100, 0)  | 
    99 //compound_yield(d.take(6), 100, 0)  | 
   171   | 
   100   | 
   172 //test case  | 
   101 //test case  | 
   180 //yearly_yield(d, 125, 1)  | 
   109 //yearly_yield(d, 125, 1)  | 
   181   | 
   110   | 
   182 def investment(portfolio: List[String], years: Range, start_balance: Long): Long = { | 
   111 def investment(portfolio: List[String], years: Range, start_balance: Long): Long = { | 
   183   compound_yield(get_deltas(get_prices(portfolio, years)), start_balance, 0)  | 
   112   compound_yield(get_deltas(get_prices(portfolio, years)), start_balance, 0)  | 
   184 }  | 
   113 }  | 
   185   | 
         | 
   186 def investment_double(portfolio: List[String], years: Range, start_balance: Long): Long = { | 
         | 
   187   compound_yield_double(get_deltas(get_prices(portfolio, years)), start_balance.toDouble, 0)  | 
         | 
   188 }  | 
         | 
   189   | 
         | 
   190   | 
         | 
   191 investment(rstate_portfolio, 1978 to 2017, 100)  | 
         | 
   192 investment(blchip_portfolio, 1978 to 2017, 100)  | 
         | 
   193   | 
         | 
   194 investment_double(rstate_portfolio, 1978 to 2017, 100)  | 
         | 
   195 investment_double(blchip_portfolio, 1978 to 2017, 100)  | 
         | 
   196   | 
         | 
   197   | 
   114   | 
   198 /*  | 
   115 /*  | 
   199 val q1 = get_deltas(get_prices(List("GOOG", "AAPL", "BIDU"), 2000 to 2017)) | 
   116 val q1 = get_deltas(get_prices(List("GOOG", "AAPL", "BIDU"), 2000 to 2017)) | 
   200 yearly_yield(q1, 100, 0)  | 
   117 yearly_yield(q1, 100, 0)  | 
   201 yearly_yield(q1, 100, 1)  | 
   118 yearly_yield(q1, 100, 1)  |