96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
"""MC1-P2: Optimize a portfolio.
|
|
|
|
Copyright 2018, Georgia Institute of Technology (Georgia Tech)
|
|
Atlanta, Georgia 30332
|
|
All Rights Reserved
|
|
|
|
Template code for CS 4646/7646
|
|
|
|
Georgia Tech asserts copyright ownership of this template and all derivative
|
|
works, including solutions to the projects assigned in this course. Students
|
|
and other users of this template code are advised not to share it with others
|
|
or to make it available on publicly viewable websites including repositories
|
|
such as github and gitlab. This copyright statement should not be removed
|
|
or edited.
|
|
|
|
We do grant permission to share solutions privately with non-students such
|
|
as potential employers. However, sharing with other current or future
|
|
students of CS 7646 is prohibited and subject to being investigated as a
|
|
GT honor code violation.
|
|
|
|
-----do not edit anything above this line---
|
|
|
|
Student Name: Tucker Balch (replace with your name)
|
|
GT User ID: tb34 (replace with your User ID)
|
|
GT ID: 900897987 (replace with your GT ID)
|
|
"""
|
|
|
|
|
|
import pandas as pd
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
import datetime as dt
|
|
from util import get_data, plot_data
|
|
|
|
# This is the function that will be tested by the autograder
|
|
# The student must update this code to properly implement the functionality
|
|
def optimize_portfolio(sd=dt.datetime(2008,1,1), ed=dt.datetime(2009,1,1), \
|
|
syms=['GOOG','AAPL','GLD','XOM'], gen_plot=False):
|
|
|
|
# Read in adjusted closing prices for given symbols, date range
|
|
dates = pd.date_range(sd, ed)
|
|
prices_all = get_data(syms, dates) # automatically adds SPY
|
|
prices = prices_all[syms] # only portfolio symbols
|
|
prices_SPY = prices_all['SPY'] # only SPY, for comparison later
|
|
|
|
plot_data(prices_all)
|
|
|
|
# find the allocations for the optimal portfolio
|
|
# note that the values here ARE NOT meant to be correct for a test case
|
|
allocs = np.asarray([0.2, 0.2, 0.3, 0.3]) # add code here to find the allocations
|
|
cr, adr, sddr, sr = [0.25, 0.001, 0.0005, 2.1] # add code here to compute stats
|
|
|
|
# Get daily portfolio value
|
|
port_val = prices_SPY # add code here to compute daily portfolio values
|
|
|
|
# Compare daily portfolio value with SPY using a normalized plot
|
|
if gen_plot:
|
|
# add code to plot here
|
|
df_temp = pd.concat([port_val, prices_SPY], keys=['Portfolio', 'SPY'], axis=1)
|
|
pass
|
|
|
|
return allocs, cr, adr, sddr, sr
|
|
|
|
def test_code():
|
|
# This function WILL NOT be called by the auto grader
|
|
# Do not assume that any variables defined here are available to your function/code
|
|
# It is only here to help you set up and test your code
|
|
|
|
# Define input parameters
|
|
# Note that ALL of these values will be set to different values by
|
|
# the autograder!
|
|
|
|
start_date = dt.datetime(2009,1,1)
|
|
end_date = dt.datetime(2010,1,1)
|
|
symbols = ['GOOG', 'AAPL', 'GLD', 'XOM', 'IBM']
|
|
|
|
# Assess the portfolio
|
|
allocations, cr, adr, sddr, sr = optimize_portfolio(sd = start_date, ed = end_date,\
|
|
syms = symbols, \
|
|
gen_plot = False)
|
|
|
|
# Print statistics
|
|
print(f"Start Date: {start_date}")
|
|
print(f"End Date: {end_date}")
|
|
print(f"Symbols: {symbols}")
|
|
print(f"Allocations:{allocations}")
|
|
print(f"Sharpe Ratio: {sr}")
|
|
print(f"Volatility (stdev of daily returns): {sddr}")
|
|
print(f"Average Daily Return: {adr}")
|
|
print(f"Cumulative Return: {cr}")
|
|
|
|
if __name__ == "__main__":
|
|
# This code WILL NOT be called by the auto grader
|
|
# Do not assume that it will be called
|
|
test_code()
|