| | 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) |
| | |
| |
|