diff -r a2ac7e3fa330 -r 40657f9a4e4a cws/pcw01.tex --- a/cws/pcw01.tex Sat Oct 31 16:23:12 2020 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,241 +0,0 @@ -% !TEX program = xelatex -\documentclass{article} -\usepackage{../style} -\usepackage{disclaimer} -\usepackage{../langs} - - - -\begin{document} - -\section*{Core Part 6 (Scala, 7 Marks)} - -\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} -