| 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 |
| |
|
|
|
|
| def cumulative_return(stocks,choices): |
| symbols, weights, investing_style, benchmark, rf, A_coef = choices.values() |
| |
| |
| |
| |
| 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 |
| |
| weights = [float(x) for x in weights_list] |
| s = sum(weights) |
| |
| new_weights = [] |
| for i in weights: new_weights.append(i/s) |
| |
| 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:,]) |
| |
| |
| |
| 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 |
| |
| weights = [float(x) for x in weights_list] |
| s = sum(weights) |
| |
| new_weights = [] |
| for i in weights: new_weights.append(i/s) |
| |
| 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} |
| |
| |
| 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) |
| |
|
|