lumibot 4.0.22__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 (164) 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/__init__.py +2 -1
  37. lumibot/data_sources/__pycache__/__init__.cpython-312.pyc +0 -0
  38. lumibot/data_sources/__pycache__/alpaca_data.cpython-312.pyc +0 -0
  39. lumibot/data_sources/__pycache__/alpha_vantage_data.cpython-312.pyc +0 -0
  40. lumibot/data_sources/__pycache__/bitunix_data.cpython-312.pyc +0 -0
  41. lumibot/data_sources/__pycache__/ccxt_backtesting_data.cpython-312.pyc +0 -0
  42. lumibot/data_sources/__pycache__/ccxt_data.cpython-312.pyc +0 -0
  43. lumibot/data_sources/__pycache__/data_source.cpython-312.pyc +0 -0
  44. lumibot/data_sources/__pycache__/data_source_backtesting.cpython-312.pyc +0 -0
  45. lumibot/data_sources/__pycache__/databento_data_polars_backtesting.cpython-312.pyc +0 -0
  46. lumibot/data_sources/__pycache__/databento_data_polars_live.cpython-312.pyc +0 -0
  47. lumibot/data_sources/__pycache__/example_broker_data.cpython-312.pyc +0 -0
  48. lumibot/data_sources/__pycache__/exceptions.cpython-312.pyc +0 -0
  49. lumibot/data_sources/__pycache__/interactive_brokers_data.cpython-312.pyc +0 -0
  50. lumibot/data_sources/__pycache__/interactive_brokers_rest_data.cpython-312.pyc +0 -0
  51. lumibot/data_sources/__pycache__/pandas_data.cpython-312.pyc +0 -0
  52. lumibot/data_sources/__pycache__/polars_mixin.cpython-312.pyc +0 -0
  53. lumibot/data_sources/__pycache__/polygon_data_polars.cpython-312.pyc +0 -0
  54. lumibot/data_sources/__pycache__/projectx_data.cpython-312.pyc +0 -0
  55. lumibot/data_sources/__pycache__/schwab_data.cpython-312.pyc +0 -0
  56. lumibot/data_sources/__pycache__/tradier_data.cpython-312.pyc +0 -0
  57. lumibot/data_sources/__pycache__/tradovate_data.cpython-312.pyc +0 -0
  58. lumibot/data_sources/__pycache__/yahoo_data_polars.cpython-312.pyc +0 -0
  59. lumibot/data_sources/data_source_backtesting.py +3 -5
  60. lumibot/data_sources/databento_data.py +5 -5
  61. lumibot/data_sources/databento_data_polars_backtesting.py +636 -0
  62. lumibot/data_sources/databento_data_polars_live.py +793 -0
  63. lumibot/data_sources/pandas_data.py +6 -3
  64. lumibot/data_sources/polars_mixin.py +126 -21
  65. lumibot/data_sources/tradeovate_data.py +80 -0
  66. lumibot/data_sources/tradier_data.py +2 -1
  67. lumibot/entities/__pycache__/__init__.cpython-312.pyc +0 -0
  68. lumibot/entities/__pycache__/asset.cpython-312.pyc +0 -0
  69. lumibot/entities/__pycache__/bar.cpython-312.pyc +0 -0
  70. lumibot/entities/__pycache__/bars.cpython-312.pyc +0 -0
  71. lumibot/entities/__pycache__/chains.cpython-312.pyc +0 -0
  72. lumibot/entities/__pycache__/data.cpython-312.pyc +0 -0
  73. lumibot/entities/__pycache__/dataline.cpython-312.pyc +0 -0
  74. lumibot/entities/__pycache__/order.cpython-312.pyc +0 -0
  75. lumibot/entities/__pycache__/position.cpython-312.pyc +0 -0
  76. lumibot/entities/__pycache__/quote.cpython-312.pyc +0 -0
  77. lumibot/entities/__pycache__/trading_fee.cpython-312.pyc +0 -0
  78. lumibot/entities/asset.py +8 -0
  79. lumibot/entities/order.py +1 -1
  80. lumibot/entities/quote.py +14 -0
  81. lumibot/example_strategies/__pycache__/__init__.cpython-312.pyc +0 -0
  82. lumibot/example_strategies/__pycache__/test_broker_functions.cpython-312-pytest-8.4.1.pyc +0 -0
  83. lumibot/strategies/__pycache__/__init__.cpython-312.pyc +0 -0
  84. lumibot/strategies/__pycache__/_strategy.cpython-312.pyc +0 -0
  85. lumibot/strategies/__pycache__/strategy.cpython-312.pyc +0 -0
  86. lumibot/strategies/__pycache__/strategy_executor.cpython-312.pyc +0 -0
  87. lumibot/strategies/_strategy.py +95 -27
  88. lumibot/strategies/strategy.py +5 -6
  89. lumibot/strategies/strategy_executor.py +2 -2
  90. lumibot/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  91. lumibot/tools/__pycache__/alpaca_helpers.cpython-312.pyc +0 -0
  92. lumibot/tools/__pycache__/bitunix_helpers.cpython-312.pyc +0 -0
  93. lumibot/tools/__pycache__/black_scholes.cpython-312.pyc +0 -0
  94. lumibot/tools/__pycache__/ccxt_data_store.cpython-312.pyc +0 -0
  95. lumibot/tools/__pycache__/databento_helper.cpython-312.pyc +0 -0
  96. lumibot/tools/__pycache__/databento_helper_polars.cpython-312.pyc +0 -0
  97. lumibot/tools/__pycache__/debugers.cpython-312.pyc +0 -0
  98. lumibot/tools/__pycache__/decorators.cpython-312.pyc +0 -0
  99. lumibot/tools/__pycache__/helpers.cpython-312.pyc +0 -0
  100. lumibot/tools/__pycache__/indicators.cpython-312.pyc +0 -0
  101. lumibot/tools/__pycache__/lumibot_logger.cpython-312.pyc +0 -0
  102. lumibot/tools/__pycache__/pandas.cpython-312.pyc +0 -0
  103. lumibot/tools/__pycache__/polygon_helper.cpython-312.pyc +0 -0
  104. lumibot/tools/__pycache__/polygon_helper_async.cpython-312.pyc +0 -0
  105. lumibot/tools/__pycache__/polygon_helper_polars_optimized.cpython-312.pyc +0 -0
  106. lumibot/tools/__pycache__/projectx_helpers.cpython-312.pyc +0 -0
  107. lumibot/tools/__pycache__/schwab_helper.cpython-312.pyc +0 -0
  108. lumibot/tools/__pycache__/thetadata_helper.cpython-312.pyc +0 -0
  109. lumibot/tools/__pycache__/types.cpython-312.pyc +0 -0
  110. lumibot/tools/__pycache__/yahoo_helper.cpython-312.pyc +0 -0
  111. lumibot/tools/__pycache__/yahoo_helper_polars_optimized.cpython-312.pyc +0 -0
  112. lumibot/tools/databento_helper.py +384 -133
  113. lumibot/tools/databento_helper_polars.py +218 -156
  114. lumibot/tools/databento_roll.py +216 -0
  115. lumibot/tools/lumibot_logger.py +32 -17
  116. lumibot/tools/polygon_helper.py +65 -0
  117. lumibot/tools/thetadata_helper.py +588 -70
  118. lumibot/traders/__pycache__/__init__.cpython-312.pyc +0 -0
  119. lumibot/traders/__pycache__/trader.cpython-312.pyc +0 -0
  120. lumibot/traders/trader.py +1 -1
  121. lumibot/trading_builtins/__pycache__/__init__.cpython-312.pyc +0 -0
  122. lumibot/trading_builtins/__pycache__/custom_stream.cpython-312.pyc +0 -0
  123. lumibot/trading_builtins/__pycache__/safe_list.cpython-312.pyc +0 -0
  124. {lumibot-4.0.22.dist-info → lumibot-4.1.0.dist-info}/METADATA +1 -2
  125. {lumibot-4.0.22.dist-info → lumibot-4.1.0.dist-info}/RECORD +164 -46
  126. tests/backtest/check_timing_offset.py +198 -0
  127. tests/backtest/check_volume_spike.py +112 -0
  128. tests/backtest/comprehensive_comparison.py +166 -0
  129. tests/backtest/debug_comparison.py +91 -0
  130. tests/backtest/diagnose_price_difference.py +97 -0
  131. tests/backtest/direct_api_comparison.py +203 -0
  132. tests/backtest/profile_thetadata_vs_polygon.py +255 -0
  133. tests/backtest/root_cause_analysis.py +109 -0
  134. tests/backtest/test_accuracy_verification.py +244 -0
  135. tests/backtest/test_daily_data_timestamp_comparison.py +801 -0
  136. tests/backtest/test_databento.py +57 -0
  137. tests/backtest/test_databento_comprehensive_trading.py +564 -0
  138. tests/backtest/test_debug_avg_fill_price.py +112 -0
  139. tests/backtest/test_dividends.py +8 -3
  140. tests/backtest/test_example_strategies.py +54 -47
  141. tests/backtest/test_futures_edge_cases.py +451 -0
  142. tests/backtest/test_futures_single_trade.py +270 -0
  143. tests/backtest/test_futures_ultra_simple.py +191 -0
  144. tests/backtest/test_index_data_verification.py +348 -0
  145. tests/backtest/test_polygon.py +45 -24
  146. tests/backtest/test_thetadata.py +246 -60
  147. tests/backtest/test_thetadata_comprehensive.py +729 -0
  148. tests/backtest/test_thetadata_vs_polygon.py +557 -0
  149. tests/backtest/test_yahoo.py +1 -2
  150. tests/conftest.py +20 -0
  151. tests/test_backtesting_data_source_env.py +249 -0
  152. tests/test_backtesting_quiet_logs_complete.py +10 -11
  153. tests/test_databento_helper.py +73 -86
  154. tests/test_databento_live.py +10 -10
  155. tests/test_databento_timezone_fixes.py +21 -4
  156. tests/test_get_historical_prices.py +6 -6
  157. tests/test_options_helper.py +162 -40
  158. tests/test_polygon_helper.py +21 -13
  159. tests/test_quiet_logs_requirements.py +5 -5
  160. tests/test_thetadata_helper.py +487 -171
  161. tests/test_yahoo_data.py +125 -0
  162. {lumibot-4.0.22.dist-info → lumibot-4.1.0.dist-info}/LICENSE +0 -0
  163. {lumibot-4.0.22.dist-info → lumibot-4.1.0.dist-info}/WHEEL +0 -0
  164. {lumibot-4.0.22.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.22
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,50 +37,100 @@ 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
36
- lumibot/data_sources/__init__.py,sha256=r25RPPtIMkXvmKFjOnlPRh3gzV0XWPE2t6TMy8Qk2Jc,949
64
+ lumibot/data_sources/__init__.py,sha256=pIU_0Kbucd594EmUQoQC6QpPJA9EUlNwJjTGj9fOzKE,1064
37
65
  lumibot/data_sources/alpaca_data.py,sha256=9pguY470mfgqSFYsB09ujQu9yBnX1Wb5H_ef0d1WzzM,50012
38
66
  lumibot/data_sources/alpha_vantage_data.py,sha256=ypcbMlJEF3r4_rGL_QLRqicG0FRHH9g_D_UR_obRa-8,5040
39
67
  lumibot/data_sources/bitunix_data.py,sha256=H2u4fJVEJqmNrqJnYs1hucZyg4N3dEtCB9JZsEm2am8,8946
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
44
- lumibot/data_sources/databento_data.py,sha256=vJc1H7PBVMVa_0I4LRiguS1Os1wFFPOSEAk-uwTbq28,14185
71
+ lumibot/data_sources/data_source_backtesting.py,sha256=hamqm1uHS34tS7kVslqcJxllHxUS4szgzKTngYsMc4o,8610
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
74
+ lumibot/data_sources/databento_data_polars_backtesting.py,sha256=0YA8O7qe8aTxdFcc9ALhUZSHUJH70PnNG0eK1ZpLZt0,25864
75
+ lumibot/data_sources/databento_data_polars_live.py,sha256=NJc1nHU6P94uUZQWtQ0z5-bi1SRKCkW4-yCFmwZ5FDI,36479
46
76
  lumibot/data_sources/example_broker_data.py,sha256=WkCc3rLyOOI4GzLptUwhqeFRkEWQsM4y3tdzUbHPfik,2066
47
77
  lumibot/data_sources/exceptions.py,sha256=fYS44FgrzyDAuPqZRo3RiZKijjcurcG81HkL2dWURX0,557
48
78
  lumibot/data_sources/interactive_brokers_data.py,sha256=2e0cqOHaveL9XdlZ_N98vehUuoKaHqhV4BelMIScUqQ,13894
49
79
  lumibot/data_sources/interactive_brokers_rest_data.py,sha256=QaODbhFteB4rT-ssTu1nA006bPXu1srYR_Hm1RSWEvQ,45873
50
- lumibot/data_sources/pandas_data.py,sha256=jKZ1wZ6oshngFkcDMI7pB1WniTzv7r08mjY5cZ2U8Qs,20804
51
- 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
52
82
  lumibot/data_sources/polygon_data_polars.py,sha256=fvXeS9kghITbQ0mM8ocyyusAMJmUBArkK-MZrRXnBKs,26952
53
83
  lumibot/data_sources/projectx_data.py,sha256=WXCyPptehR2r3Fg9ou6r9ISNb3p5OaHfqPgVyi6q_Ws,24953
54
84
  lumibot/data_sources/schwab_data.py,sha256=Z4NOcO3UZj8fy7Jp2ZqeE9PyRPj2SNGTjuR7l8nQmlg,29472
55
- 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
56
87
  lumibot/data_sources/tradovate_data.py,sha256=TY1MCXVTqiJTAYKN_5oinFHuvn4q6P5Re1e8brnGpkk,3533
57
88
  lumibot/data_sources/yahoo_data.py,sha256=Po7SCSYA1xIMmvK914IcqrY0NQJHTUxQtde6Nnie1G8,18802
58
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
59
112
  lumibot/entities/__init__.py,sha256=PvY1km9u_HtKXI0f3w1ZooHwMMWqYA8gBeKVapJk4Qg,410
60
- lumibot/entities/asset.py,sha256=8sfKppWPDFZRfrafmCrxVhFH6dMgiRqwekthlr96XVE,29076
113
+ lumibot/entities/asset.py,sha256=_yq8oas_NwkAtbQDDOLVmI9FoqYkT6YKYVZ0aHAXGkk,29547
61
114
  lumibot/entities/bar.py,sha256=_2gFtBzdbNPassLf1SU9J1mYKCZDner2h52qHl8e0oA,6003
62
115
  lumibot/entities/bars.py,sha256=F0DeTVzgrJohvA4yXUvcK8plSukW-LisoWNm9AD2b4c,21270
63
116
  lumibot/entities/chains.py,sha256=4P42AUtoPrRQHnPVj-g6mJ5W2nVf17ju3gXdavZcVyk,6281
64
117
  lumibot/entities/data.py,sha256=4vZDi9owGNX-JctqDn4_XvtH5eoCP7eL3lqapQG7ktk,26856
65
118
  lumibot/entities/dataline.py,sha256=G9XP8K1IvChvHLs5bEfSQLwCaGvWZXe3oEsBwsqysqQ,182
66
- lumibot/entities/order.py,sha256=-WOUx-eOadKMHWhpG8ZXp71maK66NsKoglP270wPoQw,55058
119
+ lumibot/entities/order.py,sha256=XMtMXrN4gqsTOZ5FfDbwpvhyKEKN93wYFukXwZi_fHQ,55046
67
120
  lumibot/entities/position.py,sha256=62jrKGKG2CspLWdZJ3Bo3mJxOFD-sOPKVCPbcvhJw1Q,8994
68
- lumibot/entities/quote.py,sha256=oye2DwO8fqGV8D3ops8HSS0bRT-w-6P2c4EKq4y8KEY,3180
121
+ lumibot/entities/quote.py,sha256=p8FvJfVZhWaZD5aFaslbYnUOgwK2Kbv4l-GLZU7ekAM,3746
69
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
70
134
  lumibot/example_strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
135
  lumibot/example_strategies/bitunix_futures_example.py,sha256=SaOpQ2SQA8K2ZlTkbJ05eZLE8dXdMyXX5M9fyXGmzaI,3006
72
136
  lumibot/example_strategies/ccxt_backtesting_example.py,sha256=e-stFvUcWgjxbT3E1jwvipN7XSXatw1Di27Jj-wV_NU,5549
@@ -90,44 +154,78 @@ lumibot/example_strategies/stock_momentum.py,sha256=ln1qNafk1IwQjeJsFxunJSxiPItF
90
154
  lumibot/example_strategies/stock_oco.py,sha256=Lm-VNDjREPkGfbsVpH7dS2OrIw5g8NL_AcMYXSwzwXU,2482
91
155
  lumibot/example_strategies/strangle.py,sha256=naYiJLcjKu9yb_06WOMAUg8t-mFEo_F0BS62eY-5v20,12838
92
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
93
159
  lumibot/resources/conf.yaml,sha256=rjB9-10JP7saZ_edjX5bQDGfuc3amOQTUUUr-UiMpNA,597
94
160
  lumibot/strategies/__init__.py,sha256=jEZ95K5hG0f595EXYKWwL2_UsnWWk5Pug361PK2My2E,79
95
- lumibot/strategies/_strategy.py,sha256=rjw3kIDh-H5YgStQ0AKw1JHJ2BOipDz5RLf8MrAX8HQ,106235
161
+ lumibot/strategies/_strategy.py,sha256=QCrrZQzTZ0GjsNyNNxHNI3WaNZ98yvxT-E0dbOBETMg,109685
96
162
  lumibot/strategies/session_manager.py,sha256=Nze6UYNSPlCsf-tyHvtFqUeL44WSNHjwsKrIepvsyCY,12956
97
- lumibot/strategies/strategy.py,sha256=yusYRrxYud31n1WFj2vuOYni8Qaxud2OQc6rN1_50XE,169174
98
- 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
99
169
  lumibot/tools/__init__.py,sha256=oRRoK2NBkfnc0kueAfY0HrWVKgzRBO1hlglVMR4jr5M,1501
100
170
  lumibot/tools/alpaca_helpers.py,sha256=nhBS-sv28lZfIQ85szC9El8VHLrCw5a5KbsGOOEjm6w,3147
101
171
  lumibot/tools/bitunix_helpers.py,sha256=-UzrN3w_Y-Ckvhl7ZBoAcx7sgb6tH0KcpVph1Ovm3gw,25780
102
172
  lumibot/tools/black_scholes.py,sha256=TBjJuDTudvqsbwqSb7-zb4gXsJBCStQFaym8xvePAjw,25428
103
173
  lumibot/tools/ccxt_data_store.py,sha256=VXLSs0sWcwjRPZzbuEeVPS-3V6D10YnYMfIyoTPTG0U,21225
104
- lumibot/tools/databento_helper.py,sha256=2BrXvHsJiAoSG2VMWHhVwmmSXf9fHNvK-IvsPz3vBwc,33552
105
- 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
106
177
  lumibot/tools/debugers.py,sha256=ga6npFsS9cpKtTXaygh9t2_txCElg3bfzfeqDBvSL8k,485
107
178
  lumibot/tools/decorators.py,sha256=gokLv6s37C1cnbnFSVOUc4RaVJ5aMTU2C344Vvi3ycs,2275
108
179
  lumibot/tools/futures_symbols.py,sha256=hFV02dk9cKucdaFOQAiQrlS15AJzdZ0qCuzVn7PfoPg,7851
109
180
  lumibot/tools/helpers.py,sha256=Q459K0aQGUME2CfwBCXmKbUQwiGR9FKSjUN2yLbBMIE,17873
110
181
  lumibot/tools/indicators.py,sha256=OnqVMDOFnymbZFobp6Dm8zBzTA4Lt2lZtK8S2ldkAa0,37998
111
- lumibot/tools/lumibot_logger.py,sha256=YoAPUoePS4SaJY8uGe8ZirWtdE0AdY3MrnOnr1Uh7Gg,38628
182
+ lumibot/tools/lumibot_logger.py,sha256=8Crm8XaZx4d4bjprpcR584i4PbqQHqEg2in9sJfiZbU,39267
112
183
  lumibot/tools/lumibot_time.py,sha256=gWgq6CAYds-btXRb5YbqXH2jcgwdH1JhR5roSYgWjbo,1085
113
184
  lumibot/tools/pandas.py,sha256=fRhCbtff5EcXjuhc5gaPSUeZvk9qomVGexAQl8YwgNs,2191
114
- lumibot/tools/polygon_helper.py,sha256=19PctU0cA7WXbGjfkEfuGflfnVYm4S7N2LT4jeLWqcg,36954
185
+ lumibot/tools/polygon_helper.py,sha256=Gw_4pjln-7P4ZzZGESeaJQmoryZHI4oS8flFpOjEROM,40477
115
186
  lumibot/tools/polygon_helper_async.py,sha256=YHDXa9kmkkn8jh7hToY6GP5etyXS9Tj-ukyHZuoDon4,10080
116
187
  lumibot/tools/polygon_helper_polars_optimized.py,sha256=NaIZ-5Av-G2McPEKHyJ-x65W72W_Agnz4lRgvXfQp8c,30415
117
188
  lumibot/tools/projectx_helpers.py,sha256=EIemLfbG923T_RBV_i6s6A9xgs7dt0et0oCnhFwdWfA,58299
118
189
  lumibot/tools/schwab_helper.py,sha256=CXnYhgsXOIb5MgmIYOp86aLxsBF9oeVrMGrjwl_GEv0,11768
119
- lumibot/tools/thetadata_helper.py,sha256=9SPzJbFRsA9g2ITBtehVL3UyGkAh3sAEoHtjySd9LsE,20938
190
+ lumibot/tools/thetadata_helper.py,sha256=mQKTQ_QO97IOetFJLD79NORU2yQpLKe12QwVl7mHUFk,42704
120
191
  lumibot/tools/types.py,sha256=x-aQBeC6ZTN2-pUyxyo69Q0j5e0c_swdfe06kfrWSVc,1978
121
192
  lumibot/tools/yahoo_helper.py,sha256=htcKKkuktatIckVKfLc_ms0X75mXColysQhrZW244z8,19497
122
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
123
216
  lumibot/traders/__init__.py,sha256=JgpSuhNCl1OFoVFTQzQpPOpg6fZ-QbT7-3NsV9Yb89c,27
124
217
  lumibot/traders/debug_log_trader.py,sha256=Kzh0RFg_CthADULLXCLq_PMNrWSpuH2UhQnQBoH3Ybw,364
125
- 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
126
221
  lumibot/trading_builtins/__init__.py,sha256=vH2QL5zLjL3slfEV1YW-BvQHtEYLCFkIWTZDfh3y8LE,87
127
222
  lumibot/trading_builtins/custom_stream.py,sha256=8_XiPT0JzyXrgnXCXoovGGUrWEfnG4ohIYMPfB_Nook,5264
128
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
129
227
  tests/__init__.py,sha256=3-VoT-nAuqMfwufd4ceN6fXaHl_zCfDCSXJOTp1ywYQ,393
130
- tests/conftest.py,sha256=7YzTnECE2oz_TPz3QwlE2nc8o3Msc9dNI56PmgH0p7I,2604
228
+ tests/conftest.py,sha256=UBw_2fx7r6TZPKus2b1Qxrzmd4bg8EEBnX1vCHUuSVA,3311
131
229
  tests/fixtures.py,sha256=wOHQsh1SGHnXe_PGi6kDWI30CS_Righi7Ig7vwSEKT4,9082
132
230
  tests/test_alpaca.py,sha256=VffTh_T04QwMEBUFfxS0ujK1tm5joft4N7972m6mJdM,18607
133
231
  tests/test_alpaca_auth_fix.py,sha256=wkvdxmLs4I-4ys-bOg_hFaC-hDha5aOaQNebr3NxxUQ,5924
@@ -144,9 +242,10 @@ tests/test_backtesting_broker.py,sha256=rxZGH5cgiWLmNGdI3k9fti3Fp9IOSohq8xD2E3L2
144
242
  tests/test_backtesting_broker_await_close.py,sha256=WbehY7E4Qet3_Mo7lpfgjmhtI9pnJPIt9mkFI15Dzho,7545
145
243
  tests/test_backtesting_broker_time_advance.py,sha256=FCv0nKG8BQlEjNft7kmQYm9M2CsLIZ0b7mWCllOHQxc,6378
146
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
147
246
  tests/test_backtesting_flow_control.py,sha256=pBqW-fa-HnZq0apUBltalGMM-vNJ_2A5W2SoJzMK8Mg,7208
148
247
  tests/test_backtesting_multileg_unit.py,sha256=h1DPfVuYXXx-uq6KtUjr6_nasZuXPm_5gFat1XxCKIo,6456
149
- tests/test_backtesting_quiet_logs_complete.py,sha256=-bjRbAWFJ5BlhoqDyhmnAgQdIOybD1Xsxv8AZS6r0k0,14222
248
+ tests/test_backtesting_quiet_logs_complete.py,sha256=x-GfOiqkiUu8pYKCzB0UUacn13Nx_cPRth7_jmPY2Y8,14155
150
249
  tests/test_bars_aggregate_frequency_normalization.py,sha256=F9iPmijhUET2QuVnjuNImomE_NoKm3BDemF_mssZKQQ,1788
151
250
  tests/test_bars_aggregation_timeunits.py,sha256=q4eKz4GacfgoIer-liFuV_yroTaDZ20ttlFKd2ZbCpY,2581
152
251
  tests/test_bars_frequency_flex.py,sha256=eLkkzt2IqGBkaCfcf62WvvlPnLmlXMqP2Is_8RVke8s,3157
@@ -169,12 +268,12 @@ tests/test_databento_auto_expiry_integration.py,sha256=uPAyYTMTzEqppUUZx99G8pvnv
169
268
  tests/test_databento_backtesting.py,sha256=5uGiKxQIY8eYVvgQEO6kA4GWUP4k2MCHi_S5h40gqH8,19150
170
269
  tests/test_databento_backtesting_polars.py,sha256=V9Z7-WG2TNKpHQVF5vGJSIdgUsuhJwlopZV66FREWA0,8097
171
270
  tests/test_databento_data.py,sha256=HakjDileGpicQc_OXeX7l8ncIDn3FtxP8ymKA6TQp8o,18860
172
- tests/test_databento_helper.py,sha256=3z9OLiJdtxDsZmM9tVhzqn4U6wNWKFfTygU_YcRiuhk,44253
173
- tests/test_databento_live.py,sha256=cydmUDbBruhVd-cZxN5uKjWRgXWt-gy4ZlajUfy0QSs,15583
174
- tests/test_databento_timezone_fixes.py,sha256=kJClHKqQ9ZiNd4Bt0ceGx9fMxjVnyR3F9T7jJ66hRQg,10832
271
+ tests/test_databento_helper.py,sha256=vM_zgxITXXfzMlZwoS9vnJvoOqcrVv2ZdnRKjVxergY,43522
272
+ tests/test_databento_live.py,sha256=tbg2C9cyW45OYY7dKYlPMNZpgsN_sjs4yk1GR23OL6o,15648
273
+ tests/test_databento_timezone_fixes.py,sha256=NsfND7yTdKH2ddiYYhO6kU3m41V7se7C4_zTvqKOGv0,11562
175
274
  tests/test_drift_rebalancer.py,sha256=AUuEd3WIunfx3gwVdLVtq8jOHlz65UeqpO4adY1xfcs,105289
176
275
  tests/test_futures_integration.py,sha256=3Ut0M8d5xPwHd4WcTSmP4HLC7VG_xSUXeJPX0-c0Fe8,9179
177
- tests/test_get_historical_prices.py,sha256=ygHW_cUu6f-HYmkYt9j4kDjsQP5iRjopP_PPw2E60rw,15540
276
+ tests/test_get_historical_prices.py,sha256=0JGlFuDyQFltKRpaFp2CLKEyleD2xMmgINVzLjrTdl8,15540
178
277
  tests/test_helpers.py,sha256=8Ay1B6I8yn3trZKrYjOs6Kbda7jmM20-TFh8LfIWpmY,11659
179
278
  tests/test_indicator_subplots.py,sha256=5gD5EX4KbGGk9FPwkT4m230U2nkgAT6t5nbgVo-2idc,10333
180
279
  tests/test_integration_tests.py,sha256=FJhWEJNF0OM6fAIsADnzB7EX61EvNiZBXH2Afmnd888,3071
@@ -186,12 +285,12 @@ tests/test_lumibot_logger.py,sha256=76e5yl86NWk4OYtM_be-7yaHnPA-1bO2rBNH-piX8Dk,
186
285
  tests/test_market_infinite_loop_bug.py,sha256=x9O5la9FgSyeza9V6QPUoY24BeZfGySYsioqWqDUYSo,13715
187
286
  tests/test_mes_symbols.py,sha256=Av5AM-pogp1STfWZ4A3bA2NmbaA3E9b0Dg449mfk-Ss,3106
188
287
  tests/test_momentum.py,sha256=oakKjgnz5pNQkw0CagbbKKSux0HkOxP_iLW8-Yk0XOo,8492
189
- tests/test_options_helper.py,sha256=c0_KYo9TvI4nDcagODc9P0rgXlJl0YtE8i6DHJw6ZqU,22066
288
+ tests/test_options_helper.py,sha256=NizH8E9ZnzVWsShsHp5X6qBE8FWJ3sS2eE9bCko7y9U,27352
190
289
  tests/test_options_helper_enhancements.py,sha256=3Ei-vy9IQfg1AnlBqofLNc-kuiQ64vouhJyIuVj3KIg,7324
191
290
  tests/test_order.py,sha256=qN_sqsItl8L-WqSQTF0PUN0s2nxm4HKYOA6gYQ6EBJA,12110
192
291
  tests/test_order_serialization.py,sha256=zcX5fgcYeo0jm6dlIQnUfuH56svTnKRFPtYCSI7xCJw,3710
193
292
  tests/test_pandas_data.py,sha256=VCDhPwAuOO6twR8a5B8dmBv3wfnOENw_1Pxr9N3x9iQ,2098
194
- tests/test_polygon_helper.py,sha256=YlT_neLx8g-qdWvgaFRSSJRsS8qbrNgBBKMllV17AUE,25520
293
+ tests/test_polygon_helper.py,sha256=JQCRHYgdiEzZQS_8j5kChg77S-xBpLQU6ZFN73Kfz4g,26230
195
294
  tests/test_position_serialization.py,sha256=QtBPKnGdmULLT_hKrfFzvbWWG3kfqWPW-Jv_r3theuM,4293
196
295
  tests/test_projectx.py,sha256=jyyX9ZEOCiF557MzG1sGQYk-v6JZYZ-LVIkLlURhMhQ,18327
197
296
  tests/test_projectx_bracket_helpers.py,sha256=Lnt-qA_6H0JcHeQaR5XNuc0O7uUCggksvYdIa3RVFEs,5554
@@ -208,35 +307,54 @@ tests/test_projectx_url_mappings.py,sha256=1E0xZe_cZtGiU-fPIfohbvsrrPjawkblR8F2M
208
307
  tests/test_quiet_logs_buy_and_hold.py,sha256=GjXGeHBcNrRJoHGWLuc_LkrzcpNVzshiiBkQACczIxI,2681
209
308
  tests/test_quiet_logs_comprehensive.py,sha256=QVkZWLAUnPEb04Ec8qKXvLzdDUkp8alez2mU_Y1Umm0,6068
210
309
  tests/test_quiet_logs_functionality.py,sha256=MlOBUICuTy1OXCDifOW05uD7hjnZRsQ2xxQlcLkGebQ,3811
211
- tests/test_quiet_logs_requirements.py,sha256=Dw147gq10HdP2pO9lnxIay-JrhpgXIMr9w9KAK20XGU,7893
310
+ tests/test_quiet_logs_requirements.py,sha256=YoUooSVLrFL8TlWPfxEiqxvSj4d8z6-qg58ja4dtOc0,7856
212
311
  tests/test_session_manager.py,sha256=1qygN3aQ2Xe2uh4BMPm0E3V8KXLFNGq5qdL8KkZjef4,11632
213
312
  tests/test_strategy_methods.py,sha256=j9Mhr6nnG1fkiVQXnx7gLjzGbeQmwt0UbJr_4plD36o,12539
214
- tests/test_thetadata_helper.py,sha256=4AshRKdpjnpvTb2zX2Bgq3oK0Y258WS57vDxEp2RiH0,37232
313
+ tests/test_thetadata_helper.py,sha256=fFLUfLlucUzHc4zAFY84lwWYZ-U79moU-a8z3rkRzcI,50631
215
314
  tests/test_tradier.py,sha256=iCEM2FTxJSzJ2oLNaRqSx05XaX_DCiMzLx1aEYPANko,33280
216
315
  tests/test_tradier_data.py,sha256=1jTxDzQtzaC42CQJVXMRMElBwExy1mVci3NFfKjjVH0,13363
217
316
  tests/test_tradingfee.py,sha256=2CBJgdU-73Ae4xuys-QkbCtpDTL9hwOUkRnCgLm4OmE,163
218
317
  tests/test_tradovate.py,sha256=XW0ZyiMbRYr16hqGJIa8C1Wg5O0V0tpiUMHvejIAnEg,37436
219
318
  tests/test_unified_logger.py,sha256=Y2rhLk6GoUs9Vj-qRvGThRUTdNohxmH2yFbb3j8Yq3g,10849
220
319
  tests/test_vix_helper.py,sha256=jE6TZ4ufVU_0W4Jx3zJ295srsy4Xjw9qU3KwfujjZ_s,8476
320
+ tests/test_yahoo_data.py,sha256=84R2jCl9z2U5qKZhR68tFJou2Rfwno0Qomc8yxPfvAs,4578
221
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
222
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
223
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
224
333
  tests/backtest/test_backtesting_broker_processing.py,sha256=JbTKZvcMq3l4AgIGhsvVWvhw3_NXQwql2ImztNKbziw,22145
225
334
  tests/backtest/test_buy_hold_quiet_logs_full_run.py,sha256=LDiR8wsEwIASPnO_bUMide6re0Jb-rzFG3hccD9OGJM,4998
226
335
  tests/backtest/test_crypto_cash_regressions.py,sha256=-f0wjb-9nXpggS30N4zomYl098Qu-tfvfWwhlkoxPMM,6077
227
- tests/backtest/test_databento.py,sha256=n4ScdvgOxinuTBIU9ptEIgNem8qcbQOObKvHILb--50,5382
228
- tests/backtest/test_dividends.py,sha256=fYSpzAf13AMpfxmxyFTfvUGPAGkbUTWL_gUYQUrqkbU,9815
229
- 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
230
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
231
347
  tests/backtest/test_multileg_backtest.py,sha256=XqvwMtyvlo59ZV3yqnZZ_nC_9cqnLozS4MRtKdFFY-U,4981
232
348
  tests/backtest/test_pandas_backtest.py,sha256=GSkhMY4wK1pFDe1Hscu7YxZG36RGdM1PtkLeq7u0caI,5433
233
349
  tests/backtest/test_passing_trader_into_backtest.py,sha256=KttDS3x1Dv686GBWjt520v_ampK2MIUyPfzl7HLVlwE,3163
234
- tests/backtest/test_polygon.py,sha256=bKrI5C3Gel1nsZfSR4tqdONMpEDNBDy1Q2If7wLclDU,24976
350
+ tests/backtest/test_polygon.py,sha256=-KMvCX8bioSm-2QrNDPBo8Ff0geHkdBLeOl6i5wFlWc,26095
235
351
  tests/backtest/test_strategy_executor.py,sha256=r-QNPCNJnisxQyIAxPGO-BQ-l3qtZMChOUWCVX-b4ls,1289
236
- tests/backtest/test_thetadata.py,sha256=-76X2QpPCt-EXkOYeTlFIOr_UBBGPel0B-r_F84hl5g,16838
237
- tests/backtest/test_yahoo.py,sha256=FolIqwsPlAOyAr2fjw4TKp_dAzBLT-KMLNcJa1ej4RE,2011
238
- lumibot-4.0.22.dist-info/LICENSE,sha256=fYhGIyxjyNXACgpNQS3xxpxDOaVOWRVxZMCRbsDv8k0,35130
239
- lumibot-4.0.22.dist-info/METADATA,sha256=t0RWKH2s87LWbJTFyQXvXtqwgrfgxAgVPw7tAmCMPfk,11519
240
- lumibot-4.0.22.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
241
- lumibot-4.0.22.dist-info/top_level.txt,sha256=otUnUjDFVASauEDiTiAzNgMyqQ1B6jjS3QqqP-WSx38,14
242
- lumibot-4.0.22.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()