cws/main_cw01.tex
changeset 345 40657f9a4e4a
parent 343 c8fcc0e0a57f
child 356 d1046d9d3213
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cws/main_cw01.tex	Sat Oct 31 16:47:46 2020 +0000
@@ -0,0 +1,237 @@
+% !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 5pm 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 function \code{get_january_data}
+produces: for this you just need to prefix them with the object name
+\texttt{CW6b} and call them with some arguments: 
+
+\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
+$ scala -cp drumb.jar
+  
+scala> CW6b.get_january_data("FB", 2014)
+val res2: List[String] = List(2014-01-02,54.709999,....)
+\end{lstlisting}%$
+
+\subsection*{Hints}
+
+\noindent
+\textbf{For the 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}
+