Skip to content

Instantly share code, notes, and snippets.

@mmourafiq
Created December 20, 2012 01:29
Show Gist options
  • Save mmourafiq/4342279 to your computer and use it in GitHub Desktop.
Save mmourafiq/4342279 to your computer and use it in GitHub Desktop.
portfolio sharp ratio
import scipy
from yahoo_finance import YahooFinance
VALUE_TYPE = {'Date': 0, 'Open': 1, 'High': 2, 'Low': 3, 'Close': 4, 'Volume': 5, 'Adj_Close': 6}
start_date = "20121101"
end_date = "20121201"
yf = YahooFinance("AAPL,GOOG,GLD,USO")
percent = scipy.array([0.25, 0.15, 0.4, 0.2]) #investment distribution portfolio
all_adj_prices = []
all_total_return = []
all_daily_return = []
all_avg_daily_return = []
all_std_daily_return = []
all_sharp_ratio = []
ticker = 0
for (symb, data) in yf.get_historical_prices(start_date, end_date):
data.reverse() #reverse the time series
data.pop() #get rid of the header
adj_prices = scipy.array(map(lambda x : float(x[VALUE_TYPE['Adj_Close']]), data))
all_adj_prices.append(adj_prices)
total_return = (adj_prices[-1]/adj_prices[0]) - 1 #calculate the total return for apple this month
all_total_return.append(total_return)
daily_return = (adj_prices[1:]/adj_prices[0:-1]) - 1 #calculate the daily_return
all_daily_return.append(daily_return)
avg_daily_return = scipy.mean(daily_return, 0) #average daily retuen
all_avg_daily_return.append(avg_daily_return)
std_daily_return = scipy.std(daily_return, 0) #deviation fo daily return
all_std_daily_return.append(std_daily_return)
sharp_ratio = scipy.sqrt(250) * (avg_daily_return / std_daily_return) # sharp ratio
all_sharp_ratio.append(sharp_ratio)
"""
our prices
GOOG : 687.5, 687.9, 682.9, 681.7, 667.1, 652.2, 663. , 665.9,
659. , 652.5, 647.2, 647.1, 668.2, 669.9, 665.8, 667.9,
661.1, 670.7, 683.6, 691.8, 698.3
USO : 32. , 31.3, 31.6, 32.5, 31.2, 31.3, 31.7, 31.5, 31.4,
31.7, 31.4, 31.9, 32.6, 31.9, 32.1, 32.3, 32.1, 31.9,
31.7, 32.1, 32.5
AAPL : 593.8, 574.1, 581.9, 580.2, 558. , 537.7, 547. , 542.8,
542.9, 536.8, 525.6, 527.6, 565.7, 560.9, 561.7, 571.5,
589.5, 584.7, 582.9, 589.3, 585.2
GLD : 166. , 162.6, 163.2, 166.3, 166.4, 167.9, 167.8, 167.4,
167.1, 167.1, 166. , 165.8, 167.8, 167.3, 167.5, 169.6,
169.4, 168.7, 166.5, 167.1, 166.
total return for each stock : [0.015709090909090895, 0.015625, -0.014482990906028781, 0.0]
daily return :
GOOG : 0.00058182, -0.0072685 , -0.00175721, -0.02141705, -0.02233548,
0.01655934, 0.00437406, -0.01036192, -0.00986343, -0.00812261,
-0.00015451, 0.03260702, 0.00254415, -0.00612032, 0.0031541 ,
-0.01018116, 0.01452125, 0.01923364, 0.01199532, 0.00939578
USO : -0.021875 , 0.00958466, 0.02848101, -0.04 , 0.00320513,
0.01277955, -0.00630915, -0.0031746 , 0.00955414, -0.00946372,
0.01592357, 0.02194357, -0.02147239, 0.00626959, 0.00623053,
-0.00619195, -0.00623053, -0.00626959, 0.0126183 , 0.01246106
AAPL : -0.03317615, 0.01358648, -0.00292146, -0.03826267, -0.03637993,
0.01729589, -0.00767824, 0.00018423, -0.01123596, -0.02086438,
0.00380518, 0.0722138 , -0.00848506, 0.00142628, 0.01744704,
0.03149606, -0.00814249, -0.0030785 , 0.01097958, -0.00695741
GLD : -0.02048193, 0.00369004, 0.0189951 , 0.00060132, 0.00901442,
-0.00059559, -0.00238379, -0.00179211, 0. , -0.00658288,
-0.00120482, 0.01206273, -0.00297974, 0.00119546, 0.01253731,
-0.00117925, -0.00413223, -0.0130409 , 0.0036036 , -0.00658288
average daily return for each stock : [0.00086921414889110646, 0.00090320887851679248, -0.00043738608805856115, 3.7192619905374034e-05]
std deviation for each stock : [0.01340975818314491, 0.015929201121363604, 0.024332769635802963, 0.008623865082371179]
sharp ratio for each stock : [1.0248866711092259, 0.8965287201907356, -0.28421266379411581, 0.068190648813791305]
"""
corr = scipy.corrcoef(all_adj_prices)
"""
[[ GOOG USO AAPL GLD]
[ 1. 0.35796266 0.83675929 -0.38083073]
[ 0.35796266 1. 0.49457339 0.33637871]
[ 0.83675929 0.49457339 1. -0.04349294]
[-0.38083073 0.33637871 -0.04349294 1. ]]
"""
portfolio_total_return = None
portfolio_daily_return = None
for ticker in range(4):
if ticker == 0:
portfolio_daily_return = all_daily_return[ticker] * percent[ticker]
portfolio_total_return = all_total_return[ticker] * percent[ticker]
else:
portfolio_daily_return += all_daily_return[ticker] * percent[ticker]
portfolio_total_return += all_total_return[ticker] * percent[ticker]
portfolio_avg_daily_return = scipy.mean(portfolio_daily_return, 0)
portfolio_std_daily_return = scipy.std(portfolio_daily_return, 0)
portfolio_sharp_ratio = scipy.sqrt(250) * (portfolio_avg_daily_return / portfolio_std_daily_return) # sharp ratio
"""
portfolio daily return :
[ -2.05026424e-02 5.79317575e-03 6.46328287e-03 -2.65390640e-02
-1.78521880e-02 1.28560048e-02 -3.40091395e-03 -3.35140050e-03
-5.52711836e-03 -1.31125392e-02 3.63101326e-03 4.27413546e-02
-6.57479444e-03 2.19962885e-04 1.12093815e-02 8.88849236e-03
-1.38771006e-03 2.83893335e-05 1.00041289e-02 1.18563923e-04]
portfolio total return : 0.000477826364861
portfolio average daily return : 0.000185268957758
portfolio std deviation daily return : 0.0143152971765
portfolio sharp ratio: 0.20463140898
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment