feat: Add weekly performance metrics to Portfolio Overview section
This commit is contained in:
parent
201d48c302
commit
00d00fb06b
@ -1,6 +1,6 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
import plotly.graph_objects as go
|
import plotly.graph_objects as go
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
import pytz
|
import pytz
|
||||||
from trading.journal import (
|
from trading.journal import (
|
||||||
create_trades_table, get_open_trades, get_trade_history,
|
create_trades_table, get_open_trades, get_trade_history,
|
||||||
@ -9,6 +9,44 @@ from trading.journal import (
|
|||||||
get_position_summary, get_latest_portfolio_value, update_portfolio_value
|
get_position_summary, get_latest_portfolio_value, update_portfolio_value
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def calculate_weekly_metrics(trades) -> dict:
|
||||||
|
"""Calculate weekly performance metrics"""
|
||||||
|
now = datetime.now(pytz.timezone('US/Pacific'))
|
||||||
|
week_start = (now - timedelta(days=now.weekday())).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
|
||||||
|
weekly_pl = 0
|
||||||
|
weekly_trades = []
|
||||||
|
|
||||||
|
for trade in trades:
|
||||||
|
# For sells/exits that happened this week
|
||||||
|
if (trade.get('direction') == 'sell' or trade.get('exit_price')) and \
|
||||||
|
trade.get('exit_date', trade.get('entry_date')) >= week_start:
|
||||||
|
|
||||||
|
price = float(trade.get('exit_price') or trade.get('entry_price'))
|
||||||
|
shares = float(trade['shares'])
|
||||||
|
position_id = trade['position_id']
|
||||||
|
|
||||||
|
# Find matching buy order
|
||||||
|
buy_trades = [t for t in trades
|
||||||
|
if t['position_id'] == position_id and
|
||||||
|
(t.get('direction', '').lower() != 'sell' and not t.get('exit_price'))]
|
||||||
|
|
||||||
|
if buy_trades:
|
||||||
|
# Calculate average entry price
|
||||||
|
total_cost = sum(float(t['entry_price']) * float(t['shares']) for t in buy_trades)
|
||||||
|
total_shares = sum(float(t['shares']) for t in buy_trades)
|
||||||
|
avg_entry_price = total_cost / total_shares if total_shares > 0 else 0
|
||||||
|
|
||||||
|
# Calculate trade P/L
|
||||||
|
trade_pl = (price - avg_entry_price) * shares
|
||||||
|
weekly_pl += trade_pl
|
||||||
|
weekly_trades.append(trade)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'weekly_pl': weekly_pl,
|
||||||
|
'weekly_trade_count': len(weekly_trades)
|
||||||
|
}
|
||||||
|
|
||||||
def calculate_portfolio_metrics(position_value: float, current_value: float, total_portfolio_value: float) -> dict:
|
def calculate_portfolio_metrics(position_value: float, current_value: float, total_portfolio_value: float) -> dict:
|
||||||
"""Calculate portfolio metrics for a position"""
|
"""Calculate portfolio metrics for a position"""
|
||||||
allocation = (current_value / total_portfolio_value) * 100 if total_portfolio_value > 0 else 0
|
allocation = (current_value / total_portfolio_value) * 100 if total_portfolio_value > 0 else 0
|
||||||
@ -178,14 +216,34 @@ def trading_journal_page():
|
|||||||
total_portfolio_value = latest_portfolio['total_value'] if latest_portfolio else 0
|
total_portfolio_value = latest_portfolio['total_value'] if latest_portfolio else 0
|
||||||
cash_balance = latest_portfolio['cash_balance'] if latest_portfolio else 0
|
cash_balance = latest_portfolio['cash_balance'] if latest_portfolio else 0
|
||||||
|
|
||||||
|
# Get trade history for weekly metrics
|
||||||
|
trade_history = get_trade_history()
|
||||||
|
weekly_metrics = calculate_weekly_metrics(trade_history) if trade_history else {'weekly_pl': 0, 'weekly_trade_count': 0}
|
||||||
|
|
||||||
# Portfolio overview section
|
# Portfolio overview section
|
||||||
st.subheader("Portfolio Overview")
|
st.subheader("Portfolio Overview")
|
||||||
col1, col2 = st.columns(2)
|
col1, col2, col3 = st.columns(3)
|
||||||
|
|
||||||
with col1:
|
with col1:
|
||||||
st.metric("Total Portfolio Value", f"${total_portfolio_value:,.2f}")
|
st.metric("Total Portfolio Value", f"${total_portfolio_value:,.2f}")
|
||||||
st.metric("Cash Balance", f"${cash_balance:,.2f}",
|
st.metric("Cash Balance", f"${cash_balance:,.2f}",
|
||||||
f"{(cash_balance/total_portfolio_value)*100:.1f}% of Portfolio" if total_portfolio_value > 0 else "")
|
f"{(cash_balance/total_portfolio_value)*100:.1f}% of Portfolio" if total_portfolio_value > 0 else "")
|
||||||
|
|
||||||
|
with col2:
|
||||||
|
# Weekly metrics
|
||||||
|
weekly_pl_pct = (weekly_metrics['weekly_pl'] / total_portfolio_value * 100) if total_portfolio_value > 0 else 0
|
||||||
|
st.metric("Week P/L",
|
||||||
|
f"${weekly_metrics['weekly_pl']:,.2f}",
|
||||||
|
f"{weekly_pl_pct:.2f}% | {weekly_metrics['weekly_trade_count']} trades")
|
||||||
|
|
||||||
|
with col3:
|
||||||
|
# Overall P/L metrics (from trade history)
|
||||||
|
total_pl = sum(trade.get('position_pl', 0) for trade in trade_history) if trade_history else 0
|
||||||
|
total_pl_pct = (total_pl / total_portfolio_value * 100) if total_portfolio_value > 0 else 0
|
||||||
|
st.metric("Overall P/L",
|
||||||
|
f"${total_pl:,.2f}",
|
||||||
|
f"{total_pl_pct:.2f}% since inception")
|
||||||
|
|
||||||
total_paper_pl = 0
|
total_paper_pl = 0
|
||||||
invested_value = 0
|
invested_value = 0
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user