Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Binary file not shown.
Binary file removed __pycache__/test_bitcoin_trading.cpython-312.pyc
Binary file not shown.
57 changes: 23 additions & 34 deletions bitcoin_trading_simulation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import argparse
import numpy as np
import pandas as pd
import argparse


class Colors:
Expand Down Expand Up @@ -89,42 +88,32 @@ 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:
if portfolio.loc[i, 'btc'] > 0:
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)
Expand All @@ -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
)