lumibot 4.0.23__py3-none-any.whl → 4.1.0__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 (160) 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 +141 -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.0.23.dist-info → lumibot-4.1.0.dist-info}/METADATA +1 -2
  122. {lumibot-4.0.23.dist-info → lumibot-4.1.0.dist-info}/RECORD +160 -44
  123. tests/backtest/check_timing_offset.py +198 -0
  124. tests/backtest/check_volume_spike.py +112 -0
  125. tests/backtest/comprehensive_comparison.py +166 -0
  126. tests/backtest/debug_comparison.py +91 -0
  127. tests/backtest/diagnose_price_difference.py +97 -0
  128. tests/backtest/direct_api_comparison.py +203 -0
  129. tests/backtest/profile_thetadata_vs_polygon.py +255 -0
  130. tests/backtest/root_cause_analysis.py +109 -0
  131. tests/backtest/test_accuracy_verification.py +244 -0
  132. tests/backtest/test_daily_data_timestamp_comparison.py +801 -0
  133. tests/backtest/test_databento.py +4 -0
  134. tests/backtest/test_databento_comprehensive_trading.py +564 -0
  135. tests/backtest/test_debug_avg_fill_price.py +112 -0
  136. tests/backtest/test_dividends.py +8 -3
  137. tests/backtest/test_example_strategies.py +54 -47
  138. tests/backtest/test_futures_edge_cases.py +451 -0
  139. tests/backtest/test_futures_single_trade.py +270 -0
  140. tests/backtest/test_futures_ultra_simple.py +191 -0
  141. tests/backtest/test_index_data_verification.py +348 -0
  142. tests/backtest/test_polygon.py +45 -24
  143. tests/backtest/test_thetadata.py +246 -60
  144. tests/backtest/test_thetadata_comprehensive.py +729 -0
  145. tests/backtest/test_thetadata_vs_polygon.py +557 -0
  146. tests/backtest/test_yahoo.py +1 -2
  147. tests/conftest.py +20 -0
  148. tests/test_backtesting_data_source_env.py +249 -0
  149. tests/test_backtesting_quiet_logs_complete.py +10 -11
  150. tests/test_databento_helper.py +73 -86
  151. tests/test_databento_timezone_fixes.py +21 -4
  152. tests/test_get_historical_prices.py +6 -6
  153. tests/test_options_helper.py +162 -40
  154. tests/test_polygon_helper.py +21 -13
  155. tests/test_quiet_logs_requirements.py +5 -5
  156. tests/test_thetadata_helper.py +487 -171
  157. tests/test_yahoo_data.py +125 -0
  158. {lumibot-4.0.23.dist-info → lumibot-4.1.0.dist-info}/LICENSE +0 -0
  159. {lumibot-4.0.23.dist-info → lumibot-4.1.0.dist-info}/WHEEL +0 -0
  160. {lumibot-4.0.23.dist-info → lumibot-4.1.0.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.0
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=OnOqZI-rS-cAZ5vLRGOYERmW70x48hmBDyCPWfATseM,27773
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,78 @@ 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
131
227
  tests/__init__.py,sha256=3-VoT-nAuqMfwufd4ceN6fXaHl_zCfDCSXJOTp1ywYQ,393
132
- tests/conftest.py,sha256=7YzTnECE2oz_TPz3QwlE2nc8o3Msc9dNI56PmgH0p7I,2604
228
+ tests/conftest.py,sha256=UBw_2fx7r6TZPKus2b1Qxrzmd4bg8EEBnX1vCHUuSVA,3311
133
229
  tests/fixtures.py,sha256=wOHQsh1SGHnXe_PGi6kDWI30CS_Righi7Ig7vwSEKT4,9082
134
230
  tests/test_alpaca.py,sha256=VffTh_T04QwMEBUFfxS0ujK1tm5joft4N7972m6mJdM,18607
135
231
  tests/test_alpaca_auth_fix.py,sha256=wkvdxmLs4I-4ys-bOg_hFaC-hDha5aOaQNebr3NxxUQ,5924
@@ -146,9 +242,10 @@ tests/test_backtesting_broker.py,sha256=rxZGH5cgiWLmNGdI3k9fti3Fp9IOSohq8xD2E3L2
146
242
  tests/test_backtesting_broker_await_close.py,sha256=WbehY7E4Qet3_Mo7lpfgjmhtI9pnJPIt9mkFI15Dzho,7545
147
243
  tests/test_backtesting_broker_time_advance.py,sha256=FCv0nKG8BQlEjNft7kmQYm9M2CsLIZ0b7mWCllOHQxc,6378
148
244
  tests/test_backtesting_crypto_cash_unit.py,sha256=4EO9jVajdZNV0M7zSyp4gpR_msZFoM4x5tb-6g-mHO8,11399
245
+ tests/test_backtesting_data_source_env.py,sha256=Y36G2f0z_BsYkNA7zxKXwlbyQxKDXYbLDV_E4qjEem0,10671
149
246
  tests/test_backtesting_flow_control.py,sha256=pBqW-fa-HnZq0apUBltalGMM-vNJ_2A5W2SoJzMK8Mg,7208
150
247
  tests/test_backtesting_multileg_unit.py,sha256=h1DPfVuYXXx-uq6KtUjr6_nasZuXPm_5gFat1XxCKIo,6456
151
- tests/test_backtesting_quiet_logs_complete.py,sha256=-bjRbAWFJ5BlhoqDyhmnAgQdIOybD1Xsxv8AZS6r0k0,14222
248
+ tests/test_backtesting_quiet_logs_complete.py,sha256=x-GfOiqkiUu8pYKCzB0UUacn13Nx_cPRth7_jmPY2Y8,14155
152
249
  tests/test_bars_aggregate_frequency_normalization.py,sha256=F9iPmijhUET2QuVnjuNImomE_NoKm3BDemF_mssZKQQ,1788
153
250
  tests/test_bars_aggregation_timeunits.py,sha256=q4eKz4GacfgoIer-liFuV_yroTaDZ20ttlFKd2ZbCpY,2581
154
251
  tests/test_bars_frequency_flex.py,sha256=eLkkzt2IqGBkaCfcf62WvvlPnLmlXMqP2Is_8RVke8s,3157
@@ -171,12 +268,12 @@ tests/test_databento_auto_expiry_integration.py,sha256=uPAyYTMTzEqppUUZx99G8pvnv
171
268
  tests/test_databento_backtesting.py,sha256=5uGiKxQIY8eYVvgQEO6kA4GWUP4k2MCHi_S5h40gqH8,19150
172
269
  tests/test_databento_backtesting_polars.py,sha256=V9Z7-WG2TNKpHQVF5vGJSIdgUsuhJwlopZV66FREWA0,8097
173
270
  tests/test_databento_data.py,sha256=HakjDileGpicQc_OXeX7l8ncIDn3FtxP8ymKA6TQp8o,18860
174
- tests/test_databento_helper.py,sha256=3z9OLiJdtxDsZmM9tVhzqn4U6wNWKFfTygU_YcRiuhk,44253
271
+ tests/test_databento_helper.py,sha256=vM_zgxITXXfzMlZwoS9vnJvoOqcrVv2ZdnRKjVxergY,43522
175
272
  tests/test_databento_live.py,sha256=tbg2C9cyW45OYY7dKYlPMNZpgsN_sjs4yk1GR23OL6o,15648
176
- tests/test_databento_timezone_fixes.py,sha256=kJClHKqQ9ZiNd4Bt0ceGx9fMxjVnyR3F9T7jJ66hRQg,10832
273
+ tests/test_databento_timezone_fixes.py,sha256=NsfND7yTdKH2ddiYYhO6kU3m41V7se7C4_zTvqKOGv0,11562
177
274
  tests/test_drift_rebalancer.py,sha256=AUuEd3WIunfx3gwVdLVtq8jOHlz65UeqpO4adY1xfcs,105289
178
275
  tests/test_futures_integration.py,sha256=3Ut0M8d5xPwHd4WcTSmP4HLC7VG_xSUXeJPX0-c0Fe8,9179
179
- tests/test_get_historical_prices.py,sha256=ygHW_cUu6f-HYmkYt9j4kDjsQP5iRjopP_PPw2E60rw,15540
276
+ tests/test_get_historical_prices.py,sha256=0JGlFuDyQFltKRpaFp2CLKEyleD2xMmgINVzLjrTdl8,15540
180
277
  tests/test_helpers.py,sha256=8Ay1B6I8yn3trZKrYjOs6Kbda7jmM20-TFh8LfIWpmY,11659
181
278
  tests/test_indicator_subplots.py,sha256=5gD5EX4KbGGk9FPwkT4m230U2nkgAT6t5nbgVo-2idc,10333
182
279
  tests/test_integration_tests.py,sha256=FJhWEJNF0OM6fAIsADnzB7EX61EvNiZBXH2Afmnd888,3071
@@ -188,12 +285,12 @@ tests/test_lumibot_logger.py,sha256=76e5yl86NWk4OYtM_be-7yaHnPA-1bO2rBNH-piX8Dk,
188
285
  tests/test_market_infinite_loop_bug.py,sha256=x9O5la9FgSyeza9V6QPUoY24BeZfGySYsioqWqDUYSo,13715
189
286
  tests/test_mes_symbols.py,sha256=Av5AM-pogp1STfWZ4A3bA2NmbaA3E9b0Dg449mfk-Ss,3106
190
287
  tests/test_momentum.py,sha256=oakKjgnz5pNQkw0CagbbKKSux0HkOxP_iLW8-Yk0XOo,8492
191
- tests/test_options_helper.py,sha256=c0_KYo9TvI4nDcagODc9P0rgXlJl0YtE8i6DHJw6ZqU,22066
288
+ tests/test_options_helper.py,sha256=NizH8E9ZnzVWsShsHp5X6qBE8FWJ3sS2eE9bCko7y9U,27352
192
289
  tests/test_options_helper_enhancements.py,sha256=3Ei-vy9IQfg1AnlBqofLNc-kuiQ64vouhJyIuVj3KIg,7324
193
290
  tests/test_order.py,sha256=qN_sqsItl8L-WqSQTF0PUN0s2nxm4HKYOA6gYQ6EBJA,12110
194
291
  tests/test_order_serialization.py,sha256=zcX5fgcYeo0jm6dlIQnUfuH56svTnKRFPtYCSI7xCJw,3710
195
292
  tests/test_pandas_data.py,sha256=VCDhPwAuOO6twR8a5B8dmBv3wfnOENw_1Pxr9N3x9iQ,2098
196
- tests/test_polygon_helper.py,sha256=YlT_neLx8g-qdWvgaFRSSJRsS8qbrNgBBKMllV17AUE,25520
293
+ tests/test_polygon_helper.py,sha256=JQCRHYgdiEzZQS_8j5kChg77S-xBpLQU6ZFN73Kfz4g,26230
197
294
  tests/test_position_serialization.py,sha256=QtBPKnGdmULLT_hKrfFzvbWWG3kfqWPW-Jv_r3theuM,4293
198
295
  tests/test_projectx.py,sha256=jyyX9ZEOCiF557MzG1sGQYk-v6JZYZ-LVIkLlURhMhQ,18327
199
296
  tests/test_projectx_bracket_helpers.py,sha256=Lnt-qA_6H0JcHeQaR5XNuc0O7uUCggksvYdIa3RVFEs,5554
@@ -210,35 +307,54 @@ tests/test_projectx_url_mappings.py,sha256=1E0xZe_cZtGiU-fPIfohbvsrrPjawkblR8F2M
210
307
  tests/test_quiet_logs_buy_and_hold.py,sha256=GjXGeHBcNrRJoHGWLuc_LkrzcpNVzshiiBkQACczIxI,2681
211
308
  tests/test_quiet_logs_comprehensive.py,sha256=QVkZWLAUnPEb04Ec8qKXvLzdDUkp8alez2mU_Y1Umm0,6068
212
309
  tests/test_quiet_logs_functionality.py,sha256=MlOBUICuTy1OXCDifOW05uD7hjnZRsQ2xxQlcLkGebQ,3811
213
- tests/test_quiet_logs_requirements.py,sha256=Dw147gq10HdP2pO9lnxIay-JrhpgXIMr9w9KAK20XGU,7893
310
+ tests/test_quiet_logs_requirements.py,sha256=YoUooSVLrFL8TlWPfxEiqxvSj4d8z6-qg58ja4dtOc0,7856
214
311
  tests/test_session_manager.py,sha256=1qygN3aQ2Xe2uh4BMPm0E3V8KXLFNGq5qdL8KkZjef4,11632
215
312
  tests/test_strategy_methods.py,sha256=j9Mhr6nnG1fkiVQXnx7gLjzGbeQmwt0UbJr_4plD36o,12539
216
- tests/test_thetadata_helper.py,sha256=4AshRKdpjnpvTb2zX2Bgq3oK0Y258WS57vDxEp2RiH0,37232
313
+ tests/test_thetadata_helper.py,sha256=fFLUfLlucUzHc4zAFY84lwWYZ-U79moU-a8z3rkRzcI,50631
217
314
  tests/test_tradier.py,sha256=iCEM2FTxJSzJ2oLNaRqSx05XaX_DCiMzLx1aEYPANko,33280
218
315
  tests/test_tradier_data.py,sha256=1jTxDzQtzaC42CQJVXMRMElBwExy1mVci3NFfKjjVH0,13363
219
316
  tests/test_tradingfee.py,sha256=2CBJgdU-73Ae4xuys-QkbCtpDTL9hwOUkRnCgLm4OmE,163
220
317
  tests/test_tradovate.py,sha256=XW0ZyiMbRYr16hqGJIa8C1Wg5O0V0tpiUMHvejIAnEg,37436
221
318
  tests/test_unified_logger.py,sha256=Y2rhLk6GoUs9Vj-qRvGThRUTdNohxmH2yFbb3j8Yq3g,10849
222
319
  tests/test_vix_helper.py,sha256=jE6TZ4ufVU_0W4Jx3zJ295srsy4Xjw9qU3KwfujjZ_s,8476
320
+ tests/test_yahoo_data.py,sha256=84R2jCl9z2U5qKZhR68tFJou2Rfwno0Qomc8yxPfvAs,4578
223
321
  tests/backtest/__init__.py,sha256=5hgvfU4Y_lOGEzArAzk-ng4m_elcSm7gpdnmGooJsbc,400
322
+ tests/backtest/check_timing_offset.py,sha256=NbzDTgJr8y0w1oz4d4HNeNTQe-o0z0hXwrnL92b2_GY,7493
323
+ tests/backtest/check_volume_spike.py,sha256=obMBw3SnaGFRQzXvvIEnDvZCqx7QovZ5oOUun1BKNNg,3959
324
+ tests/backtest/comprehensive_comparison.py,sha256=59ZMjLUMQQIKxj4H7YqtKJ9irOEjX6HQtAgqzn4widY,6599
224
325
  tests/backtest/conftest.py,sha256=yaZ2fYmi_BI8Wr6t0eB-Su_Coq9JxtyGPvIcCPW-JRs,2451
326
+ tests/backtest/debug_comparison.py,sha256=y2jmwp4E2ztBCcRpSs4meBj0hsx1qyCSdBwYt1xkX70,2898
327
+ tests/backtest/diagnose_price_difference.py,sha256=itJADngYkztSgMtDn1aJnK_5uUtsVclGQuoneTM3Bfo,3465
328
+ tests/backtest/direct_api_comparison.py,sha256=4YbJIlqfqWbg_v_B1OXhKyU_8mViDfWV3y3u2d7CfaI,7225
225
329
  tests/backtest/performance_tracker.py,sha256=oyaDvte66HveBAiU6fOsk5Z5FJaKulKN67IMnr5YTBU,4800
330
+ tests/backtest/profile_thetadata_vs_polygon.py,sha256=93kkcg6TaFk5N1A6GWN6wNSDBJWPsE0Hq3DdDgz1KLY,7870
331
+ tests/backtest/root_cause_analysis.py,sha256=L9VJUI4Dt8OpaAtTsOpYri_F75FAb-wtnkLuZKMl2pQ,3805
332
+ tests/backtest/test_accuracy_verification.py,sha256=NCvcmO0n6gmjsIfV06ZlpnEDwifsVM15xE_SLy5kAJg,9073
226
333
  tests/backtest/test_backtesting_broker_processing.py,sha256=JbTKZvcMq3l4AgIGhsvVWvhw3_NXQwql2ImztNKbziw,22145
227
334
  tests/backtest/test_buy_hold_quiet_logs_full_run.py,sha256=LDiR8wsEwIASPnO_bUMide6re0Jb-rzFG3hccD9OGJM,4998
228
335
  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
336
+ tests/backtest/test_daily_data_timestamp_comparison.py,sha256=DeMLH0hwl0zEybJF0YTyBgfO8p96DGLahiBCwVQKjA4,35910
337
+ tests/backtest/test_databento.py,sha256=L7UIN0IjxdVzE65ujBvsoKyQhY4KHTctIOeOeWvVNBY,7485
338
+ tests/backtest/test_databento_comprehensive_trading.py,sha256=M7M2YHVkYRi5xBXifUESCnX5BFdtUDXy-HAhgazBAC4,23615
339
+ tests/backtest/test_debug_avg_fill_price.py,sha256=W4pgvCkAwmqlK82yzlw7u-s8VXe-dIQjPu-BVQkwJvg,3520
340
+ tests/backtest/test_dividends.py,sha256=tDEnK4IcqHPHYPXAfUlApEBOf-iMROSl3aCap0BX1nI,9970
341
+ tests/backtest/test_example_strategies.py,sha256=mSRRONtKdd7x0DUiuqCZD3YXLiPS8kAGn5wT1f_gDlk,15482
232
342
  tests/backtest/test_failing_backtest.py,sha256=jBkm_3Yq-TrzezAQM7XEAn3424lzG6Mu5agnTJQCo6E,5460
343
+ tests/backtest/test_futures_edge_cases.py,sha256=87j1WQ3ywE1FkusZGlW9IXFlqFhf776EXHd-yQmySZY,15422
344
+ tests/backtest/test_futures_single_trade.py,sha256=seGe-mOkoFnCY58HT-iaWktPo76-WG0xgxPkOiL6BOg,10838
345
+ tests/backtest/test_futures_ultra_simple.py,sha256=UWGhuhwALCpez-yJxmbke5pfW6vHLDsHbsezwezU934,6875
346
+ tests/backtest/test_index_data_verification.py,sha256=oCM_xRMylyDkUS0uDXCyj4KVKs_GG24lcqCvQq1Exvw,13737
233
347
  tests/backtest/test_multileg_backtest.py,sha256=XqvwMtyvlo59ZV3yqnZZ_nC_9cqnLozS4MRtKdFFY-U,4981
234
348
  tests/backtest/test_pandas_backtest.py,sha256=GSkhMY4wK1pFDe1Hscu7YxZG36RGdM1PtkLeq7u0caI,5433
235
349
  tests/backtest/test_passing_trader_into_backtest.py,sha256=KttDS3x1Dv686GBWjt520v_ampK2MIUyPfzl7HLVlwE,3163
236
- tests/backtest/test_polygon.py,sha256=bKrI5C3Gel1nsZfSR4tqdONMpEDNBDy1Q2If7wLclDU,24976
350
+ tests/backtest/test_polygon.py,sha256=-KMvCX8bioSm-2QrNDPBo8Ff0geHkdBLeOl6i5wFlWc,26095
237
351
  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,,
352
+ tests/backtest/test_thetadata.py,sha256=xWYfC9C4EhbMDb29qyZWHO3sSWaLIPzzvcMbHCt5H0w,23306
353
+ tests/backtest/test_thetadata_comprehensive.py,sha256=-gN3xLJcJtlB-k4vlaK82DCZDGDmr0LNZZDzn-aN3l4,26120
354
+ tests/backtest/test_thetadata_vs_polygon.py,sha256=dZqsrOx3u3cz-1onIO6o5BDRjI1ey7U9vIkZupfXoig,22831
355
+ tests/backtest/test_yahoo.py,sha256=uHb9aK3uHYEvA7MI_y1dbKm7mjHrErlxU7TJOgVdzs8,1966
356
+ lumibot-4.1.0.dist-info/LICENSE,sha256=fYhGIyxjyNXACgpNQS3xxpxDOaVOWRVxZMCRbsDv8k0,35130
357
+ lumibot-4.1.0.dist-info/METADATA,sha256=Ousu6h0LyLNYv50Jcl1T9kVtmQcCFVA1CnvLHPrXjso,11485
358
+ lumibot-4.1.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
359
+ lumibot-4.1.0.dist-info/top_level.txt,sha256=otUnUjDFVASauEDiTiAzNgMyqQ1B6jjS3QqqP-WSx38,14
360
+ lumibot-4.1.0.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()