From 5174427ae0e2d69038cfad01fa6051948c12f465 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 18 Jan 2026 13:17:58 +0000 Subject: [PATCH] feat: enhance CLI output with colors and emojis for better readability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `Colors` class for ANSI escape codes. - Colorize "Buy" (Green) and "Sell" (Red) actions in the daily ledger. - Use emojis (🟢, 🔴, 📈, 📉) to highlight key events and performance. - Improve formatting of the Final Portfolio Performance summary. - Fix pandas FutureWarning by explicitly casting initial cash to float. --- .Jules/palette.md | 3 +++ bitcoin_trading_simulation.py | 49 ++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 .Jules/palette.md diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 0000000..26c1e0a --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +1,3 @@ +## 2024-05-22 - CLI UX Delight +**Learning:** Even in backend scripts/CLI tools, visual hierarchy using ANSI colors and emojis significantly reduces cognitive load. Users can instantly scan for "Green" (Good/Buy) vs "Red" (Bad/Sell) without reading every line. +**Action:** For CLI tools that output logs or financial data, always implement a basic `Colors` class and use conditional formatting for key metrics (Status, Success/Failure, Profit/Loss). Explicitly align columns in summary reports for better readability. diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index e619723..2043ef3 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,6 +1,17 @@ import numpy as np import pandas as pd +class Colors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKCYAN = '\033[96m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02): """ Simulates Bitcoin prices for a given number of days using Geometric Brownian Motion. @@ -47,33 +58,39 @@ def simulate_trading(signals, initial_cash=10000): """ portfolio = pd.DataFrame(index=signals.index).fillna(0.0) portfolio['price'] = signals['price'] - portfolio['cash'] = initial_cash + portfolio['cash'] = float(initial_cash) portfolio['btc'] = 0.0 - portfolio['total_value'] = portfolio['cash'] + portfolio['total_value'] = float(initial_cash) - print("------ Daily Trading Ledger ------") + print(f"\n{Colors.HEADER}{Colors.BOLD}------ 📒 Daily Trading Ledger ------{Colors.ENDC}") for i, row in signals.iterrows(): if i > 0: portfolio.loc[i, 'cash'] = portfolio.loc[i-1, 'cash'] portfolio.loc[i, 'btc'] = portfolio.loc[i-1, 'btc'] + action_msg = "" # Buy signal if row['positions'] == 2.0: btc_to_buy = portfolio.loc[i, 'cash'] / row['price'] portfolio.loc[i, 'btc'] += btc_to_buy portfolio.loc[i, 'cash'] -= btc_to_buy * row['price'] - print(f"Day {i}: Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}") + action_msg = f"{Colors.OKGREEN}🟢 BUY {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}" # Sell signal elif row['positions'] == -2.0: if portfolio.loc[i, 'btc'] > 0: cash_received = portfolio.loc[i, 'btc'] * row['price'] portfolio.loc[i, 'cash'] += cash_received - print(f"Day {i}: Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}") + action_msg = f"{Colors.FAIL}🔴 SELL {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}" portfolio.loc[i, 'btc'] = 0 portfolio.loc[i, 'total_value'] = portfolio.loc[i, 'cash'] + portfolio.loc[i, 'btc'] * row['price'] - print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") + + day_info = f"Day {i}: Portfolio: ${portfolio.loc[i, 'total_value']:.2f} | Cash: ${portfolio.loc[i, 'cash']:.2f} | BTC: {portfolio.loc[i, 'btc']:.4f}" + if action_msg: + print(f"{day_info} | {action_msg}") + else: + print(day_info) return portfolio @@ -99,9 +116,17 @@ def simulate_trading(signals, initial_cash=10000): buy_and_hold_btc = initial_cash / prices.iloc[0] buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1] - print("\n------ Final Portfolio Performance ------") - print(f"Initial Cash: ${initial_cash:.2f}") - print(f"Final Portfolio Value: ${final_value:.2f}") - print(f"Profit/Loss: ${profit:.2f}") - print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}") - print("-----------------------------------------") + print(f"\n{Colors.HEADER}{Colors.BOLD}------ 📊 Final Portfolio Performance ------{Colors.ENDC}") + print(f"Initial Cash: ${initial_cash:.2f}") + print(f"Final Portfolio Value: {Colors.BOLD}${final_value:.2f}{Colors.ENDC}") + + if profit >= 0: + profit_color = Colors.OKGREEN + profit_icon = "📈" + else: + profit_color = Colors.FAIL + profit_icon = "📉" + + print(f"Profit/Loss: {profit_color}{profit_icon} ${profit:.2f}{Colors.ENDC}") + print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}") + print(f"{Colors.HEADER}--------------------------------------------{Colors.ENDC}")