lumibot 4.0.23__py3-none-any.whl → 4.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lumibot might be problematic. Click here for more details.

Files changed (161) hide show
  1. lumibot/__pycache__/__init__.cpython-312.pyc +0 -0
  2. lumibot/__pycache__/constants.cpython-312.pyc +0 -0
  3. lumibot/__pycache__/credentials.cpython-312.pyc +0 -0
  4. lumibot/backtesting/__init__.py +6 -5
  5. lumibot/backtesting/__pycache__/__init__.cpython-312.pyc +0 -0
  6. lumibot/backtesting/__pycache__/alpaca_backtesting.cpython-312.pyc +0 -0
  7. lumibot/backtesting/__pycache__/alpha_vantage_backtesting.cpython-312.pyc +0 -0
  8. lumibot/backtesting/__pycache__/backtesting_broker.cpython-312.pyc +0 -0
  9. lumibot/backtesting/__pycache__/ccxt_backtesting.cpython-312.pyc +0 -0
  10. lumibot/backtesting/__pycache__/databento_backtesting.cpython-312.pyc +0 -0
  11. lumibot/backtesting/__pycache__/interactive_brokers_rest_backtesting.cpython-312.pyc +0 -0
  12. lumibot/backtesting/__pycache__/pandas_backtesting.cpython-312.pyc +0 -0
  13. lumibot/backtesting/__pycache__/polygon_backtesting.cpython-312.pyc +0 -0
  14. lumibot/backtesting/__pycache__/thetadata_backtesting.cpython-312.pyc +0 -0
  15. lumibot/backtesting/__pycache__/yahoo_backtesting.cpython-312.pyc +0 -0
  16. lumibot/backtesting/backtesting_broker.py +209 -9
  17. lumibot/backtesting/databento_backtesting.py +145 -24
  18. lumibot/backtesting/thetadata_backtesting.py +63 -42
  19. lumibot/brokers/__pycache__/__init__.cpython-312.pyc +0 -0
  20. lumibot/brokers/__pycache__/alpaca.cpython-312.pyc +0 -0
  21. lumibot/brokers/__pycache__/bitunix.cpython-312.pyc +0 -0
  22. lumibot/brokers/__pycache__/broker.cpython-312.pyc +0 -0
  23. lumibot/brokers/__pycache__/ccxt.cpython-312.pyc +0 -0
  24. lumibot/brokers/__pycache__/example_broker.cpython-312.pyc +0 -0
  25. lumibot/brokers/__pycache__/interactive_brokers.cpython-312.pyc +0 -0
  26. lumibot/brokers/__pycache__/interactive_brokers_rest.cpython-312.pyc +0 -0
  27. lumibot/brokers/__pycache__/projectx.cpython-312.pyc +0 -0
  28. lumibot/brokers/__pycache__/schwab.cpython-312.pyc +0 -0
  29. lumibot/brokers/__pycache__/tradier.cpython-312.pyc +0 -0
  30. lumibot/brokers/__pycache__/tradovate.cpython-312.pyc +0 -0
  31. lumibot/brokers/alpaca.py +11 -1
  32. lumibot/brokers/tradeovate.py +475 -0
  33. lumibot/components/grok_news_helper.py +284 -0
  34. lumibot/components/options_helper.py +90 -34
  35. lumibot/credentials.py +3 -0
  36. lumibot/data_sources/__pycache__/__init__.cpython-312.pyc +0 -0
  37. lumibot/data_sources/__pycache__/alpaca_data.cpython-312.pyc +0 -0
  38. lumibot/data_sources/__pycache__/alpha_vantage_data.cpython-312.pyc +0 -0
  39. lumibot/data_sources/__pycache__/bitunix_data.cpython-312.pyc +0 -0
  40. lumibot/data_sources/__pycache__/ccxt_backtesting_data.cpython-312.pyc +0 -0
  41. lumibot/data_sources/__pycache__/ccxt_data.cpython-312.pyc +0 -0
  42. lumibot/data_sources/__pycache__/data_source.cpython-312.pyc +0 -0
  43. lumibot/data_sources/__pycache__/data_source_backtesting.cpython-312.pyc +0 -0
  44. lumibot/data_sources/__pycache__/databento_data_polars_backtesting.cpython-312.pyc +0 -0
  45. lumibot/data_sources/__pycache__/databento_data_polars_live.cpython-312.pyc +0 -0
  46. lumibot/data_sources/__pycache__/example_broker_data.cpython-312.pyc +0 -0
  47. lumibot/data_sources/__pycache__/exceptions.cpython-312.pyc +0 -0
  48. lumibot/data_sources/__pycache__/interactive_brokers_data.cpython-312.pyc +0 -0
  49. lumibot/data_sources/__pycache__/interactive_brokers_rest_data.cpython-312.pyc +0 -0
  50. lumibot/data_sources/__pycache__/pandas_data.cpython-312.pyc +0 -0
  51. lumibot/data_sources/__pycache__/polars_mixin.cpython-312.pyc +0 -0
  52. lumibot/data_sources/__pycache__/polygon_data_polars.cpython-312.pyc +0 -0
  53. lumibot/data_sources/__pycache__/projectx_data.cpython-312.pyc +0 -0
  54. lumibot/data_sources/__pycache__/schwab_data.cpython-312.pyc +0 -0
  55. lumibot/data_sources/__pycache__/tradier_data.cpython-312.pyc +0 -0
  56. lumibot/data_sources/__pycache__/tradovate_data.cpython-312.pyc +0 -0
  57. lumibot/data_sources/__pycache__/yahoo_data_polars.cpython-312.pyc +0 -0
  58. lumibot/data_sources/data_source_backtesting.py +3 -5
  59. lumibot/data_sources/databento_data_polars_backtesting.py +194 -48
  60. lumibot/data_sources/pandas_data.py +6 -3
  61. lumibot/data_sources/polars_mixin.py +126 -21
  62. lumibot/data_sources/tradeovate_data.py +80 -0
  63. lumibot/data_sources/tradier_data.py +2 -1
  64. lumibot/entities/__pycache__/__init__.cpython-312.pyc +0 -0
  65. lumibot/entities/__pycache__/asset.cpython-312.pyc +0 -0
  66. lumibot/entities/__pycache__/bar.cpython-312.pyc +0 -0
  67. lumibot/entities/__pycache__/bars.cpython-312.pyc +0 -0
  68. lumibot/entities/__pycache__/chains.cpython-312.pyc +0 -0
  69. lumibot/entities/__pycache__/data.cpython-312.pyc +0 -0
  70. lumibot/entities/__pycache__/dataline.cpython-312.pyc +0 -0
  71. lumibot/entities/__pycache__/order.cpython-312.pyc +0 -0
  72. lumibot/entities/__pycache__/position.cpython-312.pyc +0 -0
  73. lumibot/entities/__pycache__/quote.cpython-312.pyc +0 -0
  74. lumibot/entities/__pycache__/trading_fee.cpython-312.pyc +0 -0
  75. lumibot/entities/asset.py +8 -0
  76. lumibot/entities/order.py +1 -1
  77. lumibot/entities/quote.py +14 -0
  78. lumibot/example_strategies/__pycache__/__init__.cpython-312.pyc +0 -0
  79. lumibot/example_strategies/__pycache__/test_broker_functions.cpython-312-pytest-8.4.1.pyc +0 -0
  80. lumibot/strategies/__pycache__/__init__.cpython-312.pyc +0 -0
  81. lumibot/strategies/__pycache__/_strategy.cpython-312.pyc +0 -0
  82. lumibot/strategies/__pycache__/strategy.cpython-312.pyc +0 -0
  83. lumibot/strategies/__pycache__/strategy_executor.cpython-312.pyc +0 -0
  84. lumibot/strategies/_strategy.py +95 -27
  85. lumibot/strategies/strategy.py +5 -6
  86. lumibot/strategies/strategy_executor.py +2 -2
  87. lumibot/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  88. lumibot/tools/__pycache__/alpaca_helpers.cpython-312.pyc +0 -0
  89. lumibot/tools/__pycache__/bitunix_helpers.cpython-312.pyc +0 -0
  90. lumibot/tools/__pycache__/black_scholes.cpython-312.pyc +0 -0
  91. lumibot/tools/__pycache__/ccxt_data_store.cpython-312.pyc +0 -0
  92. lumibot/tools/__pycache__/databento_helper.cpython-312.pyc +0 -0
  93. lumibot/tools/__pycache__/databento_helper_polars.cpython-312.pyc +0 -0
  94. lumibot/tools/__pycache__/debugers.cpython-312.pyc +0 -0
  95. lumibot/tools/__pycache__/decorators.cpython-312.pyc +0 -0
  96. lumibot/tools/__pycache__/helpers.cpython-312.pyc +0 -0
  97. lumibot/tools/__pycache__/indicators.cpython-312.pyc +0 -0
  98. lumibot/tools/__pycache__/lumibot_logger.cpython-312.pyc +0 -0
  99. lumibot/tools/__pycache__/pandas.cpython-312.pyc +0 -0
  100. lumibot/tools/__pycache__/polygon_helper.cpython-312.pyc +0 -0
  101. lumibot/tools/__pycache__/polygon_helper_async.cpython-312.pyc +0 -0
  102. lumibot/tools/__pycache__/polygon_helper_polars_optimized.cpython-312.pyc +0 -0
  103. lumibot/tools/__pycache__/projectx_helpers.cpython-312.pyc +0 -0
  104. lumibot/tools/__pycache__/schwab_helper.cpython-312.pyc +0 -0
  105. lumibot/tools/__pycache__/thetadata_helper.cpython-312.pyc +0 -0
  106. lumibot/tools/__pycache__/types.cpython-312.pyc +0 -0
  107. lumibot/tools/__pycache__/yahoo_helper.cpython-312.pyc +0 -0
  108. lumibot/tools/__pycache__/yahoo_helper_polars_optimized.cpython-312.pyc +0 -0
  109. lumibot/tools/databento_helper.py +384 -133
  110. lumibot/tools/databento_helper_polars.py +218 -156
  111. lumibot/tools/databento_roll.py +216 -0
  112. lumibot/tools/lumibot_logger.py +32 -17
  113. lumibot/tools/polygon_helper.py +65 -0
  114. lumibot/tools/thetadata_helper.py +588 -70
  115. lumibot/traders/__pycache__/__init__.cpython-312.pyc +0 -0
  116. lumibot/traders/__pycache__/trader.cpython-312.pyc +0 -0
  117. lumibot/traders/trader.py +1 -1
  118. lumibot/trading_builtins/__pycache__/__init__.cpython-312.pyc +0 -0
  119. lumibot/trading_builtins/__pycache__/custom_stream.cpython-312.pyc +0 -0
  120. lumibot/trading_builtins/__pycache__/safe_list.cpython-312.pyc +0 -0
  121. lumibot-4.1.1.data/data/ThetaTerminal.jar +0 -0
  122. {lumibot-4.0.23.dist-info → lumibot-4.1.1.dist-info}/METADATA +1 -2
  123. {lumibot-4.0.23.dist-info → lumibot-4.1.1.dist-info}/RECORD +161 -44
  124. tests/backtest/check_timing_offset.py +198 -0
  125. tests/backtest/check_volume_spike.py +112 -0
  126. tests/backtest/comprehensive_comparison.py +166 -0
  127. tests/backtest/debug_comparison.py +91 -0
  128. tests/backtest/diagnose_price_difference.py +97 -0
  129. tests/backtest/direct_api_comparison.py +203 -0
  130. tests/backtest/profile_thetadata_vs_polygon.py +255 -0
  131. tests/backtest/root_cause_analysis.py +109 -0
  132. tests/backtest/test_accuracy_verification.py +244 -0
  133. tests/backtest/test_daily_data_timestamp_comparison.py +801 -0
  134. tests/backtest/test_databento.py +4 -0
  135. tests/backtest/test_databento_comprehensive_trading.py +564 -0
  136. tests/backtest/test_debug_avg_fill_price.py +112 -0
  137. tests/backtest/test_dividends.py +8 -3
  138. tests/backtest/test_example_strategies.py +54 -47
  139. tests/backtest/test_futures_edge_cases.py +451 -0
  140. tests/backtest/test_futures_single_trade.py +270 -0
  141. tests/backtest/test_futures_ultra_simple.py +191 -0
  142. tests/backtest/test_index_data_verification.py +348 -0
  143. tests/backtest/test_polygon.py +45 -24
  144. tests/backtest/test_thetadata.py +246 -60
  145. tests/backtest/test_thetadata_comprehensive.py +729 -0
  146. tests/backtest/test_thetadata_vs_polygon.py +557 -0
  147. tests/backtest/test_yahoo.py +1 -2
  148. tests/conftest.py +20 -0
  149. tests/test_backtesting_data_source_env.py +249 -0
  150. tests/test_backtesting_quiet_logs_complete.py +10 -11
  151. tests/test_databento_helper.py +76 -90
  152. tests/test_databento_timezone_fixes.py +21 -4
  153. tests/test_get_historical_prices.py +6 -6
  154. tests/test_options_helper.py +162 -40
  155. tests/test_polygon_helper.py +21 -13
  156. tests/test_quiet_logs_requirements.py +5 -5
  157. tests/test_thetadata_helper.py +487 -171
  158. tests/test_yahoo_data.py +125 -0
  159. {lumibot-4.0.23.dist-info → lumibot-4.1.1.dist-info}/LICENSE +0 -0
  160. {lumibot-4.0.23.dist-info → lumibot-4.1.1.dist-info}/WHEEL +0 -0
  161. {lumibot-4.0.23.dist-info → lumibot-4.1.1.dist-info}/top_level.txt +0 -0
lumibot/traders/trader.py CHANGED
@@ -191,7 +191,7 @@ class Trader:
191
191
  set_log_level("ERROR")
192
192
  else:
193
193
  set_log_level("INFO")
194
- set_console_log_level("ERROR") # Only show errors in console for backtesting
194
+ # When quiet_logs=False, allow INFO logs to console (respects BACKTESTING_QUIET_LOGS)
195
195
  else:
196
196
  # Live trades should always have full logging for both console and file
197
197
  set_log_level("INFO")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lumibot
3
- Version: 4.0.23
3
+ Version: 4.1.1
4
4
  Summary: Backtesting and Trading Library, Made by Lumiwealth
5
5
  Home-page: https://github.com/Lumiwealth/lumibot
6
6
  Author: Robert Grzesik
@@ -43,7 +43,6 @@ Requires-Dist: psycopg2-binary
43
43
  Requires-Dist: exchange-calendars>=4.6.0
44
44
  Requires-Dist: duckdb
45
45
  Requires-Dist: tabulate
46
- Requires-Dist: thetadata==0.9.11
47
46
  Requires-Dist: databento>=0.42.0
48
47
  Requires-Dist: holidays
49
48
  Requires-Dist: psutil
@@ -1,20 +1,34 @@
1
1
  lumibot/__init__.py,sha256=fHJI9tgI2gk8n7Z8v8bopekW7oXIa8Rm3nYKwhQkYxo,4378
2
2
  lumibot/constants.py,sha256=aQT0_QR7sCQuNPizeo2lQNhF0xd5g_H2_gr_-kG2AXM,629
3
- lumibot/credentials.py,sha256=tplT093Fd0lDP0fUAxpqQb9Iqh67pWBDL8P39VaUyCY,31238
4
- lumibot/backtesting/__init__.py,sha256=vrzgpE4TsVJFzFs1xf0aqvSQ5Vj74iv5tG_aWW5I2i0,782
3
+ lumibot/credentials.py,sha256=es7sXNnOmo6-jXuLQG_P9U-GEOmUZG0rXe1YS2Lqp_k,31354
4
+ lumibot/__pycache__/__init__.cpython-312.pyc,sha256=EFyN3QSJKQNZNQgz2UawwgLzTQzWkxlPYjbltXzeoA8,3391
5
+ lumibot/__pycache__/constants.cpython-312.pyc,sha256=YMXHvscXtrYUQ55e8EB-NI_aW3RajDEmrkeow8q8h-Y,1043
6
+ lumibot/__pycache__/credentials.cpython-312.pyc,sha256=VQXXJYzZk4EztCTTFqXFDu2jNg84Xwmj6C6zXyl_TPE,27608
7
+ lumibot/backtesting/__init__.py,sha256=GZMu-_u9rg5l9z-7QvHJptyklpXObIPDRr9dKseXjmQ,874
5
8
  lumibot/backtesting/alpaca_backtesting.py,sha256=56vnBwKjwZ-8QW92I_dlJd1AO752_WV5Mhwt8jd7x5o,31258
6
9
  lumibot/backtesting/alpha_vantage_backtesting.py,sha256=LR3UNhJrdAKdvadiThVKdKrMZYQ_xcHzAISKPe0yqS0,417
7
- lumibot/backtesting/backtesting_broker.py,sha256=mf-UnOT9DX-JhF8wjqKQZrv-wY48rH0_B9CwTtR-o4M,62267
10
+ lumibot/backtesting/backtesting_broker.py,sha256=btn-uPXLU3iaaioiuKph-OI5Qy0lBb7G9hoWM6wXx3E,71962
8
11
  lumibot/backtesting/ccxt_backtesting.py,sha256=O-RjuNpx5y4f-hKKwwUbrU7hAVkGEegmnvH_9nQWhAo,246
9
- lumibot/backtesting/databento_backtesting.py,sha256=m5rkM83CiTffpDpDRD8hQxhwRCRihzZ-zQQn-_76QFg,23028
12
+ lumibot/backtesting/databento_backtesting.py,sha256=pEM12DzUC6388lTyRv4WTvdZEhs4Ofp4E2VOjD3Azek,27998
10
13
  lumibot/backtesting/databento_backtesting_polars.py,sha256=duWr5VfLEAyCbZJQVsJ0iftH-8SACWvuRINSlpOEHpM,26128
11
14
  lumibot/backtesting/interactive_brokers_rest_backtesting.py,sha256=5HJ_sPX0uOUg-rbfOKDjwYVCLiXevlwtdK_3BcUwqXc,6602
12
15
  lumibot/backtesting/pandas_backtesting.py,sha256=m-NvT4o-wFQjaZft6TXULzeZBrskO_7Z-jfy9AIkyAY,388
13
16
  lumibot/backtesting/polygon_backtesting.py,sha256=u9kif_2_7k0P4-KDvbHhaMfSoBVejUUX7fh9H3PCVE0,12350
14
- lumibot/backtesting/thetadata_backtesting.py,sha256=Pifx56RRKys9Hn_q3CMXKorAa09ny7vv5SIwSNaDxAg,12818
17
+ lumibot/backtesting/thetadata_backtesting.py,sha256=BL70M2DpQqKjjwVfr7hkATQDcG9LVJxW_Vo7adPzAdM,13773
15
18
  lumibot/backtesting/yahoo_backtesting.py,sha256=LT2524mGlrUSq1YSRnUqGW4-Xcq4USgRv2EhnV_zfs4,502
19
+ lumibot/backtesting/__pycache__/__init__.cpython-312.pyc,sha256=hauIeSrYJulZelhymVBuuqMIGoWAWqrkQn5Zblku1Aw,1062
20
+ lumibot/backtesting/__pycache__/alpaca_backtesting.cpython-312.pyc,sha256=g_JuOAKCEtPiPyIdPZv8V02xhgYtjCUB7qrpMgRJVPo,27759
21
+ lumibot/backtesting/__pycache__/alpha_vantage_backtesting.cpython-312.pyc,sha256=DC6KxajzVQ5HAMxVEh-uUwu_jAE9LbkjkU3Y-wOskB0,814
22
+ lumibot/backtesting/__pycache__/backtesting_broker.cpython-312.pyc,sha256=X-4ZtuIz2UipTYmGBBqYUkQdVyrB9YRyVkScPVZY0Iw,61264
23
+ lumibot/backtesting/__pycache__/ccxt_backtesting.cpython-312.pyc,sha256=l0SCIDJpuLS9XXvpoEYLKvbR6HUSnoKDSZgdhZWRmLw,724
24
+ lumibot/backtesting/__pycache__/databento_backtesting.cpython-312.pyc,sha256=N5DBMvnIP065iuknF56qD5FLh1HbWNMOuZhNktWmVqU,18919
25
+ lumibot/backtesting/__pycache__/interactive_brokers_rest_backtesting.cpython-312.pyc,sha256=sMhctHR4iu231rXJTH9P0xZZ8ctCIGQ02RVshYl8fkE,7562
26
+ lumibot/backtesting/__pycache__/pandas_backtesting.cpython-312.pyc,sha256=H7sUPgTAVvMli9uFWUddJ9LVRlZpvaqRUEdqjf-9yNE,963
27
+ lumibot/backtesting/__pycache__/polygon_backtesting.cpython-312.pyc,sha256=-_5VWqMHR9GrI-_hkBp50L_09DQl2OUQJKguMlevCwY,12494
28
+ lumibot/backtesting/__pycache__/thetadata_backtesting.cpython-312.pyc,sha256=QJ1LFWPm-nEc5o2XGaH-DQf2tJGaeZMQI-MALZgzocs,12080
29
+ lumibot/backtesting/__pycache__/yahoo_backtesting.cpython-312.pyc,sha256=j78lUPeuqMvHav76cmj-zBWmYl_U8Sj5-SGMSF1iPEE,916
16
30
  lumibot/brokers/__init__.py,sha256=MGWKHeH3mqseYRL7u-KX1Jp2x9EaFO4Ol8sfNSxzu1M,404
17
- lumibot/brokers/alpaca.py,sha256=BVpv176YWnY2S11ABTMlMAVqrmpqTptaEl_hmdA3nlw,60587
31
+ lumibot/brokers/alpaca.py,sha256=qbmjKCAmMU9Nu9ceOkSNA-CAxewHpkExSWK_P6b8T_w,61115
18
32
  lumibot/brokers/bitunix.py,sha256=hwcYC4goXsukSHSevb9W5irJz2lJt5tSgK2X5S0VyUs,34555
19
33
  lumibot/brokers/broker.py,sha256=01cBrBjeiQGT9LMdZ2EgrSYT-xyoKz9JhVZkQQr1QxU,71951
20
34
  lumibot/brokers/ccxt.py,sha256=9F8YeEF9HBRGgcwJ9WTSb2pKRXlh_zUj-CeA1j4K77w,31434
@@ -23,13 +37,27 @@ lumibot/brokers/interactive_brokers.py,sha256=qOTvOLOk01_LnF7B-t_5gtmuDtXitqV_WU
23
37
  lumibot/brokers/interactive_brokers_rest.py,sha256=CT6L2NZE2jMuSreRSiR6iQbcTLa55SlLduIxSSM2QDM,54161
24
38
  lumibot/brokers/projectx.py,sha256=JT7ysIQ4ek-yZdNrmuZYA6aKZMinSh1GnraetDrsjh0,78055
25
39
  lumibot/brokers/schwab.py,sha256=yo0hz_mzey7egUt0akx58JQkfycA2VV5zsaDg0jFEuI,90865
40
+ lumibot/brokers/tradeovate.py,sha256=NBGw79aWWL0JlNF34EAJQ5dfB3HkiGuWhuSVQ5yg1ZI,22091
26
41
  lumibot/brokers/tradier.py,sha256=E45lj4LV-lrF3mKgtZtoYDXoetgbnFlsmYb5HI7bgbM,50863
27
42
  lumibot/brokers/tradovate.py,sha256=8YaadpvoJyA-IkK6BCENLvCRfYSMnG-uTxkvDB2Sd94,38668
43
+ lumibot/brokers/__pycache__/__init__.cpython-312.pyc,sha256=jaM9qF-rAlxhkFo8M7tPr9mAqWIrpH32Jx-rBkXLRoY,752
44
+ lumibot/brokers/__pycache__/alpaca.cpython-312.pyc,sha256=qraNX7CCjBcu17YXU23IMfs3x81yi4Cu6a8crpVTxUg,60648
45
+ lumibot/brokers/__pycache__/bitunix.cpython-312.pyc,sha256=p6p1uSRbXh6zwLjGuQzvaAotlLXSPtLLxGFuUFrBIU4,41059
46
+ lumibot/brokers/__pycache__/broker.cpython-312.pyc,sha256=OPPAizwXEbms5IcinLkN9iA9R-CWYHnZ3Jeof5kLU0k,78800
47
+ lumibot/brokers/__pycache__/ccxt.cpython-312.pyc,sha256=o0YJxaAA3P_rqj58WY7HzddoBwwcnXz2F4Q_zNwjHsk,32670
48
+ lumibot/brokers/__pycache__/example_broker.cpython-312.pyc,sha256=0BL0vaPVeoKYOeZeMB-sJDBTCMp-X7owCYJa1BOOe_M,10540
49
+ lumibot/brokers/__pycache__/interactive_brokers.cpython-312.pyc,sha256=bXfGQL8b1AWabOw02od4cAoZ7AQjwATmzQpnjN6D72Q,72169
50
+ lumibot/brokers/__pycache__/interactive_brokers_rest.cpython-312.pyc,sha256=m5IF5xE_cA_C2DZIEx7haqFCKm7NI5kt6OJQ47EQZYk,51086
51
+ lumibot/brokers/__pycache__/projectx.cpython-312.pyc,sha256=5iNIXUBRrEpfNLJxD30Sp5abppPeLQAuK1ZRE0NSxqI,74400
52
+ lumibot/brokers/__pycache__/schwab.cpython-312.pyc,sha256=24U83vt_fINpxL1SyXvr1nDYzgscOljfI7hsLDlj7Ow,85129
53
+ lumibot/brokers/__pycache__/tradier.cpython-312.pyc,sha256=eEsMhoV8_TsA_cB8n1H0BToMuRmnS_URNCchC9l5WKs,47681
54
+ lumibot/brokers/__pycache__/tradovate.cpython-312.pyc,sha256=PdM1Q-6emm0IFNlKOUUX5f4YWAu0Au2sfdOi-11127k,41509
28
55
  lumibot/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
56
  lumibot/components/configs_helper.py,sha256=e4-2jBmjsIDeMQ9fbQ9j2U6WlHCe2z9bIQtJNlP_iEs,3066
30
57
  lumibot/components/drift_rebalancer_logic.py,sha256=KL1S9Su5gxibGzl2fw_DH8StzXvjFfFl23sOFGHgIZI,28653
31
58
  lumibot/components/grok_helper.py,sha256=vgyPAs63VoNsfZojMoHYRLckb-CFiZkHIlY8HSYZLQs,15382
32
- lumibot/components/options_helper.py,sha256=Y41hcNFNJO7PdZZAf0P5_cem5byYd-zIq7BRNGhXQ24,61738
59
+ lumibot/components/grok_news_helper.py,sha256=7GFtSuRkBo4-3IcUmC6qhuf7iekoVyyP7q5jyUjAWTc,11007
60
+ lumibot/components/options_helper.py,sha256=pUihHFEv5w17pXACE3xw0Tq6tHb9s05fzttlg4hmD7E,64931
33
61
  lumibot/components/perplexity_helper.py,sha256=0dhAIXunvUnTKIFFdYbFt8adnSIavKRqXkQ91fjsDPI,31432
34
62
  lumibot/components/quiver_helper.py,sha256=s0Y-tL1y2S1mYlbtlRTcL5R4WV0HYOgiSJ9hT41Hzrw,14380
35
63
  lumibot/components/vix_helper.py,sha256=tsWHFQzOJCjdmSGgmnYIty0K5ua-iAgBiRlyRIpGli0,61940
@@ -40,35 +68,69 @@ lumibot/data_sources/bitunix_data.py,sha256=H2u4fJVEJqmNrqJnYs1hucZyg4N3dEtCB9JZ
40
68
  lumibot/data_sources/ccxt_backtesting_data.py,sha256=FgVVMgA0WLF1RYlSNENN7jkppUj9hwYccsyPLadTJuA,10791
41
69
  lumibot/data_sources/ccxt_data.py,sha256=kvLtfcXfS_V6yILzUATdQMa07lZdspMtDez0boFE4DE,7766
42
70
  lumibot/data_sources/data_source.py,sha256=oOZ9hdg2OUAFT5yCQ8uExDEoNYqqeswDoHdVxHhJACs,28225
43
- lumibot/data_sources/data_source_backtesting.py,sha256=nQKx9uxFUaZfNBQk4jqBuwEy3Y7J3TPl21woPJXr61k,8711
71
+ lumibot/data_sources/data_source_backtesting.py,sha256=hamqm1uHS34tS7kVslqcJxllHxUS4szgzKTngYsMc4o,8610
44
72
  lumibot/data_sources/databento_data.py,sha256=GdD9UwLhRkbWwVpqssO6hT_pALh_V3t1aIO_j90FJFk,14210
45
73
  lumibot/data_sources/databento_data_polars.py,sha256=7Nl6TDfP4piUSiZs3KqFuZkdseEu3-7F37mWUC6P76U,36479
46
- lumibot/data_sources/databento_data_polars_backtesting.py,sha256=naARl0QVzOkeUCU2z2z37i4Z_DelJoBSbOgqsYeqnJA,17851
74
+ lumibot/data_sources/databento_data_polars_backtesting.py,sha256=0YA8O7qe8aTxdFcc9ALhUZSHUJH70PnNG0eK1ZpLZt0,25864
47
75
  lumibot/data_sources/databento_data_polars_live.py,sha256=NJc1nHU6P94uUZQWtQ0z5-bi1SRKCkW4-yCFmwZ5FDI,36479
48
76
  lumibot/data_sources/example_broker_data.py,sha256=WkCc3rLyOOI4GzLptUwhqeFRkEWQsM4y3tdzUbHPfik,2066
49
77
  lumibot/data_sources/exceptions.py,sha256=fYS44FgrzyDAuPqZRo3RiZKijjcurcG81HkL2dWURX0,557
50
78
  lumibot/data_sources/interactive_brokers_data.py,sha256=2e0cqOHaveL9XdlZ_N98vehUuoKaHqhV4BelMIScUqQ,13894
51
79
  lumibot/data_sources/interactive_brokers_rest_data.py,sha256=QaODbhFteB4rT-ssTu1nA006bPXu1srYR_Hm1RSWEvQ,45873
52
- lumibot/data_sources/pandas_data.py,sha256=jKZ1wZ6oshngFkcDMI7pB1WniTzv7r08mjY5cZ2U8Qs,20804
53
- lumibot/data_sources/polars_mixin.py,sha256=NkTXBqfuW6qWCn3oHTVivV2zxsZH7m5mzHgMY__ldr8,12720
80
+ lumibot/data_sources/pandas_data.py,sha256=yDJJHnXrCzSrR6-EZlTbtNrzBiOD4w9UVZEwW1-Q2SA,21067
81
+ lumibot/data_sources/polars_mixin.py,sha256=oWPIWaHVYWQJIFAH-WC1vrLA7ZNo9HMGO490JNT2UUc,17294
54
82
  lumibot/data_sources/polygon_data_polars.py,sha256=fvXeS9kghITbQ0mM8ocyyusAMJmUBArkK-MZrRXnBKs,26952
55
83
  lumibot/data_sources/projectx_data.py,sha256=WXCyPptehR2r3Fg9ou6r9ISNb3p5OaHfqPgVyi6q_Ws,24953
56
84
  lumibot/data_sources/schwab_data.py,sha256=Z4NOcO3UZj8fy7Jp2ZqeE9PyRPj2SNGTjuR7l8nQmlg,29472
57
- lumibot/data_sources/tradier_data.py,sha256=ypgj8wlkRJbbFBENWTyQvQjWHAxxNkjbLphBvUuT6dE,16951
85
+ lumibot/data_sources/tradeovate_data.py,sha256=4MGOa0slp1uhXTceLnjT0nx6Qd3zg6C84vd2KXUdZKE,3475
86
+ lumibot/data_sources/tradier_data.py,sha256=DZNg-4xQ3GsLMEmfa-8Cjc-vIKjZqZdf45QDwY5opSk,17051
58
87
  lumibot/data_sources/tradovate_data.py,sha256=TY1MCXVTqiJTAYKN_5oinFHuvn4q6P5Re1e8brnGpkk,3533
59
88
  lumibot/data_sources/yahoo_data.py,sha256=Po7SCSYA1xIMmvK914IcqrY0NQJHTUxQtde6Nnie1G8,18802
60
89
  lumibot/data_sources/yahoo_data_polars.py,sha256=xXzvDqO_3hT_lrp4S8w1WWDVLqjR6FAiLpCFpcY6dr8,13955
90
+ lumibot/data_sources/__pycache__/__init__.cpython-312.pyc,sha256=GgkwSu-sXW18J1PTVh_4-V67RdhmR-aSRrZUNAhNExw,1506
91
+ lumibot/data_sources/__pycache__/alpaca_data.cpython-312.pyc,sha256=IpdhX0lcIkd0g9CkeiHf98dHND59C0Et2BovXfnYQlQ,45204
92
+ lumibot/data_sources/__pycache__/alpha_vantage_data.cpython-312.pyc,sha256=ELJtQediKt7pAOfT291zx4PbIAcdP7FCjhRiHAo9FT0,6011
93
+ lumibot/data_sources/__pycache__/bitunix_data.cpython-312.pyc,sha256=bEql3t9DeGbVPI2aggtLG0qzTr_hoNGueQORlJDUcd0,10112
94
+ lumibot/data_sources/__pycache__/ccxt_backtesting_data.cpython-312.pyc,sha256=XOyJb978JCu9bZtRwvgFC_CByXFLP24BZ-qvmI-nBe8,12615
95
+ lumibot/data_sources/__pycache__/ccxt_data.cpython-312.pyc,sha256=6DIpOY6wIQoyDJUa0fKtptP3vU2FoS5oy4blsmLgmho,9092
96
+ lumibot/data_sources/__pycache__/data_source.cpython-312.pyc,sha256=TlXGkd2Lc2z89_nnuJZQtVBT57s1VTA-V34zM-fRkJY,28639
97
+ lumibot/data_sources/__pycache__/data_source_backtesting.cpython-312.pyc,sha256=UljOjipy2PXAHCmR2mXlFNuOkuQm1s0u5NvhoniWt4g,9048
98
+ lumibot/data_sources/__pycache__/databento_data_polars_backtesting.cpython-312.pyc,sha256=o45ZHrBVxm9iMzxfBP8FAnpM-nOMTnTtgcQvN9sIfto,17896
99
+ lumibot/data_sources/__pycache__/databento_data_polars_live.cpython-312.pyc,sha256=vRcL0q9r89D2RUfrrnO4FU_WrqVT9Ncdl7u2I7gSfJo,37988
100
+ lumibot/data_sources/__pycache__/example_broker_data.cpython-312.pyc,sha256=1VCXHZ2O_NPs4-_ZlgYa0zIZYH7UuCBP4VGCZrln5Vg,3222
101
+ lumibot/data_sources/__pycache__/exceptions.cpython-312.pyc,sha256=CWH4LO6epPD58gqmHv4wY4oMCx2tDjpPirCBNJQqE9s,1283
102
+ lumibot/data_sources/__pycache__/interactive_brokers_data.cpython-312.pyc,sha256=GehJopS9q7QTKunZxgXIreX_Oie6PIq7GeEeLK-JbUY,13418
103
+ lumibot/data_sources/__pycache__/interactive_brokers_rest_data.cpython-312.pyc,sha256=Xo3IdB6jj51k4ysOHFvMOPBrJRhicjXR0sX2l-sBpwo,48111
104
+ lumibot/data_sources/__pycache__/pandas_data.cpython-312.pyc,sha256=-5yL7QjAZlu9nYuzejkDY6vmSa2BRVarShyEBAYvxZE,22368
105
+ lumibot/data_sources/__pycache__/polars_mixin.cpython-312.pyc,sha256=E8Oym2yFCqxFjZFYnZ8U7YO3-zoTQguId8a9Pheb_o8,14168
106
+ lumibot/data_sources/__pycache__/polygon_data_polars.cpython-312.pyc,sha256=wiKlGfn1B77kTfQOgur2z9w3iMX7IOst8h_5ZEuQE2U,26873
107
+ lumibot/data_sources/__pycache__/projectx_data.cpython-312.pyc,sha256=Ry4NQxBG0Y40uBwzzjb2q1WoVaepNdxXePaqQ_YoFDs,25784
108
+ lumibot/data_sources/__pycache__/schwab_data.cpython-312.pyc,sha256=CGuPWiynAa87lQfBET-M3rd7Mt5vYTpEkwYLz2zZVys,29111
109
+ lumibot/data_sources/__pycache__/tradier_data.cpython-312.pyc,sha256=gC2bUXi0qreXScJBnOXU0IrqnHv680N71I_qCib3fl4,18316
110
+ lumibot/data_sources/__pycache__/tradovate_data.cpython-312.pyc,sha256=kc02HAag5Xla3bBulm1fn9KRD7f0yp6hxwW05kXcq_Q,4342
111
+ lumibot/data_sources/__pycache__/yahoo_data_polars.cpython-312.pyc,sha256=RvcWAwuiNMuuxlK0pfoay38zw9oRmf8hTVuypGUYEJc,14988
61
112
  lumibot/entities/__init__.py,sha256=PvY1km9u_HtKXI0f3w1ZooHwMMWqYA8gBeKVapJk4Qg,410
62
- lumibot/entities/asset.py,sha256=8sfKppWPDFZRfrafmCrxVhFH6dMgiRqwekthlr96XVE,29076
113
+ lumibot/entities/asset.py,sha256=_yq8oas_NwkAtbQDDOLVmI9FoqYkT6YKYVZ0aHAXGkk,29547
63
114
  lumibot/entities/bar.py,sha256=_2gFtBzdbNPassLf1SU9J1mYKCZDner2h52qHl8e0oA,6003
64
115
  lumibot/entities/bars.py,sha256=F0DeTVzgrJohvA4yXUvcK8plSukW-LisoWNm9AD2b4c,21270
65
116
  lumibot/entities/chains.py,sha256=4P42AUtoPrRQHnPVj-g6mJ5W2nVf17ju3gXdavZcVyk,6281
66
117
  lumibot/entities/data.py,sha256=4vZDi9owGNX-JctqDn4_XvtH5eoCP7eL3lqapQG7ktk,26856
67
118
  lumibot/entities/dataline.py,sha256=G9XP8K1IvChvHLs5bEfSQLwCaGvWZXe3oEsBwsqysqQ,182
68
- lumibot/entities/order.py,sha256=-WOUx-eOadKMHWhpG8ZXp71maK66NsKoglP270wPoQw,55058
119
+ lumibot/entities/order.py,sha256=XMtMXrN4gqsTOZ5FfDbwpvhyKEKN93wYFukXwZi_fHQ,55046
69
120
  lumibot/entities/position.py,sha256=62jrKGKG2CspLWdZJ3Bo3mJxOFD-sOPKVCPbcvhJw1Q,8994
70
- lumibot/entities/quote.py,sha256=oye2DwO8fqGV8D3ops8HSS0bRT-w-6P2c4EKq4y8KEY,3180
121
+ lumibot/entities/quote.py,sha256=p8FvJfVZhWaZD5aFaslbYnUOgwK2Kbv4l-GLZU7ekAM,3746
71
122
  lumibot/entities/trading_fee.py,sha256=ESVgJD-AlIFeWdmsC4tXQ42PfWhRGX88lGkwnlTSXOg,1920
123
+ lumibot/entities/__pycache__/__init__.cpython-312.pyc,sha256=JW6tqdaA9vkUnEHjYJT2yNjXJXG1q-pma4k7fDv4myU,664
124
+ lumibot/entities/__pycache__/asset.cpython-312.pyc,sha256=P5DVp2iHhOqW727rDCM3eRDUxSF9JIS4YRRJuO4T93E,30767
125
+ lumibot/entities/__pycache__/bar.cpython-312.pyc,sha256=kdMRKaH-zuJPyDttdmVjGEmWBAjzPESH2eVZqBJ-L9U,8915
126
+ lumibot/entities/__pycache__/bars.cpython-312.pyc,sha256=oClUE4OdXKD1VHeUI5wckirgy9DWEe-3WDngOdrqWWg,26667
127
+ lumibot/entities/__pycache__/chains.cpython-312.pyc,sha256=kGvtUnC7Ldw4u4AB1jDDMuVcZEmaHOeDdeDoIuvrIzg,9466
128
+ lumibot/entities/__pycache__/data.cpython-312.pyc,sha256=yyeOJm9N6hzJSw-26i7BSuN764gOR8Dvp2hpE688t2Q,27994
129
+ lumibot/entities/__pycache__/dataline.cpython-312.pyc,sha256=-ZEV4BGQT_oL-_0dK845vFeIDQ7b2SRLO6HcY9El3Ow,637
130
+ lumibot/entities/__pycache__/order.cpython-312.pyc,sha256=b_Vfji4nBLsfnYKcKCaqCnLYi70FrzYzBPoNr67ilPI,51950
131
+ lumibot/entities/__pycache__/position.cpython-312.pyc,sha256=him2imuHAqfBnB2GhmS8JAdOMrFsCEAXHnK5oL0qFfA,11002
132
+ lumibot/entities/__pycache__/quote.cpython-312.pyc,sha256=6prQDmk1uLzLXvSiAQOIMcRszhnUZajm-ummviUZ4LY,4232
133
+ lumibot/entities/__pycache__/trading_fee.cpython-312.pyc,sha256=mc73RYA6dNjD9HpcvBF-3dJaz_wsFytuvU2igd0xrLU,2416
72
134
  lumibot/example_strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
135
  lumibot/example_strategies/bitunix_futures_example.py,sha256=SaOpQ2SQA8K2ZlTkbJ05eZLE8dXdMyXX5M9fyXGmzaI,3006
74
136
  lumibot/example_strategies/ccxt_backtesting_example.py,sha256=e-stFvUcWgjxbT3E1jwvipN7XSXatw1Di27Jj-wV_NU,5549
@@ -92,44 +154,79 @@ lumibot/example_strategies/stock_momentum.py,sha256=ln1qNafk1IwQjeJsFxunJSxiPItF
92
154
  lumibot/example_strategies/stock_oco.py,sha256=Lm-VNDjREPkGfbsVpH7dS2OrIw5g8NL_AcMYXSwzwXU,2482
93
155
  lumibot/example_strategies/strangle.py,sha256=naYiJLcjKu9yb_06WOMAUg8t-mFEo_F0BS62eY-5v20,12838
94
156
  lumibot/example_strategies/test_broker_functions.py,sha256=wnVS-M_OtzMgaXVBgshVEqXKGEnHVzVL_O4x5qR86cM,4443
157
+ lumibot/example_strategies/__pycache__/__init__.cpython-312.pyc,sha256=vawGE5mjtFUCyn6dqWSmZM2ij5pVT6YF4Cjn3KE0N-s,227
158
+ lumibot/example_strategies/__pycache__/test_broker_functions.cpython-312-pytest-8.4.1.pyc,sha256=Jvch4BJBA5IYmQx86yf8dDpWYFtV5ETkzrLFSxQoGkc,5452
95
159
  lumibot/resources/conf.yaml,sha256=rjB9-10JP7saZ_edjX5bQDGfuc3amOQTUUUr-UiMpNA,597
96
160
  lumibot/strategies/__init__.py,sha256=jEZ95K5hG0f595EXYKWwL2_UsnWWk5Pug361PK2My2E,79
97
- lumibot/strategies/_strategy.py,sha256=rjw3kIDh-H5YgStQ0AKw1JHJ2BOipDz5RLf8MrAX8HQ,106235
161
+ lumibot/strategies/_strategy.py,sha256=QCrrZQzTZ0GjsNyNNxHNI3WaNZ98yvxT-E0dbOBETMg,109685
98
162
  lumibot/strategies/session_manager.py,sha256=Nze6UYNSPlCsf-tyHvtFqUeL44WSNHjwsKrIepvsyCY,12956
99
- lumibot/strategies/strategy.py,sha256=yusYRrxYud31n1WFj2vuOYni8Qaxud2OQc6rN1_50XE,169174
100
- lumibot/strategies/strategy_executor.py,sha256=MdXugTusqIivjjCxGQ9AI0TmZs8kmdXInVGM8J9ONHE,70683
163
+ lumibot/strategies/strategy.py,sha256=i-jAt2a1DXSiKT1gMQ5vXkbLb29x9vAFZl9zehbfJ1s,169301
164
+ lumibot/strategies/strategy_executor.py,sha256=IrHwDOu5s3gG65dz7FL-0kllWy7COci7JFyB4iiPUrg,70801
165
+ lumibot/strategies/__pycache__/__init__.cpython-312.pyc,sha256=3By3e_Y9aa3NI5-Kj6qhaVMRddkQnK6QQDnnykt0vu4,322
166
+ lumibot/strategies/__pycache__/_strategy.cpython-312.pyc,sha256=x1oUZN1UlKakcUxM14hynmV3-iErPP3j0F_qyEBL-ws,96783
167
+ lumibot/strategies/__pycache__/strategy.cpython-312.pyc,sha256=0IWVs5G4s_N4zh-rxGNak-ilexFLFrMfy-a8UXFppus,177262
168
+ lumibot/strategies/__pycache__/strategy_executor.cpython-312.pyc,sha256=1Nh3xpSJnu3-w-nV05jEyFObmYBhaE87q8Ajeundfyc,65836
101
169
  lumibot/tools/__init__.py,sha256=oRRoK2NBkfnc0kueAfY0HrWVKgzRBO1hlglVMR4jr5M,1501
102
170
  lumibot/tools/alpaca_helpers.py,sha256=nhBS-sv28lZfIQ85szC9El8VHLrCw5a5KbsGOOEjm6w,3147
103
171
  lumibot/tools/bitunix_helpers.py,sha256=-UzrN3w_Y-Ckvhl7ZBoAcx7sgb6tH0KcpVph1Ovm3gw,25780
104
172
  lumibot/tools/black_scholes.py,sha256=TBjJuDTudvqsbwqSb7-zb4gXsJBCStQFaym8xvePAjw,25428
105
173
  lumibot/tools/ccxt_data_store.py,sha256=VXLSs0sWcwjRPZzbuEeVPS-3V6D10YnYMfIyoTPTG0U,21225
106
- lumibot/tools/databento_helper.py,sha256=2BrXvHsJiAoSG2VMWHhVwmmSXf9fHNvK-IvsPz3vBwc,33552
107
- lumibot/tools/databento_helper_polars.py,sha256=9ukvmHqoaMotoiSd7LpNi_tMr6VUWm_P7rQS1IuMu1M,49570
174
+ lumibot/tools/databento_helper.py,sha256=cbeMTrJOTu2E_Z9s021V_RGa4xrQ1LYI03SRi29pnQA,42976
175
+ lumibot/tools/databento_helper_polars.py,sha256=yQN4nIWg-WNXKoW8s1x8GUoq3rtmf6-NWNPnjFSZz2Q,53153
176
+ lumibot/tools/databento_roll.py,sha256=48HAw3h6OngCK4UTl9ifpjo-ki8qmB6OoJUrHp0gRmE,6767
108
177
  lumibot/tools/debugers.py,sha256=ga6npFsS9cpKtTXaygh9t2_txCElg3bfzfeqDBvSL8k,485
109
178
  lumibot/tools/decorators.py,sha256=gokLv6s37C1cnbnFSVOUc4RaVJ5aMTU2C344Vvi3ycs,2275
110
179
  lumibot/tools/futures_symbols.py,sha256=hFV02dk9cKucdaFOQAiQrlS15AJzdZ0qCuzVn7PfoPg,7851
111
180
  lumibot/tools/helpers.py,sha256=Q459K0aQGUME2CfwBCXmKbUQwiGR9FKSjUN2yLbBMIE,17873
112
181
  lumibot/tools/indicators.py,sha256=OnqVMDOFnymbZFobp6Dm8zBzTA4Lt2lZtK8S2ldkAa0,37998
113
- lumibot/tools/lumibot_logger.py,sha256=YoAPUoePS4SaJY8uGe8ZirWtdE0AdY3MrnOnr1Uh7Gg,38628
182
+ lumibot/tools/lumibot_logger.py,sha256=8Crm8XaZx4d4bjprpcR584i4PbqQHqEg2in9sJfiZbU,39267
114
183
  lumibot/tools/lumibot_time.py,sha256=gWgq6CAYds-btXRb5YbqXH2jcgwdH1JhR5roSYgWjbo,1085
115
184
  lumibot/tools/pandas.py,sha256=fRhCbtff5EcXjuhc5gaPSUeZvk9qomVGexAQl8YwgNs,2191
116
- lumibot/tools/polygon_helper.py,sha256=19PctU0cA7WXbGjfkEfuGflfnVYm4S7N2LT4jeLWqcg,36954
185
+ lumibot/tools/polygon_helper.py,sha256=Gw_4pjln-7P4ZzZGESeaJQmoryZHI4oS8flFpOjEROM,40477
117
186
  lumibot/tools/polygon_helper_async.py,sha256=YHDXa9kmkkn8jh7hToY6GP5etyXS9Tj-ukyHZuoDon4,10080
118
187
  lumibot/tools/polygon_helper_polars_optimized.py,sha256=NaIZ-5Av-G2McPEKHyJ-x65W72W_Agnz4lRgvXfQp8c,30415
119
188
  lumibot/tools/projectx_helpers.py,sha256=EIemLfbG923T_RBV_i6s6A9xgs7dt0et0oCnhFwdWfA,58299
120
189
  lumibot/tools/schwab_helper.py,sha256=CXnYhgsXOIb5MgmIYOp86aLxsBF9oeVrMGrjwl_GEv0,11768
121
- lumibot/tools/thetadata_helper.py,sha256=9SPzJbFRsA9g2ITBtehVL3UyGkAh3sAEoHtjySd9LsE,20938
190
+ lumibot/tools/thetadata_helper.py,sha256=mQKTQ_QO97IOetFJLD79NORU2yQpLKe12QwVl7mHUFk,42704
122
191
  lumibot/tools/types.py,sha256=x-aQBeC6ZTN2-pUyxyo69Q0j5e0c_swdfe06kfrWSVc,1978
123
192
  lumibot/tools/yahoo_helper.py,sha256=htcKKkuktatIckVKfLc_ms0X75mXColysQhrZW244z8,19497
124
193
  lumibot/tools/yahoo_helper_polars_optimized.py,sha256=g9xBN-ReHSW4Aj9EMU_OncBXVS1HpfL8LTHit9ZxFY4,7417
194
+ lumibot/tools/__pycache__/__init__.cpython-312.pyc,sha256=ZJz-PqTtkp03u6hSftIwdQHSyHlHE0GzOBIMCUu7li0,1133
195
+ lumibot/tools/__pycache__/alpaca_helpers.cpython-312.pyc,sha256=XudHieySE48xcgoOjvZRha3q-Z9zTuGlTVxGnE1R940,3668
196
+ lumibot/tools/__pycache__/bitunix_helpers.cpython-312.pyc,sha256=ySI8EwpWihEQFU7aiTFb3Z8ulHpExgYTo-FfMcq87Wc,26515
197
+ lumibot/tools/__pycache__/black_scholes.cpython-312.pyc,sha256=Ob4i4z-9C6okf6Pc9vRRakgmQD39hZ_M0E2W2PLIqC4,33744
198
+ lumibot/tools/__pycache__/ccxt_data_store.cpython-312.pyc,sha256=8k6crHbKZ1uZavaHqMijf4IE1YN7oX2T4Hov45jlx_E,25063
199
+ lumibot/tools/__pycache__/databento_helper.cpython-312.pyc,sha256=ennub9ZPxQxjEYUbcoU2Nr1DRTwL7WNv8BYoBPjjxDY,32832
200
+ lumibot/tools/__pycache__/databento_helper_polars.cpython-312.pyc,sha256=1DPgJobRPcAeD2oVmM-YulrvueKgE_H0D8uPUSmBp5s,50874
201
+ lumibot/tools/__pycache__/debugers.cpython-312.pyc,sha256=xchf2IOO-vkKaZmHJUqqSC00rn1EvFYoDFUDtNTFSCM,1371
202
+ lumibot/tools/__pycache__/decorators.cpython-312.pyc,sha256=jBWNB2uN4kcPVp9BbJHn4ma5GwZsTA9BG_Dwc-r3P2w,3569
203
+ lumibot/tools/__pycache__/helpers.cpython-312.pyc,sha256=EhjvGYmeCP9muJleXLunetMKMbyLlFLVQ21vtXQiEW4,23615
204
+ lumibot/tools/__pycache__/indicators.cpython-312.pyc,sha256=f7jyP5KyYY7HfFWCEHyzwUAFtyWPrXJPghfoyu4FpNs,36381
205
+ lumibot/tools/__pycache__/lumibot_logger.cpython-312.pyc,sha256=Oofui32VTyLT7LuDdu_xZX1xm75ooWDAjq567hIPw2o,41943
206
+ lumibot/tools/__pycache__/pandas.cpython-312.pyc,sha256=ocPN_aR7-T6Gxs4QTsijpvv3-ggPCuOJ9V6M4nZPAYo,4440
207
+ lumibot/tools/__pycache__/polygon_helper.cpython-312.pyc,sha256=ofOf3sHL3BPbqxX_Xfin3kO86QiSC-oyVf7c_bRRxwQ,37603
208
+ lumibot/tools/__pycache__/polygon_helper_async.cpython-312.pyc,sha256=fj1a-6B9NL4eoQzd3L_23V3nxseJOGvi2bDJ6o6HuZc,13845
209
+ lumibot/tools/__pycache__/polygon_helper_polars_optimized.cpython-312.pyc,sha256=PM27AFv6X-ZAEYY2rm72XenZ6nIzqYauhcL0O8Mo8oY,31630
210
+ lumibot/tools/__pycache__/projectx_helpers.cpython-312.pyc,sha256=oKHoJEvCl0Pi6Gs_pVsGgkzlOA2YE6NTzvm2DdRLAOA,65464
211
+ lumibot/tools/__pycache__/schwab_helper.cpython-312.pyc,sha256=OqHKnUVJ76-PY4Fx-9koqwx3jMziKrT_YSputXORqu0,13856
212
+ lumibot/tools/__pycache__/thetadata_helper.cpython-312.pyc,sha256=FJ4_nh9UAUEmGLk9WGxCoN6q4fTf6FZ9eHHBg6vjvjw,21403
213
+ lumibot/tools/__pycache__/types.cpython-312.pyc,sha256=YyCgEWf3wWf5o_kRbUGsv0qvhFySCP5Lzxz5aYIVzcw,1987
214
+ lumibot/tools/__pycache__/yahoo_helper.cpython-312.pyc,sha256=GvFRnaYFOhFj9lQ5oAF-gkBB3HyrL1h2HEBS6Y869Zg,22579
215
+ lumibot/tools/__pycache__/yahoo_helper_polars_optimized.cpython-312.pyc,sha256=MI8TI9AA-kA_9B5rZ87jWZvxJp3EzVOi4-MHqWbAcRI,8592
125
216
  lumibot/traders/__init__.py,sha256=JgpSuhNCl1OFoVFTQzQpPOpg6fZ-QbT7-3NsV9Yb89c,27
126
217
  lumibot/traders/debug_log_trader.py,sha256=Kzh0RFg_CthADULLXCLq_PMNrWSpuH2UhQnQBoH3Ybw,364
127
- lumibot/traders/trader.py,sha256=G4HGPlG_XPnaQcd0-PIEi0scBFgApJCPyDv-rv2C5o8,9669
218
+ lumibot/traders/trader.py,sha256=KMif3WoZtnSxA0BzoK3kvkTITNELrDFIortx1BYBv8s,9677
219
+ lumibot/traders/__pycache__/__init__.cpython-312.pyc,sha256=Vt8BsEU8iZRAR-ghKPfJxr_jA4mGyq6vKXkLgpGZJMM,256
220
+ lumibot/traders/__pycache__/trader.cpython-312.pyc,sha256=WJNSarXaQ1stfIEdAowUjP0Z1mk8FpJMO_awbrVhD0c,10991
128
221
  lumibot/trading_builtins/__init__.py,sha256=vH2QL5zLjL3slfEV1YW-BvQHtEYLCFkIWTZDfh3y8LE,87
129
222
  lumibot/trading_builtins/custom_stream.py,sha256=8_XiPT0JzyXrgnXCXoovGGUrWEfnG4ohIYMPfB_Nook,5264
130
223
  lumibot/trading_builtins/safe_list.py,sha256=IIjZOHSiZYK25A4WBts0oJaZNOJDsjZL65MOSHhE3Ig,1975
224
+ lumibot/trading_builtins/__pycache__/__init__.cpython-312.pyc,sha256=ksqDHG5HzxBeh3sDNn2NjEhYtj3dI6TvuQoe03VAItg,345
225
+ lumibot/trading_builtins/__pycache__/custom_stream.cpython-312.pyc,sha256=w9EEoPd4LTBKmS8x6x-umicO1GwzaHlZnAv7MC2A78o,7397
226
+ lumibot/trading_builtins/__pycache__/safe_list.cpython-312.pyc,sha256=2MQnqSCnMHHVu_gMK-3xBVSdHFyhxGR7_UrNdOvb4So,4875
227
+ lumibot-4.1.1.data/data/ThetaTerminal.jar,sha256=K6GeeFcN8-gvyL2x5iq5pzD79KfPJvMK8iiezi3TmNQ,11834389
131
228
  tests/__init__.py,sha256=3-VoT-nAuqMfwufd4ceN6fXaHl_zCfDCSXJOTp1ywYQ,393
132
- tests/conftest.py,sha256=7YzTnECE2oz_TPz3QwlE2nc8o3Msc9dNI56PmgH0p7I,2604
229
+ tests/conftest.py,sha256=UBw_2fx7r6TZPKus2b1Qxrzmd4bg8EEBnX1vCHUuSVA,3311
133
230
  tests/fixtures.py,sha256=wOHQsh1SGHnXe_PGi6kDWI30CS_Righi7Ig7vwSEKT4,9082
134
231
  tests/test_alpaca.py,sha256=VffTh_T04QwMEBUFfxS0ujK1tm5joft4N7972m6mJdM,18607
135
232
  tests/test_alpaca_auth_fix.py,sha256=wkvdxmLs4I-4ys-bOg_hFaC-hDha5aOaQNebr3NxxUQ,5924
@@ -146,9 +243,10 @@ tests/test_backtesting_broker.py,sha256=rxZGH5cgiWLmNGdI3k9fti3Fp9IOSohq8xD2E3L2
146
243
  tests/test_backtesting_broker_await_close.py,sha256=WbehY7E4Qet3_Mo7lpfgjmhtI9pnJPIt9mkFI15Dzho,7545
147
244
  tests/test_backtesting_broker_time_advance.py,sha256=FCv0nKG8BQlEjNft7kmQYm9M2CsLIZ0b7mWCllOHQxc,6378
148
245
  tests/test_backtesting_crypto_cash_unit.py,sha256=4EO9jVajdZNV0M7zSyp4gpR_msZFoM4x5tb-6g-mHO8,11399
246
+ tests/test_backtesting_data_source_env.py,sha256=Y36G2f0z_BsYkNA7zxKXwlbyQxKDXYbLDV_E4qjEem0,10671
149
247
  tests/test_backtesting_flow_control.py,sha256=pBqW-fa-HnZq0apUBltalGMM-vNJ_2A5W2SoJzMK8Mg,7208
150
248
  tests/test_backtesting_multileg_unit.py,sha256=h1DPfVuYXXx-uq6KtUjr6_nasZuXPm_5gFat1XxCKIo,6456
151
- tests/test_backtesting_quiet_logs_complete.py,sha256=-bjRbAWFJ5BlhoqDyhmnAgQdIOybD1Xsxv8AZS6r0k0,14222
249
+ tests/test_backtesting_quiet_logs_complete.py,sha256=x-GfOiqkiUu8pYKCzB0UUacn13Nx_cPRth7_jmPY2Y8,14155
152
250
  tests/test_bars_aggregate_frequency_normalization.py,sha256=F9iPmijhUET2QuVnjuNImomE_NoKm3BDemF_mssZKQQ,1788
153
251
  tests/test_bars_aggregation_timeunits.py,sha256=q4eKz4GacfgoIer-liFuV_yroTaDZ20ttlFKd2ZbCpY,2581
154
252
  tests/test_bars_frequency_flex.py,sha256=eLkkzt2IqGBkaCfcf62WvvlPnLmlXMqP2Is_8RVke8s,3157
@@ -171,12 +269,12 @@ tests/test_databento_auto_expiry_integration.py,sha256=uPAyYTMTzEqppUUZx99G8pvnv
171
269
  tests/test_databento_backtesting.py,sha256=5uGiKxQIY8eYVvgQEO6kA4GWUP4k2MCHi_S5h40gqH8,19150
172
270
  tests/test_databento_backtesting_polars.py,sha256=V9Z7-WG2TNKpHQVF5vGJSIdgUsuhJwlopZV66FREWA0,8097
173
271
  tests/test_databento_data.py,sha256=HakjDileGpicQc_OXeX7l8ncIDn3FtxP8ymKA6TQp8o,18860
174
- tests/test_databento_helper.py,sha256=3z9OLiJdtxDsZmM9tVhzqn4U6wNWKFfTygU_YcRiuhk,44253
272
+ tests/test_databento_helper.py,sha256=C2FRkD3341FFHc09bObEYYN7eqUsO9aewyaLX9hCdvU,43465
175
273
  tests/test_databento_live.py,sha256=tbg2C9cyW45OYY7dKYlPMNZpgsN_sjs4yk1GR23OL6o,15648
176
- tests/test_databento_timezone_fixes.py,sha256=kJClHKqQ9ZiNd4Bt0ceGx9fMxjVnyR3F9T7jJ66hRQg,10832
274
+ tests/test_databento_timezone_fixes.py,sha256=NsfND7yTdKH2ddiYYhO6kU3m41V7se7C4_zTvqKOGv0,11562
177
275
  tests/test_drift_rebalancer.py,sha256=AUuEd3WIunfx3gwVdLVtq8jOHlz65UeqpO4adY1xfcs,105289
178
276
  tests/test_futures_integration.py,sha256=3Ut0M8d5xPwHd4WcTSmP4HLC7VG_xSUXeJPX0-c0Fe8,9179
179
- tests/test_get_historical_prices.py,sha256=ygHW_cUu6f-HYmkYt9j4kDjsQP5iRjopP_PPw2E60rw,15540
277
+ tests/test_get_historical_prices.py,sha256=0JGlFuDyQFltKRpaFp2CLKEyleD2xMmgINVzLjrTdl8,15540
180
278
  tests/test_helpers.py,sha256=8Ay1B6I8yn3trZKrYjOs6Kbda7jmM20-TFh8LfIWpmY,11659
181
279
  tests/test_indicator_subplots.py,sha256=5gD5EX4KbGGk9FPwkT4m230U2nkgAT6t5nbgVo-2idc,10333
182
280
  tests/test_integration_tests.py,sha256=FJhWEJNF0OM6fAIsADnzB7EX61EvNiZBXH2Afmnd888,3071
@@ -188,12 +286,12 @@ tests/test_lumibot_logger.py,sha256=76e5yl86NWk4OYtM_be-7yaHnPA-1bO2rBNH-piX8Dk,
188
286
  tests/test_market_infinite_loop_bug.py,sha256=x9O5la9FgSyeza9V6QPUoY24BeZfGySYsioqWqDUYSo,13715
189
287
  tests/test_mes_symbols.py,sha256=Av5AM-pogp1STfWZ4A3bA2NmbaA3E9b0Dg449mfk-Ss,3106
190
288
  tests/test_momentum.py,sha256=oakKjgnz5pNQkw0CagbbKKSux0HkOxP_iLW8-Yk0XOo,8492
191
- tests/test_options_helper.py,sha256=c0_KYo9TvI4nDcagODc9P0rgXlJl0YtE8i6DHJw6ZqU,22066
289
+ tests/test_options_helper.py,sha256=NizH8E9ZnzVWsShsHp5X6qBE8FWJ3sS2eE9bCko7y9U,27352
192
290
  tests/test_options_helper_enhancements.py,sha256=3Ei-vy9IQfg1AnlBqofLNc-kuiQ64vouhJyIuVj3KIg,7324
193
291
  tests/test_order.py,sha256=qN_sqsItl8L-WqSQTF0PUN0s2nxm4HKYOA6gYQ6EBJA,12110
194
292
  tests/test_order_serialization.py,sha256=zcX5fgcYeo0jm6dlIQnUfuH56svTnKRFPtYCSI7xCJw,3710
195
293
  tests/test_pandas_data.py,sha256=VCDhPwAuOO6twR8a5B8dmBv3wfnOENw_1Pxr9N3x9iQ,2098
196
- tests/test_polygon_helper.py,sha256=YlT_neLx8g-qdWvgaFRSSJRsS8qbrNgBBKMllV17AUE,25520
294
+ tests/test_polygon_helper.py,sha256=JQCRHYgdiEzZQS_8j5kChg77S-xBpLQU6ZFN73Kfz4g,26230
197
295
  tests/test_position_serialization.py,sha256=QtBPKnGdmULLT_hKrfFzvbWWG3kfqWPW-Jv_r3theuM,4293
198
296
  tests/test_projectx.py,sha256=jyyX9ZEOCiF557MzG1sGQYk-v6JZYZ-LVIkLlURhMhQ,18327
199
297
  tests/test_projectx_bracket_helpers.py,sha256=Lnt-qA_6H0JcHeQaR5XNuc0O7uUCggksvYdIa3RVFEs,5554
@@ -210,35 +308,54 @@ tests/test_projectx_url_mappings.py,sha256=1E0xZe_cZtGiU-fPIfohbvsrrPjawkblR8F2M
210
308
  tests/test_quiet_logs_buy_and_hold.py,sha256=GjXGeHBcNrRJoHGWLuc_LkrzcpNVzshiiBkQACczIxI,2681
211
309
  tests/test_quiet_logs_comprehensive.py,sha256=QVkZWLAUnPEb04Ec8qKXvLzdDUkp8alez2mU_Y1Umm0,6068
212
310
  tests/test_quiet_logs_functionality.py,sha256=MlOBUICuTy1OXCDifOW05uD7hjnZRsQ2xxQlcLkGebQ,3811
213
- tests/test_quiet_logs_requirements.py,sha256=Dw147gq10HdP2pO9lnxIay-JrhpgXIMr9w9KAK20XGU,7893
311
+ tests/test_quiet_logs_requirements.py,sha256=YoUooSVLrFL8TlWPfxEiqxvSj4d8z6-qg58ja4dtOc0,7856
214
312
  tests/test_session_manager.py,sha256=1qygN3aQ2Xe2uh4BMPm0E3V8KXLFNGq5qdL8KkZjef4,11632
215
313
  tests/test_strategy_methods.py,sha256=j9Mhr6nnG1fkiVQXnx7gLjzGbeQmwt0UbJr_4plD36o,12539
216
- tests/test_thetadata_helper.py,sha256=4AshRKdpjnpvTb2zX2Bgq3oK0Y258WS57vDxEp2RiH0,37232
314
+ tests/test_thetadata_helper.py,sha256=fFLUfLlucUzHc4zAFY84lwWYZ-U79moU-a8z3rkRzcI,50631
217
315
  tests/test_tradier.py,sha256=iCEM2FTxJSzJ2oLNaRqSx05XaX_DCiMzLx1aEYPANko,33280
218
316
  tests/test_tradier_data.py,sha256=1jTxDzQtzaC42CQJVXMRMElBwExy1mVci3NFfKjjVH0,13363
219
317
  tests/test_tradingfee.py,sha256=2CBJgdU-73Ae4xuys-QkbCtpDTL9hwOUkRnCgLm4OmE,163
220
318
  tests/test_tradovate.py,sha256=XW0ZyiMbRYr16hqGJIa8C1Wg5O0V0tpiUMHvejIAnEg,37436
221
319
  tests/test_unified_logger.py,sha256=Y2rhLk6GoUs9Vj-qRvGThRUTdNohxmH2yFbb3j8Yq3g,10849
222
320
  tests/test_vix_helper.py,sha256=jE6TZ4ufVU_0W4Jx3zJ295srsy4Xjw9qU3KwfujjZ_s,8476
321
+ tests/test_yahoo_data.py,sha256=84R2jCl9z2U5qKZhR68tFJou2Rfwno0Qomc8yxPfvAs,4578
223
322
  tests/backtest/__init__.py,sha256=5hgvfU4Y_lOGEzArAzk-ng4m_elcSm7gpdnmGooJsbc,400
323
+ tests/backtest/check_timing_offset.py,sha256=NbzDTgJr8y0w1oz4d4HNeNTQe-o0z0hXwrnL92b2_GY,7493
324
+ tests/backtest/check_volume_spike.py,sha256=obMBw3SnaGFRQzXvvIEnDvZCqx7QovZ5oOUun1BKNNg,3959
325
+ tests/backtest/comprehensive_comparison.py,sha256=59ZMjLUMQQIKxj4H7YqtKJ9irOEjX6HQtAgqzn4widY,6599
224
326
  tests/backtest/conftest.py,sha256=yaZ2fYmi_BI8Wr6t0eB-Su_Coq9JxtyGPvIcCPW-JRs,2451
327
+ tests/backtest/debug_comparison.py,sha256=y2jmwp4E2ztBCcRpSs4meBj0hsx1qyCSdBwYt1xkX70,2898
328
+ tests/backtest/diagnose_price_difference.py,sha256=itJADngYkztSgMtDn1aJnK_5uUtsVclGQuoneTM3Bfo,3465
329
+ tests/backtest/direct_api_comparison.py,sha256=4YbJIlqfqWbg_v_B1OXhKyU_8mViDfWV3y3u2d7CfaI,7225
225
330
  tests/backtest/performance_tracker.py,sha256=oyaDvte66HveBAiU6fOsk5Z5FJaKulKN67IMnr5YTBU,4800
331
+ tests/backtest/profile_thetadata_vs_polygon.py,sha256=93kkcg6TaFk5N1A6GWN6wNSDBJWPsE0Hq3DdDgz1KLY,7870
332
+ tests/backtest/root_cause_analysis.py,sha256=L9VJUI4Dt8OpaAtTsOpYri_F75FAb-wtnkLuZKMl2pQ,3805
333
+ tests/backtest/test_accuracy_verification.py,sha256=NCvcmO0n6gmjsIfV06ZlpnEDwifsVM15xE_SLy5kAJg,9073
226
334
  tests/backtest/test_backtesting_broker_processing.py,sha256=JbTKZvcMq3l4AgIGhsvVWvhw3_NXQwql2ImztNKbziw,22145
227
335
  tests/backtest/test_buy_hold_quiet_logs_full_run.py,sha256=LDiR8wsEwIASPnO_bUMide6re0Jb-rzFG3hccD9OGJM,4998
228
336
  tests/backtest/test_crypto_cash_regressions.py,sha256=-f0wjb-9nXpggS30N4zomYl098Qu-tfvfWwhlkoxPMM,6077
229
- tests/backtest/test_databento.py,sha256=MNrpV4nUczUJUyaMS0mbfQ8BAd77-avgNeFP3qsLcI8,7395
230
- tests/backtest/test_dividends.py,sha256=fYSpzAf13AMpfxmxyFTfvUGPAGkbUTWL_gUYQUrqkbU,9815
231
- tests/backtest/test_example_strategies.py,sha256=EDgz-1PJUHEv_11DLWXvlzHqGOY_bJSCnUA16VbMByY,14575
337
+ tests/backtest/test_daily_data_timestamp_comparison.py,sha256=DeMLH0hwl0zEybJF0YTyBgfO8p96DGLahiBCwVQKjA4,35910
338
+ tests/backtest/test_databento.py,sha256=L7UIN0IjxdVzE65ujBvsoKyQhY4KHTctIOeOeWvVNBY,7485
339
+ tests/backtest/test_databento_comprehensive_trading.py,sha256=M7M2YHVkYRi5xBXifUESCnX5BFdtUDXy-HAhgazBAC4,23615
340
+ tests/backtest/test_debug_avg_fill_price.py,sha256=W4pgvCkAwmqlK82yzlw7u-s8VXe-dIQjPu-BVQkwJvg,3520
341
+ tests/backtest/test_dividends.py,sha256=tDEnK4IcqHPHYPXAfUlApEBOf-iMROSl3aCap0BX1nI,9970
342
+ tests/backtest/test_example_strategies.py,sha256=mSRRONtKdd7x0DUiuqCZD3YXLiPS8kAGn5wT1f_gDlk,15482
232
343
  tests/backtest/test_failing_backtest.py,sha256=jBkm_3Yq-TrzezAQM7XEAn3424lzG6Mu5agnTJQCo6E,5460
344
+ tests/backtest/test_futures_edge_cases.py,sha256=87j1WQ3ywE1FkusZGlW9IXFlqFhf776EXHd-yQmySZY,15422
345
+ tests/backtest/test_futures_single_trade.py,sha256=seGe-mOkoFnCY58HT-iaWktPo76-WG0xgxPkOiL6BOg,10838
346
+ tests/backtest/test_futures_ultra_simple.py,sha256=UWGhuhwALCpez-yJxmbke5pfW6vHLDsHbsezwezU934,6875
347
+ tests/backtest/test_index_data_verification.py,sha256=oCM_xRMylyDkUS0uDXCyj4KVKs_GG24lcqCvQq1Exvw,13737
233
348
  tests/backtest/test_multileg_backtest.py,sha256=XqvwMtyvlo59ZV3yqnZZ_nC_9cqnLozS4MRtKdFFY-U,4981
234
349
  tests/backtest/test_pandas_backtest.py,sha256=GSkhMY4wK1pFDe1Hscu7YxZG36RGdM1PtkLeq7u0caI,5433
235
350
  tests/backtest/test_passing_trader_into_backtest.py,sha256=KttDS3x1Dv686GBWjt520v_ampK2MIUyPfzl7HLVlwE,3163
236
- tests/backtest/test_polygon.py,sha256=bKrI5C3Gel1nsZfSR4tqdONMpEDNBDy1Q2If7wLclDU,24976
351
+ tests/backtest/test_polygon.py,sha256=-KMvCX8bioSm-2QrNDPBo8Ff0geHkdBLeOl6i5wFlWc,26095
237
352
  tests/backtest/test_strategy_executor.py,sha256=r-QNPCNJnisxQyIAxPGO-BQ-l3qtZMChOUWCVX-b4ls,1289
238
- tests/backtest/test_thetadata.py,sha256=-76X2QpPCt-EXkOYeTlFIOr_UBBGPel0B-r_F84hl5g,16838
239
- tests/backtest/test_yahoo.py,sha256=FolIqwsPlAOyAr2fjw4TKp_dAzBLT-KMLNcJa1ej4RE,2011
240
- lumibot-4.0.23.dist-info/LICENSE,sha256=fYhGIyxjyNXACgpNQS3xxpxDOaVOWRVxZMCRbsDv8k0,35130
241
- lumibot-4.0.23.dist-info/METADATA,sha256=5ZXFriQ3hRp76mlw6FMmw6u68Zm1iC6pKk_allFOQQc,11519
242
- lumibot-4.0.23.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
243
- lumibot-4.0.23.dist-info/top_level.txt,sha256=otUnUjDFVASauEDiTiAzNgMyqQ1B6jjS3QqqP-WSx38,14
244
- lumibot-4.0.23.dist-info/RECORD,,
353
+ tests/backtest/test_thetadata.py,sha256=xWYfC9C4EhbMDb29qyZWHO3sSWaLIPzzvcMbHCt5H0w,23306
354
+ tests/backtest/test_thetadata_comprehensive.py,sha256=-gN3xLJcJtlB-k4vlaK82DCZDGDmr0LNZZDzn-aN3l4,26120
355
+ tests/backtest/test_thetadata_vs_polygon.py,sha256=dZqsrOx3u3cz-1onIO6o5BDRjI1ey7U9vIkZupfXoig,22831
356
+ tests/backtest/test_yahoo.py,sha256=uHb9aK3uHYEvA7MI_y1dbKm7mjHrErlxU7TJOgVdzs8,1966
357
+ lumibot-4.1.1.dist-info/LICENSE,sha256=fYhGIyxjyNXACgpNQS3xxpxDOaVOWRVxZMCRbsDv8k0,35130
358
+ lumibot-4.1.1.dist-info/METADATA,sha256=lRxs-rWEYAAcbpGVP5TtgWLyOM6VjNVBZJYyo0DXqh0,11485
359
+ lumibot-4.1.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
360
+ lumibot-4.1.1.dist-info/top_level.txt,sha256=otUnUjDFVASauEDiTiAzNgMyqQ1B6jjS3QqqP-WSx38,14
361
+ lumibot-4.1.1.dist-info/RECORD,,
@@ -0,0 +1,198 @@
1
+ """
2
+ Check for timing offsets between ThetaData and Polygon.
3
+ Test if bars are offset by 1-3 minutes.
4
+ """
5
+
6
+ import os
7
+ import datetime
8
+ import pandas as pd
9
+ import requests
10
+ from polygon import RESTClient
11
+ from lumibot.credentials import POLYGON_API_KEY
12
+
13
+
14
+ def get_thetadata_bars(symbol, date_str):
15
+ """Get minute bars from ThetaData API directly."""
16
+ url = "http://127.0.0.1:25510/hist/stock/ohlc"
17
+ params = {
18
+ "root": symbol,
19
+ "start_date": date_str,
20
+ "end_date": date_str,
21
+ "ivl": 60000,
22
+ "rth": "true"
23
+ }
24
+
25
+ response = requests.get(url, params=params)
26
+ data = response.json()
27
+
28
+ if data and "response" in data:
29
+ df = pd.DataFrame(data["response"], columns=data["header"]["format"])
30
+ df["datetime"] = pd.to_datetime(df["date"].astype(str), format="%Y%m%d") + pd.to_timedelta(df["ms_of_day"], unit="ms")
31
+ df = df.set_index("datetime")
32
+ df.index = df.index.tz_localize("America/New_York")
33
+ df = df[["open", "high", "low", "close", "volume"]]
34
+ return df
35
+ return None
36
+
37
+
38
+ def get_polygon_bars(symbol, date):
39
+ """Get minute bars from Polygon API directly."""
40
+ client = RESTClient(POLYGON_API_KEY)
41
+ aggs = client.get_aggs(ticker=symbol, multiplier=1, timespan="minute", from_=date, to=date, limit=50000)
42
+
43
+ bars = []
44
+ for agg in aggs:
45
+ dt = datetime.datetime.fromtimestamp(agg.timestamp/1000, tz=datetime.timezone.utc)
46
+ bars.append({
47
+ "datetime": dt,
48
+ "open": agg.open,
49
+ "high": agg.high,
50
+ "low": agg.low,
51
+ "close": agg.close,
52
+ "volume": agg.volume,
53
+ })
54
+
55
+ if bars:
56
+ df = pd.DataFrame(bars)
57
+ df = df.set_index("datetime")
58
+ return df
59
+ return None
60
+
61
+
62
+ def test_timing_offset(symbol, date, date_str):
63
+ """Test different timing offsets to find best match."""
64
+ print(f"\n{'='*120}")
65
+ print(f"Testing Timing Offsets for {symbol}")
66
+ print(f"{'='*120}")
67
+
68
+ # Get data
69
+ theta_df = get_thetadata_bars(symbol, date_str)
70
+ polygon_df = get_polygon_bars(symbol, date)
71
+
72
+ if theta_df is None or polygon_df is None:
73
+ print(f"Missing data for {symbol}")
74
+ return
75
+
76
+ polygon_df.index = polygon_df.index.tz_convert("America/New_York")
77
+
78
+ # Show first 10 bars from each to examine timestamps
79
+ print(f"\nFirst 10 ThetaData bars:")
80
+ print(theta_df.head(10)[["open", "close", "volume"]])
81
+
82
+ print(f"\nFirst 10 Polygon bars:")
83
+ print(polygon_df.head(10)[["open", "close", "volume"]])
84
+
85
+ # Test offsets from -3 minutes to +3 minutes
86
+ print(f"\n{'='*120}")
87
+ print(f"Testing Different Time Offsets")
88
+ print(f"{'='*120}")
89
+
90
+ best_offset = None
91
+ best_score = float('inf')
92
+
93
+ for offset_minutes in range(-3, 4):
94
+ # Shift ThetaData bars by offset
95
+ theta_shifted = theta_df.copy()
96
+ theta_shifted.index = theta_shifted.index + pd.Timedelta(minutes=offset_minutes)
97
+
98
+ # Find matching times around market open (9:30-9:35)
99
+ matches = []
100
+ for hour in [9, 10]:
101
+ for minute in range(0 if hour == 10 else 30, 60 if hour == 9 else 5):
102
+ time_str = f"{hour:02d}:{minute:02d}"
103
+
104
+ theta_matches = theta_shifted[(theta_shifted.index.hour == hour) & (theta_shifted.index.minute == minute)]
105
+ polygon_matches = polygon_df[(polygon_df.index.hour == hour) & (polygon_df.index.minute == minute)]
106
+
107
+ if not theta_matches.empty and not polygon_matches.empty:
108
+ theta_bar = theta_matches.iloc[0]
109
+ polygon_bar = polygon_matches.iloc[0]
110
+
111
+ open_diff = abs(theta_bar["open"] - polygon_bar["open"])
112
+ close_diff = abs(theta_bar["close"] - polygon_bar["close"])
113
+ volume_diff = abs(theta_bar["volume"] - polygon_bar["volume"])
114
+ volume_pct_diff = abs(volume_diff / polygon_bar["volume"] * 100) if polygon_bar["volume"] > 0 else 0
115
+
116
+ matches.append({
117
+ "time": time_str,
118
+ "open_diff": open_diff,
119
+ "close_diff": close_diff,
120
+ "volume_pct_diff": volume_pct_diff,
121
+ })
122
+
123
+ if matches:
124
+ avg_open_diff = sum(m["open_diff"] for m in matches) / len(matches)
125
+ avg_close_diff = sum(m["close_diff"] for m in matches) / len(matches)
126
+ avg_volume_pct_diff = sum(m["volume_pct_diff"] for m in matches) / len(matches)
127
+
128
+ # Score based on price and volume differences
129
+ score = avg_open_diff + avg_close_diff + (avg_volume_pct_diff / 100)
130
+
131
+ print(f"\nOffset: {offset_minutes:+2d} minutes | Avg Open Diff: ${avg_open_diff:.3f} | Avg Close Diff: ${avg_close_diff:.3f} | Avg Vol Diff: {avg_volume_pct_diff:.1f}% | Score: {score:.3f}")
132
+
133
+ if score < best_score:
134
+ best_score = score
135
+ best_offset = offset_minutes
136
+
137
+ print(f"\n{'='*120}")
138
+ print(f"BEST OFFSET: {best_offset:+d} minutes (Score: {best_score:.3f})")
139
+ print(f"{'='*120}")
140
+
141
+ # Show detailed comparison at best offset
142
+ if best_offset is not None:
143
+ theta_shifted = theta_df.copy()
144
+ theta_shifted.index = theta_shifted.index + pd.Timedelta(minutes=best_offset)
145
+
146
+ print(f"\nDetailed Comparison at Market Open with {best_offset:+d} minute offset:")
147
+ print("-" * 120)
148
+
149
+ for minute in range(30, 35):
150
+ theta_matches = theta_shifted[(theta_shifted.index.hour == 9) & (theta_shifted.index.minute == minute)]
151
+ polygon_matches = polygon_df[(polygon_df.index.hour == 9) & (polygon_df.index.minute == minute)]
152
+
153
+ if not theta_matches.empty and not polygon_matches.empty:
154
+ theta_bar = theta_matches.iloc[0]
155
+ polygon_bar = polygon_matches.iloc[0]
156
+
157
+ open_diff = theta_bar["open"] - polygon_bar["open"]
158
+ close_diff = theta_bar["close"] - polygon_bar["close"]
159
+ volume_diff = theta_bar["volume"] - polygon_bar["volume"]
160
+ volume_pct = (volume_diff / polygon_bar["volume"] * 100) if polygon_bar["volume"] > 0 else 0
161
+
162
+ print(f"\n 9:{minute:02d} AM:")
163
+ print(f" ThetaData : O=${theta_bar['open']:.3f} C=${theta_bar['close']:.3f} V={theta_bar['volume']:,.0f}")
164
+ print(f" Polygon : O=${polygon_bar['open']:.3f} C=${polygon_bar['close']:.3f} V={polygon_bar['volume']:,.0f}")
165
+ print(f" Difference: O=${open_diff:+.3f} C=${close_diff:+.3f} V={volume_diff:+,.0f} ({volume_pct:+.1f}%)")
166
+
167
+ return best_offset
168
+
169
+
170
+ def main():
171
+ date = datetime.date(2024, 8, 1)
172
+ date_str = "20240801"
173
+
174
+ symbols = ["AMZN", "AAPL", "SPY"]
175
+
176
+ offsets = {}
177
+ for symbol in symbols:
178
+ offset = test_timing_offset(symbol, date, date_str)
179
+ if offset is not None:
180
+ offsets[symbol] = offset
181
+
182
+ print(f"\n{'='*120}")
183
+ print(f"SUMMARY")
184
+ print(f"{'='*120}")
185
+ for symbol, offset in offsets.items():
186
+ print(f"{symbol}: {offset:+d} minutes")
187
+
188
+ if offsets:
189
+ all_same = len(set(offsets.values())) == 1
190
+ if all_same:
191
+ print(f"\n✓ All symbols have the same offset: {list(offsets.values())[0]:+d} minutes")
192
+ print(f" This indicates a systematic timing issue in ThetaData!")
193
+ else:
194
+ print(f"\n⚠ Different offsets detected - issue may be more complex")
195
+
196
+
197
+ if __name__ == "__main__":
198
+ main()