Skip to content

Instantly share code, notes, and snippets.

View druce's full-sized avatar

Druce Vertes druce

View GitHub Profile
@druce
druce / dvquotes.json
Created January 14, 2021 19:50
dvquotes
[
{
"quote": "When I use a word, it means just what I choose it to mean-neither more nor less.",
"author": "Humpty Dumpty"
},
{
"quote": "You know the world is going crazy when the best rapper is a white guy, the best golfer is a black guy, the tallest guy in the NBA is Chinese, the Swiss hold the America's Cup, France is accusing the U.S. of arrogance, Germany doesn't want to go to war, and the three most powerful men in America are named 'Bush', 'Dick', and 'Colon.'",
"author": "Chris Rock"
},
{
@druce
druce / po7.py
Created December 20, 2020 22:12
po7.py
# number of stocks
n = 1000
# random historical mean returns for each stock
mu = np.random.normal(0.1, 0.2, n)
# number of factors
m = 10
# factor covariance matrix - random symmetrical matrix
SigmaFactor = np.random.randn(m, m)/4
@druce
druce / po6.py
Created December 20, 2020 22:11
po6.py
vol_limit = cp.Parameter(nonneg=True)
prob = cp.Problem(cp.Maximize(ret),
[cp.norm1(w) <= 1.5, # 1-norm <= 1.5, i.e. gross exposure < 150%
cp.sum(w) == 1,
vol <= vol_limit]
)
# define function so we can solve many in parallel
def solve_vl(vl_val):
@druce
druce / po5.py
Created December 20, 2020 22:09
po5.py
vol_limit = cp.Parameter(nonneg=True)
prob = cp.Problem(cp.Maximize(ret),
[cp.sum(w) == 1,
w >= 0,
vol <= vol_limit # new constraint: vol <= vol_limit parameter
]
)
# define helper function
@druce
druce / po4.py
Created December 20, 2020 22:07
po4.py
# Solve max return portfolio (corner solution)
prob = cp.Problem(cp.Maximize(ret), # maximize return
[cp.sum(w) == 1,
w >= 0]
)
prob.solve()
wts = [float('%0.4f' % v) for v in w.value]
maxretvol = vol.value
@druce
druce / po3.py
Created December 20, 2020 22:06
import cvxpy as cp
# compute covariance matrix (df being the dataframe of historical returns)
Sigma = np.cov(df.transpose())
# number of assets
n = Sigma.shape[0]
# average returns
mu = df.mean().values
# asset SDs
asset_vols = np.sqrt(Sigma.diagonal())
@druce
druce / po2.py
Created December 20, 2020 22:05
po2.py
import pandas_datareader as pdr
# load gold data from FRED API & save copy locally to CSV file
series = ['GOLDAMGBD228NLBM']
gold_download = pdr.data.DataReader(series,
'fred',
start='1968-12-31')
# convert daily to annual
gold_download = gold_download.resample('A').last().reset_index()
gold_download.set_index(pd.DatetimeIndex(gold_download['DATE']).year, inplace=True)
gold_download['return'] = gold_download['GOLDAMGBD228NLBM'].pct_change()
@druce
druce / po1.py
Created December 20, 2020 22:02
po1.py
data_xls = 'http://www.stern.nyu.edu/~adamodar/pc/datasets/histretSP.xls'
data_sheet = "Returns by year"
# these will change as rows get added on Damodaran website
skiprows = range(17)
skipfooter = 10
download_df = pd.read_excel('http://www.stern.nyu.edu/~adamodar/pc/datasets/histretSP.xls',
sheet_name=data_sheet,
skiprows=skiprows,
skipfooter=skipfooter)
download_df = download_df.set_index('Year')
@druce
druce / portfolio_opt_table.md
Created December 20, 2020 21:58
portfolio_opt_table.md
Return vol $$ \sigma_{1} $$ Return vol $$ \sigma_{2} $$ Return correlation $$ \rho_{12} $$ Portfolio volatility
$3 $4 1.0 $$ \sqrt{3^2 + 4^2 + 2 \cdot 3 \cdot 4 \cdot 1} = 3 + 4 = $7 $$
$3 $4 -1.0 $$ \sqrt{3^2 + 4^2 + 2 \cdot 3 \cdot 4 \cdot (-1)} = 4 - 3 = $1 $$
$3 $4 0.5 $$ \sqrt{3^2 + 4^2 + 2 \cdot 3 \cdot 4 \cdot 0.5} = \sqrt{37} = $6.08 $$
$3 $4 -0.5 $$ \sqrt{3^2 + 4^2 + 2 \cdot 3 \cdot 4 \
@druce
druce / table2.md
Last active October 31, 2020 14:43
ML Algo Search algo CV Error (RMSE in $) Time mm::ss
Linear Regression -- 18192 0:01
ElasticNet ElasticNetCV (Grid Search) 17964 0:02
ElasticNet GridSearchCV 17964 0:05