diff -r 841727e27252 -r 7e00d2b13b04 cws/pcw01.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cws/pcw01.tex Wed Aug 12 00:56:20 2020 +0100 @@ -0,0 +1,241 @@ +% !TEX program = xelatex +\documentclass{article} +\usepackage{../style} +\usepackage{disclaimer} +\usepackage{../langs} + + + +\begin{document} + +\section*{Core Part 6 (Scala)} + +\IMPORTANT{This part is about Scala. It is due on \cwSIXa{} at 4pm and worth 7\%.} + +\noindent +Also note that the running time of each part will be restricted to a +maximum of 30 seconds on my laptop. + +\DISCLAIMER{} + +\subsection*{Reference Implementation} + +Like the C++ assignments, the Scala assignments will work like this: you +push your files to GitHub and receive (after sometimes a long delay) some +automated feedback. In the end we take a snapshot of the submitted files and +apply an automated marking script to them.\medskip + +\noindent +In addition, the Scala coursework comes with a reference implementation +in form of \texttt{jar}-files. This allows you to run any test cases +on your own computer. For example you can call Scala on the command +line with the option \texttt{-cp drumb.jar} and then query any +function from the template file. Say you want to find out what +the functions ??? +produce: for this you just need to prefix them with the object name +\texttt{CW6b}. +If you want to find out what these functions produce for the argument +\texttt{6}, you would type something like: + +\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small] +$ scala -cp collatz.jar + +scala> CW6a.collatz(6) +... +scala> CW6a.collatz_max(6) +... +\end{lstlisting}%$ + +\subsection*{Hints} + +\noindent +\textbf{For Core Part:} useful string functions: +\texttt{.startsWith(...)} for checking whether a string has a given +prefix, \texttt{\_ ++ \_} for concatenating two strings; useful option +functions: \texttt{.flatten} flattens a list of options such that it +filters way all \texttt{None}'s, \texttt{Try(...).getOrElse ...} runs +some code that might raise an exception---if yes, then a default value +can be given; useful list functions: \texttt{.head} for obtaining the +first element in a non-empty list, \texttt{.length} for the length of +a list; \texttt{.filter(...)} for filtering out elements in a list; +\texttt{.getLines.toList} for obtaining a list of lines from a file; +\texttt{.split(",").toList} for splitting strings according to a +comma.\bigskip + +\noindent +\textbf{Note!} Fortunately Scala supports operator overloading. But +make sure you understand the difference between \texttt{100 / 3} and +\texttt{100.0 / 3}! + +\newpage +\subsection*{Core Part (7 Marks, file drumb.scala)} + +A purely fictional character named Mr T.~Drumb inherited in 1978 +approximately 200 Million Dollar from his father. Mr Drumb prides +himself to be a brilliant business man because nowadays it is +estimated he is 3 Billion Dollar worth (one is not sure, of course, +because Mr Drumb refuses to make his tax records public). + +Since the question about Mr Drumb's business acumen remains open, +let's do a quick back-of-the-envelope calculation in Scala whether his +claim has any merit. Let's suppose we are given \$100 in 1978 and we +follow a really dumb investment strategy, namely: + +\begin{itemize} +\item We blindly choose a portfolio of stocks, say some Blue-Chip stocks + or some Real Estate stocks. +\item If some of the stocks in our portfolio are traded in January of + a year, we invest our money in equal amounts in each of these + stocks. For example if we have \$100 and there are four stocks that + are traded in our portfolio, we buy \$25 worth of stocks + from each. (Be careful to also test cases where you trade with 3 stocks.) +\item Next year in January, we look at how our stocks did, liquidate + everything, and re-invest our (hopefully) increased money in again + the stocks from our portfolio (there might be more stocks available, + if companies from our portfolio got listed in that year, or less if + some companies went bust or were de-listed). +\item We do this for 41 years until January 2019 and check what would + have become out of our \$100. +\end{itemize} + +\noindent +Until Yahoo was bought by Altaba a few years ago, historical stock market +data for such back-of-the-envelope calculations was freely available +online. Unfortunately nowadays this kind of data is more difficult to +obtain, unless you are prepared to pay extortionate prices or be +severely rate-limited. Therefore this part comes with a number +of files containing CSV-lists with the historical stock prices for the +companies in our portfolios. Use these files for the following +tasks.\bigskip + +\newpage +\noindent +\textbf{Tasks} + +\begin{itemize} +\item[(1)] Write a function \texttt{get\_january\_data} that takes a + stock symbol and a year as arguments. The function reads the + corresponding CSV-file and returns the list of strings that start + with the given year (each line in the CSV-list is of the form + \texttt{someyear-01-someday,someprice}).\hfill[1 Mark] + +\item[(2)] Write a function \texttt{get\_first\_price} that takes + again a stock symbol and a year as arguments. It should return the + first January price for the stock symbol in the given year. For this + it uses the list of strings generated by + \texttt{get\_january\_data}. A problem is that normally a stock + exchange is not open on 1st of January, but depending on the day of + the week on a later day (maybe 3rd or 4th). The easiest way to solve + this problem is to obtain the whole January data for a stock symbol + and then select the earliest, or first, entry in this list. The + stock price of this entry should be converted into a double. Such a + price might not exist, in case the company does not exist in the given + year. For example, if you query for Google in January of 1980, then + clearly Google did not exist yet. Therefore you are asked to + return a trade price with type \texttt{Option[Double]}\ldots\texttt{None} + will be the value for when no price exists; \texttt{Some} if there is a + price.\hfill[1 Mark] + +\item[(3)] Write a function \texttt{get\_prices} that takes a + portfolio (a list of stock symbols), a years range and gets all the + first trading prices for each year in the range. You should organise + this as a list of lists of \texttt{Option[Double]}'s. The inner + lists are for all stock symbols from the portfolio and the outer + list for the years. For example for Google and Apple in years 2010 + (first line), 2011 (second line) and 2012 (third line) you obtain: + +\begin{verbatim} + List(List(Some(312.204773), Some(26.782711)), + List(Some(301.0466), Some(41.244694)), + List(Some(331.462585), Some(51.464207)))) +\end{verbatim}\hfill[1 Mark] + + +%\end{itemize} + +%\subsection*{Advanced Part 3 (4 Marks, continue in file drumb.scala)} +% +%\noindent +%\textbf{Tasks} + +%\begin{itemize} + +\item[(4)] Write a function that calculates the \emph{change factor} (delta) + for how a stock price has changed from one year to the next. This is + only well-defined, if the corresponding company has been traded in both + years. In this case you can calculate + + \[ + \frac{price_{new} - price_{old}}{price_{old}} + \] + + If the change factor is defined, you should return it + as \texttt{Some(change\_factor)}; if not, you should return + \texttt{None}.\mbox{}\hfill\mbox{[1 Mark]} + +\item[(5)] Write a function that calculates all change factors + (deltas) for the prices we obtained in Task (2). For the running + example of Google and Apple for the years 2010 to 2012 you should + obtain 4 change factors: + +\begin{verbatim} + List(List(Some(-0.03573991804411003), Some(0.539974575389325)), + List(Some(0.10103414222249969), Some(0.24777764141006836))) +\end{verbatim} + + That means Google did a bit badly in 2010, while Apple did very well. + Both did OK in 2011. Make sure you handle the cases where a company is + not listed in a year. In such cases the change factor should be \texttt{None} + (recall Task~(4)). + \mbox{}\hfill\mbox{[1 Mark]} + +\item[(6)] Write a function that calculates the ``yield'', or + balance, for one year for our portfolio. This function takes the + change factors, the starting balance and the year as arguments. If + no company from our portfolio existed in that year, the balance is + unchanged. Otherwise we invest in each existing company an equal + amount of our balance. Using the change factors computed under Task + (2), calculate the new balance. Say we had \$100 in 2010, we would have + received in our running example involving Google and Apple: + + \begin{verbatim} + $50 * -0.03573991804411003 + $50 * 0.539974575389325 + = $25.21173286726075 + \end{verbatim} + + as profit for that year, and our new balance for 2011 is \$125 when + converted to a \texttt{Long}.\mbox{}\hfill\mbox{[1 Mark]} + +\item[(7)] Write a function that calculates the overall balance + for a range of years where each year the yearly profit is compounded to + the new balances and then re-invested into our portfolio. + For this use the function and results generated under (6).\\ + \mbox{}\hfill\mbox{[1 Mark]} +\end{itemize}\medskip + + + +\noindent +\textbf{Test Data:} File \texttt{drumb.scala} contains two portfolios +collected from the S\&P 500, one for blue-chip companies, including +Facebook, Amazon and Baidu; and another for listed real-estate +companies, whose names I have never heard of. Following the dumb +investment strategy from 1978 until 2019 would have turned a starting +balance of \$100 into roughly \$39,162 for real estate and a whopping +\$462,199 for blue chips. Note when comparing these results with your +own calculations: there might be some small rounding errors, which +when compounded lead to moderately different values.\bigskip + + +\noindent +\textbf{Moral:} Reflecting on our assumptions, we are over-estimating +our yield in many ways: first, who can know in 1978 about what will +turn out to be a blue chip company. Also, since the portfolios are +chosen from the current S\&P 500, they do not include the myriad +of companies that went bust or were de-listed over the years. +So where does this leave our fictional character Mr T.~Drumb? Well, given +his inheritance, a really dumb investment strategy would have done +equally well, if not much better.\medskip + +\end{document} +