From 09c69fc1c279f1c0fa0251879b239b5f9c3e8c53 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 07:01:32 +0000 Subject: [PATCH] Optimize simulate_trading loop using numpy arrays Co-authored-by: EiJackGH <172181576+EiJackGH@users.noreply.github.com> --- ...bitcoin_trading_simulation.cpython-312.pyc | Bin 10887 -> 10299 bytes bitcoin_trading_simulation.py | 60 +++++++++++------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc index 81dd6550442bb097e35393c0939f196966f2f006..32e44eacb3a98260b9a6da2ecc34ca12b9a19bf4 100644 GIT binary patch delta 1617 zcmZ`(T}%{L6rQ_(?C#7gv;V*jxZt8o5ez9(Qlw@p6;Z2Ft3WJJWClCSc2{Qy6Ul6M z-#Un?L#_>LEz$PHZQ2J6FD6Y|-)hn(ooQ*9Y`2NEzW7GcpNBs6-oX{qrYE`Qe&?Kf z&Ufa_oq7NCmnZ3OY1&O7v3&NC@ZDW{B`{4P%Zk?TC8U=LnczS@GLvZiTXI$uwft|? zCgD1!$i(Mh3+3#R9Uf?AJ+l3o%kf`V&6ca@xl>Nb^|TrxgJ-!e&YE+}mTbR7R->E^ zUJfRJ9o`Bz!%C3MOTlVryW9XV{xd=3NZBfr_z7~9Ymi-M>Y);;c>`5LbV(5mE#lG$qLr z@KM-zf=D)1UEBK?fofWgLDOb9V7BEzC}^S@ghD2AA`~_ebBbuIgKZ5*JUytAcnB*r z7XsdB*bTpL=(md&Y*CRxi`Wg{YluYJn6l&2RBDdTmaQp1Ew-R|**?#UnJi32TJmBu zu7NMRh+mVq8!OBu?nA20D<;rZri8R02~(-b>8b2HW&6cBftSP%d1(|Uy=r2yuP{(?Q`h1PakXo)y>PJN3oOT%;>9l5UO4*L zUsq&*^zSMhGkn3q(O*fX;-po}^`7ParG6D&VVedY(>}H9gHZ(-Oh~=B(Lig+F;n*w9a&>RD}tC z9J&>`5h>EQ$4VDV)2rcok^85#-k}He+Nn`(>@Dq$@%0IAV?xj;1Z_O2g=W{8l+o0z zk`H}NicQH6FVq-bR_X4*M-SokFH=j@?U(NK zf6~9sbQOk-`W=NK<-BeSH5+v-f-|};XoMRO;&ofV*zp2F@9H-8AsJY6?br#x4D5*Z z?HNHYUL3^=-#8I}Vox}X@GX3@2dO#yqkZ(DD!#sUJ-P_MER44724~>mmeY0#h1TGw zE#H9SFuC(9Fa_IU-QYBwh`mB?SAHAbi5+*A9Wz2Im7aos$Hv(+C{e7z%7Yd9_o44e d5~LI_N-*1+0W0vg)_wMF5Zp|!HSS8<{sDEuqTv7l delta 1914 zcmaJ?T}<0n6t)v5Bw&+-UM;l#P|3o!fAV5JtLx`b-ghEWZQkFD* zTi7a*>T1GOS2a9TWSZ0k^W>grqgavW%sImgI=&AunGLbKF z35{W4WeDSxEYd(sT{30Z*A4ok|XbVCV-UjvG|jE&C)AjE(+(a)7#cL17?uhV_b{$F zq~>(@2u?5KIRp5PX`&yZeV%Jcj_ZAy3!USV%OYQ?-C4+)?}{BRkZ`uV{5`9a}X=Nblh+OCGj^ul^yKDJg?5VU=AJh}s3#y}fyITrg z5yNl)uxrZb95qJ9qS-*$TrCW!hNfNi?P=j8dzoyn+mp(D&CWo^6t^h?ad2V|7P!mK z7d0bFJQ_rdKLUKL89XVo>v%Mz7;llpStP)#vQ}Va&#{hT-YyxX5#w8s$g0P^e*aZB zSZ1vgS&cV1#`DwHXZdpyK>C7t>0@zd_%;bldarteUbo-nanDXIP=73COzT^3wP)DsxCye3TkX*+kYF~;EP_8>whwK` zAwg$MQ9OD$Q$$7spR{D` z2Uo(&;bd1bushvL~bGGbFw39bHY6 zw)i|G521C(j-sZ?+C*W}nKG>o!G<V)ww0esS=!*x_0q8Q&Q3!4aS6 z@{1)?Ka*DxjbcO03@J;z^d(i7(UmQR7s5hUTqX2FU46pvQrDQNcC1j#RKlI46BDrd zXv&tl@?<}(J{zMldUlDrLkaFUBY4yLhC~O{A4lt^p8lM9V7_Y>B2;`J5lDEFrWE_s z^2D+hcu}`D2ak7(T|MHlUa|MG=o%G0lhEZ8{nO&*nf1W+jX($nLgGwVWNxnOBbmm1 zG3|C3T9|-(`>V#oUmf`3KnhPCNoir@`)dQwho23L&K|LEP;?H$Ged8jM&KDAZ1hF7 zi_`)Ya|;%csfQZ-Z@SV=(hxf>7zCwgZc1vurdFwxd(9%AxBw4c6g!<_Q_mKL_u>_q zin<3KcRLa_iN1sbRx~G_qWO5rw8lQSJhQwAh~1Z7%)z#PabQS1IlQIBjV}Bz45vo$ zttQM^r`l@9Nc!gRYDFxPyK4})w?GwuXB>xrTr&;6j^dO^i^BQSVm e9Y%LaTRA=h?6zrK086$ORXt8`bw7r-N#Y-#{1L7I diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py index 001e336..8b176c3 100644 --- a/bitcoin_trading_simulation.py +++ b/bitcoin_trading_simulation.py @@ -74,39 +74,53 @@ def simulate_trading(signals, initial_cash=10000, quiet=False): """ Simulates trading based on signals and prints a daily ledger. """ - portfolio = pd.DataFrame(index=signals.index).fillna(0.0) - portfolio['price'] = signals['price'] - portfolio['cash'] = float(initial_cash) - portfolio['btc'] = 0.0 - portfolio['total_value'] = float(initial_cash) + # Use numpy arrays for faster iteration + prices = signals['price'].values + positions = signals['positions'].values + n = len(signals) + + cash = np.zeros(n) + btc = np.zeros(n) + total_value = np.zeros(n) + + current_cash = float(initial_cash) + current_btc = 0.0 if not quiet: 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'] + + for i in range(n): + price = prices[i] + position = positions[i] # 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"{Colors.GREEN}🟢 Day {i}: Buy {btc_to_buy:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") + if position == 2.0: + btc_to_buy = current_cash / price + current_btc += btc_to_buy + current_cash -= btc_to_buy * price + print(f"{Colors.GREEN}🟢 Day {i}: Buy {btc_to_buy:.4f} BTC at ${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"{Colors.FAIL}🔴 Day {i}: Sell {portfolio.loc[i, 'btc']:.4f} BTC at ${row['price']:.2f}{Colors.ENDC}") - portfolio.loc[i, 'btc'] = 0 + elif position == -2.0: + if current_btc > 0: + cash_received = current_btc * price + current_cash += cash_received + print(f"{Colors.FAIL}🔴 Day {i}: Sell {current_btc:.4f} BTC at ${price:.2f}{Colors.ENDC}") + current_btc = 0.0 - portfolio.loc[i, 'total_value'] = portfolio.loc[i, 'cash'] + portfolio.loc[i, 'btc'] * row['price'] + cash[i] = current_cash + btc[i] = current_btc + total_value[i] = current_cash + current_btc * 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}: Portfolio Value: ${total_value[i]:.2f}, " + f"Cash: ${current_cash:.2f}, BTC: {current_btc:.4f}") + + portfolio = pd.DataFrame(index=signals.index) + portfolio['price'] = prices + portfolio['cash'] = cash + portfolio['btc'] = btc + portfolio['total_value'] = total_value return portfolio