Download sharp_ratio.py from MiBu/Erro: direct link, hf CLI and curl.
- Browser
- Download file 4.73 kB
-
https://huggingface.co/spaces/MiBu/Erro/resolve/main/sharp_ratio.py
- Command line
-
hf download hf://spaces/MiBu/Erro/sharp_ratio.py
-
curl -L -o sharp_ratio.py https://huggingface.co/spaces/MiBu/Erro/resolve/main/sharp_ratio.py
4.73 kB
| 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) | |