Coding Project Test
Project Goal:
- The goal of the coding project is to create a general event-driven back-testing framework that can test various tradingor allocation strategies. The strategies can be based on fundamental, macro or technical signals.
Language:
- Python
Use of Third-party Library:
- No constraints
Notes:
- As the framework need to be able to handle various types of strategies (as you can see in the examples in the Details section), ideally it should be written in Object Oriented Programming style
- The back-testing framework should be event-driven instead of vector based, as the latter is hard to get generalized to different types of strategies
- The framework should be able to handle both cases 1) and 2) provided in the details below
Details:
General Guidelines:
The back-testing project will be divided into two parts. Each part is separate from the other, but they should share a common underlying framework. Part 1) is to test a simpler one asset, one signal case. Part 2) is to test a more complicated multi-asset, systematic rebalancing case. The part 2) also tests your derivatives knowledge and involves a few technical details. If you don't know how to handle some of the details, please code based on your own assumptions and make sure you highlight the assumptions in commentary sections of your code. If given your background, you have no clue about the part 2), then please focus on the part 1) and make sure it can be expanded to a multi-asset case easily and show in an example.
The starting balance of the portfolio in both cases is $1 million.The back-testing time horizon is from June 2005 to December 2023.
Description of Strategies:
1) Back-test a trend following strategy on S&P 500 ETF (Ticker: SPY):
The strategy is based on the common moving average crossing signal. The rule of the strategy is: if 50-day moving average crosses above 200-day moving average, invest all money in S&P 500; if 50-day moving average crosses below 200-day moving average, sell the existing position; if nothing happened, park the money in cash, earning money market rate. No short or leverage is allowed.
2) Back-test a systematic derivative portfolio strategy based on S&P 500 ETF (Ticker: SPY):
The systematic strategy is based on a common collar derivative strategy below (Note: the total portfolio is a) + b) + c). Don’t treat them as separate portfolios)
a) Long SPY
b) Buy SPY 95% strike OTM put. The put notional is 100% of the long position to provide protection. The maturities of the contracts are evenly spread across 3, 6, 9 and 12-month. The positions are rolled every 3 months to keep the structure stable.
c) Sell SPY 105% strike OTM call. The call notional is 100% of the long position to generate income. The maturity of the contracts is 1 month. They are rolled every month when they expire.
∗ (Bonus) Apply the same strategies as in part 1) and 2), but this time with transaction cost. For S&P 500 index ETF trading, please assume 3 cents per share transaction cost. For SPY derivatives contract trading, please assume 4 cents per share (note: contract multiplier is 100 shares, which means $4 per contract)
Output Requirements:
- Show portfolio net asset value in a time series chart
- Clearly logging all transactions made in following the strategies
- Briefly analyze the results generated from the code and comment on why the strategies worked or did not work. Provide caveat or highlight potential issues in deploying the strategies
Data Files: (Note: you don't have to use all the data if there is redundancy)
- Data needed to test strategies is in the file: Coding_Proj_Data.xls
- Tab 1: SPY price and dividend yield data
- Tab 2: SPY quarterly dividend data
- Tab 3: Interest rate of various maturities: from 1-day to 360-day. If you need interest rates from other maturities, feel free to interpolate.
- Rest of tabs: SPY implied volatility of various maturities. For example, "30IV" tab is the 30-day implied volatility of various strikes. If any maturity or strike level is missing, please linear interpolate/extrapolate yourself from two adjacent maturities or strikes.
Internal