BEEM062 Main Assignment Part B Brief
March 28, 2025
Abstract
Your main assignment (80%) must be handed in by Friday 25th April 2025. It consists of two equally weighted parts: part A) A 1,600 word essay; and part B) A technical task-based assignment. This document outlines your tasks for Part B, which on its own contributes 40% to your overall module grade. For Python based tasks, you MUST solve them using Jupyter Notebooks, with each line of code stored. You will submit your assignment as a set of documents with your notebooks stored separately (with the .ipynb extension so that they can be easily verified). You are welcome to store your own code on your own github repository or elsewhere, but the .ipynb files must be submitted. Since you submit one file, the best way to do this is to submit your part A document, and include a link to a repository (you can use your onedrive or any other) that contains all your files in one folder. Please do not submit large data files, and as ever, please pay attention to cyber security good practice (do not submit/share API keys). Note that any code files that are not .ipynb do not need to be submitted (you can use screen shots).
1 Gradient Descent with Python and NumPy (30 marks)
From a Jupyter notebook in Python, extract two time series of your choice from the CryptoCompare API, calling one xt and the other yt.
You do not have to use the CryptoCompare API (for example you can use the Nasdaq Data Link API). Depending on availability, choose your own frequency and time period, making sure that you can analyse both time series by treating them each as a one dimensional array of the same length, and make sure they are reasonably long (more than 100 observations). Use the numpy library to find OLS estimates of α and β and in the following specification, where et is an assumed white noise error:
yt = α + β + xt + et
Analytically from standard OLS formulae
By trial and error Machine Learning with a Gradient Descent (GD) Algo-rithm
One challenge you may encounter is obtaining convergence, depending on the underlying data. In words, describe why convergence to a Loss Function minimum may be difficult to obtain in practice, and how this might be overcome.
2 Time Series Forecasting with Regularisation (35 marks)
Create a Python notebook that produces a time series forecast of a financial time series of your choice. Pick one single financial time series that you are interested in (eg the Bitcoin price in Sterling), and conduct your analysis in stages:
1. In the first stage, you must describe why you have chosen the series, and what factors you think affect it. Where relevant, describe any general trends, specific events, and what variables you think may drive it. Distin-guish between variables that you should be able to obtain, versus those you cannot.
2. Extract the relevant time series (you could use the cryptocompare API calls already used, or any other).
3. Conduct analysis. You must reduce a larger model with many variables (more than 10) down to a smaller model by applying L1/L2 Regularisation. Scikit learn has examples of implementing the combination of L1 and L2 called elastic nets. Pay attention to stationarity, and use the Scikit learn implementation that uses cross validation (CV) to pin down the hyper parameters (weights on L1 and L2). Also, for the purposes of CV it is important to split time series appropriately by using Scikit learnís TimeSeriesSplit procedure.
3 Build an Experiment Platform. (35 marks)
In this section you are expected to apply the skills we developed building a smart contract using the sCrypt platform. However, feel free to use any other approach you have learnt on other modules or elsewhere, as long as you achieve the same objective.
Overall, design and implement a platform. that allows a researcher to set up a simple experiment like the Ultimatum Game, playing out the experiment on the blockchain (in the case of sCrypt, it uses the BSV blockchain). Your platform. will play out the experiment on-chain, with the logic enforced by the smart contract.
Choose your game from ONE of the following options:
1. Ultimatum Game
Player A proposes a split of a pot (e.g. 1000 satoshis). Player B either accepts or rejects it. If accepted, both receive as proposed. If rejected, neither gets anything.
2. Dictator Game
Player A decides the split of the pot unilaterally. Player B has no choice but to accept.
3. Trust Game (2-Step Transfer)
Player A decides how much to send to Player B. The amount is tripled. Then Player B decides how much to return to A.
4. Modified Ultimatum Game
Same as Ultimatum, but Player B can only accept/reject if the o§er is above a threshold (e.g., >300 satoshis).
5. One-Way Puzzle Incentive
Post a question or riddle on-chain. The first participant who solves it and unlocks the funds using a contract-defined condition (e.g., a correct answer hash) wins.
3.1 Procedure
Overall, proceed as follows:
1. Write up your overall design in words.
2. Write a smart contract that encodes your experiment logic (with sCrypt, you can then compile and test it locally).
3. Deploy the contract (with sCrypt, you can deploy it to the test or main net using small amounts of satoshis, eg 1000).
4. Build a simple front end (html/css/js) that shows how a participant could interact with the contract.
3.2 Submission
For this task, include screen shots (not the code files) in your submission that show you set up the contract logic, compiled and deployed the contract, and any relevant evidence (eg the txids on test or main net, if using sCrypt). You do not have to submit the actual code files, this part can all be based on screen shots. Note that you must not submit your own private keys used in any of the stages. For the front end part, again, there is no need to submit the actual code files, you can just submit screenshots to show it.