cse6242-dataminers / sharp_ratio.py
Lirsen Myrtaj
Update sharp_ratio.py (#58)
268db3b
import pandas as pd
import numpy as np
from datetime import datetime
import streamlit as st
import matplotlib.pyplot as plt
import plotly.express as px
#import plotly.graph_objects as go
def cumulative_return(stocks,choices):
symbols, weights, investing_style, benchmark, rf, A_coef = choices.values()
#tkers = sorted(set(stocks['Ticker'].unique()))
#preprocess
#stocks = stocks.pivot(index="Date", columns="Ticker", values="Adj. Close")
tkers = symbols.copy()
logRet = np.log(stocks/stocks.shift())
log_returns = np.log(stocks/stocks.shift())
tickers_list = symbols.copy()
weights_list = weights.copy()
##
stock_port = {}
for e in tickers_list: stock_port[e] = 0
# Convert Weights to Floats and Sum
weights = [float(x) for x in weights_list]
s = sum(weights)
# Calc Weight Proportions
new_weights = []
for i in weights: new_weights.append(i/s)
# Assign Weights to Ticker Dict
i = 0
for e in stock_port:
stock_port[e] = new_weights[i]
i += 1
port = dict.fromkeys(tkers, 0)
port.update(stock_port)
portfolio_dict = port
for e in portfolio_dict:
tmp = 0
if portfolio_dict[e] > tmp:
tmp = portfolio_dict[e]
tick = e
list_ =[]
for e in tickers_list:
if e not in list_:
list_.append(e)
df = stocks[list_]
df = df/df.iloc[0]
df.reset_index(inplace=True)
df=pd.DataFrame(df)
print(df)
fig = px.line(df, x='Date' ,y=df.columns[1:,])
#layout reference = https://linuxtut.com/en/b13e3e721519c2842cc9/
fig.update_layout(
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label="1m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.update_layout(xaxis=dict(rangeselector = dict(font = dict( color = "black"))))
st.subheader('Portfolio Historical Normalized Cumulative Returns')
st.plotly_chart(fig, use_container_width=True)
def sharp_ratio_func(stocks,choices):
symbols, weights, investing_style, benchmark, rf, A_coef = choices.values()
logRet,tickers_list,weights_list = preprocess(stocks,choices)
tkers = sorted(set(stocks['Ticker'].unique()))
stocks = stocks.pivot(index="Date", columns="Ticker", values="Adj. Close")
stock_port = {}
for e in tickers_list: stock_port[e] = 0
# Convert Weights to Floats and Sum
weights = [float(x) for x in weights_list]
s = sum(weights)
# Calc Weight Proportions
new_weights = []
for i in weights: new_weights.append(i/s)
# Assign Weights to Ticker Dict
i = 0
for e in stock_port:
stock_port[e] = new_weights[i]
i += 1
port = dict.fromkeys(tkers, 0)
port.update(stock_port)
portfolio_dict = port
sharp_ratio_list = []
for ticker in symbols:
logRet = np.log(stocks/stocks.shift())
stk = dict.fromkeys(tkers, 0)
stkTicker = {ticker:1}
stk.update(stkTicker)
ttlStk = np.sum(logRet*stk, axis=1)
stock_sharpe_ratio = ttlStk.mean() / ttlStk.std()
sharp_ratio_list.append(stock_sharpe_ratio)
sharp_ratio = {'Assets': symbols, 'Sharpe Ratio': sharp_ratio_list}
# Portfolio sharp Ratio Calculation
logRet = np.log(stocks/stocks.shift())
portfolio = dict.fromkeys(tkers, 0)
portfolio.update(portfolio_dict)
totalPortfolio = np.sum(logRet*portfolio, axis=1)
portfolio_sharpe_ratio = totalPortfolio.mean() / totalPortfolio.std()
sharp_ratio['Assets'].append('Portfolio')
sharp_ratio['Sharpe Ratio'].append(portfolio_sharpe_ratio)
fig = px.bar(sharp_ratio, x='Assets', y="Sharpe Ratio",color='Assets')
fig.update_layout(title_text = 'Sharpe Ratio of the Assets and Portfolio',
title_x=0.458)
st.plotly_chart(fig, use_container_width=True)