diff --git a/.Jules/palette.md b/.Jules/palette.md index 1279bd2..95f0441 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -5,3 +5,7 @@ ## 2024-05-23 - CLI Accessibility and Control **Learning:** While color and emojis enhance UX, they can be inaccessible (color blindness) or intrusive (automation logs). Providing `--no-color` and `--quiet` flags is essential for a robust CLI tool that respects user context and accessibility needs. **Action:** Always include flags to disable visual enhancements and suppress verbose output in CLI tools. + +## 2024-05-24 - Readable Data Formatting in CLI +**Learning:** Large numbers without separators (e.g., 1000000) are hard to parse at a glance. Fixed-width alignment and thousands separators ($1,000,000) create a tabular layout that drastically improves data readability and scanability. +**Action:** Always format monetary/large values with separators and use f-string alignment for tabular data in CLI output. diff --git a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc deleted file mode 100644 index 52abfc2..0000000 Binary files a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc and /dev/null differ diff --git a/__pycache__/test_bitcoin_trading.cpython-312.pyc b/__pycache__/test_bitcoin_trading.cpython-312.pyc deleted file mode 100644 index ecc297a..0000000 Binary files a/__pycache__/test_bitcoin_trading.cpython-312.pyc and /dev/null differ diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index ccb5edd..9dedd87 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,7 +1,6 @@ import argparse import numpy as np import pandas as pd -import argparse class Colors: @@ -89,7 +88,7 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): portfolio.loc[i, 'btc'] += btc_to_buy portfolio.loc[i, 'cash'] -= btc_to_buy * row['price'] if not quiet: - print(f"{Colors.GREEN}Day {i}: 💰 Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") + print(f"{Colors.GREEN}Day {i:<3}: 💰 Buy {btc_to_buy:.4f} BTC at ${row['price']:,.2f}{Colors.ENDC}") # Sell signal elif row['positions'] == -2.0: @@ -97,34 +96,24 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): cash_received = portfolio.loc[i, 'btc'] * row['price'] portfolio.loc[i, 'cash'] += cash_received if not quiet: - print(f"{Colors.RED}Day {i}: 📉 Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") + print(f"{Colors.RED}Day {i:<3}: 📉 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'] if not quiet: - print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, " - f"Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") + print(f"Day {i:<3}: Portfolio Value: ${portfolio.loc[i, 'total_value']:,.2f}, " + f"Cash: ${portfolio.loc[i, 'cash']:,.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") return portfolio -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Bitcoin Trading Simulation") - parser.add_argument("--days", type=int, default=60, help="Number of days to simulate") - parser.add_argument("--initial-cash", type=float, default=10000, help="Initial cash amount") - parser.add_argument("--initial-price", type=float, default=50000, help="Initial Bitcoin price") - parser.add_argument("--volatility", type=float, default=0.02, help="Price volatility") - parser.add_argument("--quiet", action="store_true", help="Suppress daily portfolio log") - parser.add_argument("--no-color", action="store_true", help="Disable colored output") - - args = parser.parse_args() - - if args.no_color: +def main(days=60, initial_cash=10000, initial_price=50000, volatility=0.02, quiet=False, no_color=False): + if no_color: Colors.disable() # Simulate prices - prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility) + prices = simulate_bitcoin_prices(days=days, initial_price=initial_price, volatility=volatility) # Calculate moving averages signals = calculate_moving_averages(prices) @@ -133,45 +122,45 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): signals = generate_trading_signals(signals) # Simulate trading - portfolio = simulate_trading(signals, initial_cash=args.initial_cash, quiet=args.quiet) + portfolio = simulate_trading(signals, initial_cash=initial_cash, quiet=quiet) # Final portfolio performance final_value = portfolio['total_value'].iloc[-1] - initial_cash = args.initial_cash profit = final_value - initial_cash # Compare with buy and hold strategy - buy_and_hold_btc = args.initial_cash / prices.iloc[0] + buy_and_hold_btc = initial_cash / prices.iloc[0] buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1] print(f"\n{Colors.HEADER}{Colors.BOLD}------ Final Portfolio Performance ------{Colors.ENDC}") - print(f"Initial Cash: ${args.initial_cash:.2f}") - print(f"Final Portfolio Value: ${final_value:.2f}") + print(f"Initial Cash: ${initial_cash:,.2f}") + print(f"Final Portfolio Value: ${final_value:,.2f}") if profit >= 0: - print(f"Profit/Loss: {Colors.GREEN}📈 ${profit:.2f}{Colors.ENDC}") + print(f"Profit/Loss: {Colors.GREEN}📈 ${profit:,.2f}{Colors.ENDC}") else: - print(f"Profit/Loss: {Colors.RED}📉 ${profit:.2f}{Colors.ENDC}") + print(f"Profit/Loss: {Colors.RED}📉 ${profit:,.2f}{Colors.ENDC}") - print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}") + print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:,.2f}") print(f"{Colors.HEADER}-----------------------------------------{Colors.ENDC}") + if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Bitcoin Trading Simulation') - parser.add_argument('--days', type=int, default=60, help='Number of days to simulate') - parser.add_argument('--initial-cash', type=float, default=10000, help='Initial cash amount') - parser.add_argument('--initial-price', type=float, default=50000, help='Initial Bitcoin price') - parser.add_argument('--volatility', type=float, default=0.02, help='Volatility factor') - parser.add_argument('--quiet', action='store_true', help='Suppress daily output') - parser.add_argument('--no-color', action='store_true', help='Disable colored output') + parser = argparse.ArgumentParser(description="Bitcoin Trading Simulation") + parser.add_argument("--days", type=int, default=60, help="Number of days to simulate") + parser.add_argument("--initial-cash", type=float, default=10000, help="Initial cash amount") + parser.add_argument("--initial-price", type=float, default=50000, help="Initial Bitcoin price") + parser.add_argument("--volatility", type=float, default=0.02, help="Price volatility") + parser.add_argument("--quiet", action="store_true", help="Suppress daily portfolio log") + parser.add_argument("--no-color", action="store_true", help="Disable colored output") args = parser.parse_args() main( days=args.days, + initial_cash=args.initial_cash, initial_price=args.initial_price, volatility=args.volatility, - initial_cash=args.initial_cash, quiet=args.quiet, no_color=args.no_color )