Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
def annual_returns_dataframe(annual_portfolio_returns): | |
annual_portfolio_returns = annual_portfolio_returns * 100 | |
annual_portfolio_returns = annual_portfolio_returns.to_frame().reset_index() | |
annual_portfolio_returns.columns = ["Year", "Return"] | |
annual_portfolio_returns["Year"] = annual_portfolio_returns.Year.dt.year.astype(str) | |
return annual_portfolio_returns | |
def annual_cumulative_returns_dataframe(cumulative_returns): | |
cumulative_returns = cumulative_returns.to_frame().reset_index() | |
cumulative_returns.columns = ["Year", "Balance"] | |
cumulative_returns["Year"] = cumulative_returns["Year"].dt.year.astype(str) | |
cumulative_returns = ( | |
cumulative_returns.groupby("Year").tail(1).reset_index().drop("index", axis=1) | |
) | |
return cumulative_returns | |
def company_wise_annual_return(company_stock_returns_data, company_asset_weights): | |
# Create an empty DataFrame to store annual returns for each stock | |
annual_stock_returns = pd.DataFrame( | |
index=company_stock_returns_data.index.year.unique(), | |
columns=company_asset_weights["Ticker"], | |
) | |
# Iterate over each year | |
for year in annual_stock_returns.index: | |
# Filter returns data for the current year | |
year_returns = company_stock_returns_data.loc[ | |
company_stock_returns_data.index.year == year | |
] | |
# Iterate over each stock | |
for ticker, weight in zip( | |
company_asset_weights["Ticker"], company_asset_weights["Allocation"] | |
): | |
# Calculate the weighted sum of returns for the current stock in the current year | |
weighted_sum_returns = (year_returns[ticker] * weight).sum() * 100 | |
# Store the weighted average return for the current stock in the current year | |
annual_stock_returns.loc[year, ticker] = weighted_sum_returns | |
# Display annual returns for each stock | |
annual_stock_returns.reset_index(inplace=True) | |
annual_stock_returns["Date"] = annual_stock_returns["Date"].astype(str) | |
annual_stock_returns.rename(columns={"Date": "Year"}, inplace=True) | |
return annual_stock_returns | |
def company_wise_monthly_return(company_stock_returns_data, company_asset_weights): | |
# Resample daily returns to monthly returns for each stock | |
monthly_stock_returns = company_stock_returns_data.resample("M").mean() | |
# Iterate over each stock | |
for ticker, weight in zip( | |
company_asset_weights["Ticker"], company_asset_weights["Allocation"] | |
): | |
# Calculate the weighted monthly returns for the current stock | |
weighted_monthly_returns = monthly_stock_returns[ticker] * weight | |
# Fill missing values with 0 | |
weighted_monthly_returns.fillna(0, inplace=True) | |
# Store the weighted monthly returns in the DataFrame | |
monthly_stock_returns[ticker] = weighted_monthly_returns | |
# Reset the index and add new columns for year and month | |
monthly_stock_returns.reset_index(inplace=True) | |
monthly_stock_returns["Year"] = monthly_stock_returns["Date"].dt.year.astype(str) | |
monthly_stock_returns["Month"] = monthly_stock_returns["Date"].dt.month.astype(str) | |
# Rearrange the columns | |
columns_order = ["Year", "Month"] + [ | |
col for col in monthly_stock_returns.columns if col not in ["Year", "Month"] | |
] | |
monthly_stock_returns = monthly_stock_returns[columns_order] | |
# Drop the original date index column | |
monthly_stock_returns.drop(columns=["Date"], inplace=True) | |
# Display monthly returns for each stock | |
# st.write("Monthly Returns for Individual Stocks:") | |
# st.dataframe(monthly_stock_returns, use_container_width=True) | |
return monthly_stock_returns | |
def monthly_returns_dataframe(portfolio_returns): | |
monthly_portfolio_returns = ( | |
(portfolio_returns.resample("M").mean() * 100).to_frame().reset_index() | |
) | |
monthly_portfolio_returns.columns = ["Date", "Return"] | |
monthly_portfolio_returns["Year"] = monthly_portfolio_returns.Date.dt.year.astype( | |
str | |
) | |
monthly_portfolio_returns["Month"] = monthly_portfolio_returns.Date.dt.month.astype( | |
str | |
) | |
monthly_portfolio_returns.drop(columns=["Date"], inplace=True) | |
monthly_portfolio_returns = monthly_portfolio_returns[["Year", "Month", "Return"]] | |
return monthly_portfolio_returns | |
def monthly_cumulative_returns_dataframe(cumulative_returns): | |
monthly_cumulative_returns = ( | |
cumulative_returns.resample("M").last().to_frame().reset_index() | |
) | |
monthly_cumulative_returns.columns = ["Date", "Balance"] | |
monthly_cumulative_returns["Year"] = monthly_cumulative_returns.Date.dt.year.astype( | |
str | |
) | |
monthly_cumulative_returns["Month"] = ( | |
monthly_cumulative_returns.Date.dt.month.astype(str) | |
) | |
monthly_cumulative_returns.drop(columns=["Date"], inplace=True) | |
monthly_cumulative_returns = monthly_cumulative_returns[ | |
["Year", "Month", "Balance"] | |
] | |
return monthly_cumulative_returns | |