From 75d7a0ac00acd300265a0238077162b0ce6875eb Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:26:56 +0000 Subject: [PATCH 1/2] feat: add CLI arguments for configuration and quiet mode Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- .Jules/palette.md | 4 ++++ README.md | 18 +++++++++++++++++- bitcoin_trading_simulation.py | 30 +++++++++++++++++++++++++----- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.Jules/palette.md b/.Jules/palette.md index 5de3a38..f00829e 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -1,3 +1,7 @@ ## 2024-05-22 - Visual Hierarchy in CLI Output **Learning:** Adding color-coded indicators (Green/Red) and emojis (💰, 📉) in CLI tools significantly reduces cognitive load when parsing financial data streams. It transforms a wall of text into a scannable narrative. **Action:** For data-heavy CLI applications, always implement a semantic color system and visual anchors (icons/emojis) for key events. + +## 2024-05-23 - CLI Configurability and Noise Reduction +**Learning:** Hardcoded values in CLI tools limit usability. Providing arguments for key parameters (like `--days`, `--initial-cash`) empowers users. Additionally, offering a `--quiet` flag to suppress verbose logging (while keeping critical events) and a `--no-color` flag for accessibility/logging is essential for a polished CLI experience. +**Action:** Always implement `argparse` (or similar) with quiet and no-color options for CLI tools that produce significant output. diff --git a/README.md b/README.md index be561ef..768851e 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,28 @@ pip install -r requirements.txt ## Usage -Run the simulation script: +Run the simulation script with default settings: ```bash python bitcoin_trading_simulation.py ``` +### CLI Options + +You can customize the simulation using the following arguments: + +- `--days`: Number of days to simulate (default: 60) +- `--initial-cash`: Initial cash in USD (default: 10000) +- `--initial-price`: Initial Bitcoin price in USD (default: 50000) +- `--volatility`: Volatility factor (default: 0.02) +- `--quiet`, `-q`: Suppress daily portfolio logs (only show buy/sell events and final summary) +- `--no-color`: Disable colored output (useful for logs or non-ANSI terminals) + +Example: +```bash +python bitcoin_trading_simulation.py --days 100 --initial-cash 5000 --quiet +``` + ## Tests Run the test suite: diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index 82df43f..c1917e5 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -1,3 +1,4 @@ +import argparse import numpy as np import pandas as pd @@ -49,7 +50,7 @@ def generate_trading_signals(signals): signals['positions'] = signals['signal'].diff().shift(1) return signals -def simulate_trading(signals, initial_cash=10000): +def simulate_trading(signals, initial_cash=10000, quiet=False): """ Simulates trading based on signals and prints a daily ledger. """ @@ -81,13 +82,32 @@ def simulate_trading(signals, initial_cash=10000): 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}") + if not quiet: + print(f"Day {i}: Portfolio Value: ${portfolio.loc[i, 'total_value']:.2f}, 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 in USD') + parser.add_argument('--initial-price', type=float, default=50000, help='Initial Bitcoin price in USD') + parser.add_argument('--volatility', type=float, default=0.02, help='Volatility factor') + parser.add_argument('--quiet', '-q', action='store_true', help='Suppress daily portfolio logs') + parser.add_argument('--no-color', action='store_true', help='Disable colored output') + + args = parser.parse_args() + + if args.no_color: + Colors.HEADER = '' + Colors.BLUE = '' + Colors.GREEN = '' + Colors.RED = '' + Colors.ENDC = '' + Colors.BOLD = '' + # Simulate prices - prices = simulate_bitcoin_prices() + prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility) # Calculate moving averages signals = calculate_moving_averages(prices) @@ -96,11 +116,11 @@ def simulate_trading(signals, initial_cash=10000): signals = generate_trading_signals(signals) # Simulate trading - portfolio = simulate_trading(signals) + portfolio = simulate_trading(signals, initial_cash=args.initial_cash, quiet=args.quiet) # Final portfolio performance final_value = portfolio['total_value'].iloc[-1] - initial_cash = 10000 + initial_cash = args.initial_cash profit = final_value - initial_cash # Compare with buy and hold strategy From 523735cf713c1fd60cff6b03b48c98116fa4a120 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:31:38 +0000 Subject: [PATCH 2/2] fix: rename test file for discovery and fix linting errors Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- .gitignore | 4 ++++ ..._bitcoin_trading.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 1011 bytes bitcoin_trading_simulation.py | 11 ++++++++++- test.py => test_bitcoin_trading.py | 0 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 __pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc rename test.py => test_bitcoin_trading.py (100%) diff --git a/.gitignore b/.gitignore index d4fb281..907591b 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,7 @@ # debug information files *.dwo + +# Python +__pycache__/ +*.pyc diff --git a/__pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f2e573c1c3ff4a0d2a008cb6340c16a675fa0b3 GIT binary patch literal 1011 zcma)4&ubGw6rS1H{IE$YB2^0_IVfZi(#AH{N+agrN$4LCkY$_Ml-1qrW@bv0xPc-) zw71;6_zy@={vBRK5oNC)BsU?qoP0Brjf)q3?7a7VZ{GW6=CL1FS62|&hZnEC=MaBL zlA5sqv%3J^B8n*XQ5&mh1f*kN6qxNCM$|Y%?fej1WGY(@I*UdX3g8K>**;b(cnmsY z9HSVIAU!syF($DQlUG$>W^D3P0hQWbrguma5GjexE~cjJ=^B@&-pceWGMN?>qsxWn zKkD#*){(T1=H8J}9&Vnad0L2b9#$+b&8CG%cdGZQ(Xeju%KeH&+ZMMf&8EV;fJs7NTe@xOc1LRt=Pnbf zV9(+*xo72)m8a2AxLnu{ORm`+$MKPjO9^;k?-^quORn49 zkOhvg-9h9#Jx9QfRY*!8XzR1KvgARQ>}1KqENN(>r5`0_sisMNi_6(ow9RjCI#IN# zu72o=PU!V)!5r%Kj%v{`DXR^4-~^HHvRlw6r^k=Loucoh@+Wisyf0n-ynoREFlkBF zn6xe)e>2zN`>LrXUu30*p8@ulaMIH7FArKXI10f$iigLZFT5VtZ&|VpTMxdbX9dHn zG53Ud0*1a!C51(fl|W6s<2_;<65j+jFYX5+J@(xvtO8X2CHyM5Uj$?P6QMISLm1ys G4Zi{X=JCe> literal 0 HcmV?d00001 diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index c1917e5..299d36f 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -2,6 +2,7 @@ import numpy as np import pandas as pd + class Colors: HEADER = '\033[95m' BLUE = '\033[94m' @@ -10,6 +11,7 @@ class Colors: ENDC = '\033[0m' BOLD = '\033[1m' + 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. @@ -24,6 +26,7 @@ def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02): prices.append(prices[-1] + price_change) return pd.Series(prices, name='Price') + def calculate_moving_averages(prices, short_window=7, long_window=30): """ Calculates short and long moving averages for a given price series. @@ -34,6 +37,7 @@ def calculate_moving_averages(prices, short_window=7, long_window=30): signals['long_mavg'] = prices.rolling(window=long_window, min_periods=1, center=False).mean() return signals + def generate_trading_signals(signals): """ Generates trading signals based on the Golden Cross strategy. @@ -50,6 +54,7 @@ def generate_trading_signals(signals): signals['positions'] = signals['signal'].diff().shift(1) return signals + def simulate_trading(signals, initial_cash=10000, quiet=False): """ Simulates trading based on signals and prints a daily ledger. @@ -83,10 +88,14 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): 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}, Cash: ${portfolio.loc[i, 'cash']:.2f}, BTC: {portfolio.loc[i, 'btc']:.4f}") + 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}" + ) 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') diff --git a/test.py b/test_bitcoin_trading.py similarity index 100% rename from test.py rename to test_bitcoin_trading.py