investing-algorithm-framework 1.5__py3-none-any.whl → 7.25.6__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.
Files changed (276) hide show
  1. investing_algorithm_framework/__init__.py +192 -16
  2. investing_algorithm_framework/analysis/__init__.py +16 -0
  3. investing_algorithm_framework/analysis/backtest_data_ranges.py +202 -0
  4. investing_algorithm_framework/analysis/data.py +170 -0
  5. investing_algorithm_framework/analysis/markdown.py +91 -0
  6. investing_algorithm_framework/analysis/ranking.py +298 -0
  7. investing_algorithm_framework/app/__init__.py +29 -4
  8. investing_algorithm_framework/app/algorithm/__init__.py +7 -0
  9. investing_algorithm_framework/app/algorithm/algorithm.py +193 -0
  10. investing_algorithm_framework/app/algorithm/algorithm_factory.py +118 -0
  11. investing_algorithm_framework/app/app.py +2220 -379
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1724 -0
  14. investing_algorithm_framework/app/eventloop.py +620 -0
  15. investing_algorithm_framework/app/reporting/__init__.py +27 -0
  16. investing_algorithm_framework/app/reporting/ascii.py +921 -0
  17. investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
  18. investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
  19. investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
  20. investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
  21. investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
  22. investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  23. investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
  24. investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
  25. investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
  26. investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
  27. investing_algorithm_framework/app/reporting/generate.py +185 -0
  28. investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
  29. investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
  30. investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
  31. investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
  32. investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
  33. investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
  34. investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
  35. investing_algorithm_framework/app/stateless/action_handlers/__init__.py +6 -3
  36. investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
  37. investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +2 -1
  38. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
  39. investing_algorithm_framework/app/strategy.py +867 -60
  40. investing_algorithm_framework/app/task.py +5 -3
  41. investing_algorithm_framework/app/web/__init__.py +2 -1
  42. investing_algorithm_framework/app/web/controllers/__init__.py +2 -2
  43. investing_algorithm_framework/app/web/controllers/orders.py +3 -2
  44. investing_algorithm_framework/app/web/controllers/positions.py +2 -2
  45. investing_algorithm_framework/app/web/create_app.py +4 -2
  46. investing_algorithm_framework/app/web/schemas/position.py +1 -0
  47. investing_algorithm_framework/cli/__init__.py +0 -0
  48. investing_algorithm_framework/cli/cli.py +231 -0
  49. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
  50. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  51. investing_algorithm_framework/cli/initialize_app.py +603 -0
  52. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  53. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  54. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  55. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  56. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  57. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  58. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  59. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  60. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  61. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  62. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  63. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  64. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  65. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  66. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  67. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  68. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  69. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  70. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  71. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  72. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  73. investing_algorithm_framework/cli/validate_backtest_checkpoints.py +197 -0
  74. investing_algorithm_framework/create_app.py +40 -7
  75. investing_algorithm_framework/dependency_container.py +100 -47
  76. investing_algorithm_framework/domain/__init__.py +97 -30
  77. investing_algorithm_framework/domain/algorithm_id.py +69 -0
  78. investing_algorithm_framework/domain/backtesting/__init__.py +25 -0
  79. investing_algorithm_framework/domain/backtesting/backtest.py +548 -0
  80. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +113 -0
  81. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +241 -0
  82. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +470 -0
  83. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  84. investing_algorithm_framework/domain/backtesting/backtest_run.py +663 -0
  85. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  86. investing_algorithm_framework/domain/backtesting/backtest_utils.py +198 -0
  87. investing_algorithm_framework/domain/backtesting/combine_backtests.py +392 -0
  88. investing_algorithm_framework/domain/config.py +59 -136
  89. investing_algorithm_framework/domain/constants.py +18 -37
  90. investing_algorithm_framework/domain/data_provider.py +334 -0
  91. investing_algorithm_framework/domain/data_structures.py +42 -0
  92. investing_algorithm_framework/domain/exceptions.py +51 -1
  93. investing_algorithm_framework/domain/models/__init__.py +26 -19
  94. investing_algorithm_framework/domain/models/app_mode.py +34 -0
  95. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  96. investing_algorithm_framework/domain/models/data/data_source.py +222 -0
  97. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  98. investing_algorithm_framework/domain/models/event.py +35 -0
  99. investing_algorithm_framework/domain/models/market/__init__.py +5 -0
  100. investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
  101. investing_algorithm_framework/domain/models/order/__init__.py +3 -4
  102. investing_algorithm_framework/domain/models/order/order.py +198 -65
  103. investing_algorithm_framework/domain/models/order/order_status.py +2 -2
  104. investing_algorithm_framework/domain/models/order/order_type.py +1 -3
  105. investing_algorithm_framework/domain/models/portfolio/__init__.py +6 -2
  106. investing_algorithm_framework/domain/models/portfolio/portfolio.py +98 -3
  107. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +37 -43
  108. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +108 -11
  109. investing_algorithm_framework/domain/models/position/__init__.py +2 -1
  110. investing_algorithm_framework/domain/models/position/position.py +20 -0
  111. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  112. investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -2
  113. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  114. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  115. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
  116. investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
  117. investing_algorithm_framework/domain/models/strategy_profile.py +19 -141
  118. investing_algorithm_framework/domain/models/time_frame.py +94 -98
  119. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  120. investing_algorithm_framework/domain/models/time_unit.py +66 -2
  121. investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  122. investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
  123. investing_algorithm_framework/domain/models/trade/__init__.py +11 -0
  124. investing_algorithm_framework/domain/models/trade/trade.py +389 -0
  125. investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
  126. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
  127. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
  128. investing_algorithm_framework/domain/order_executor.py +112 -0
  129. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  130. investing_algorithm_framework/domain/services/__init__.py +11 -0
  131. investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
  132. investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
  133. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
  134. investing_algorithm_framework/domain/services/rounding_service.py +27 -0
  135. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  136. investing_algorithm_framework/domain/strategy.py +1 -29
  137. investing_algorithm_framework/domain/utils/__init__.py +15 -5
  138. investing_algorithm_framework/domain/utils/csv.py +22 -0
  139. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  140. investing_algorithm_framework/domain/utils/dates.py +57 -0
  141. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  142. investing_algorithm_framework/domain/utils/polars.py +53 -0
  143. investing_algorithm_framework/domain/utils/random.py +29 -0
  144. investing_algorithm_framework/download_data.py +244 -0
  145. investing_algorithm_framework/infrastructure/__init__.py +37 -11
  146. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  147. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1152 -0
  148. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  149. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  150. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  151. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +86 -12
  152. investing_algorithm_framework/infrastructure/models/__init__.py +7 -3
  153. investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -2
  154. investing_algorithm_framework/infrastructure/models/order/order.py +53 -53
  155. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  156. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  157. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +1 -1
  158. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +8 -2
  159. investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +17 -6
  160. investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +3 -1
  161. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  162. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  163. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
  164. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
  165. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  166. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  167. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  168. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  169. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  170. investing_algorithm_framework/infrastructure/repositories/__init__.py +10 -4
  171. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  172. investing_algorithm_framework/infrastructure/repositories/order_repository.py +16 -5
  173. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +2 -2
  174. investing_algorithm_framework/infrastructure/repositories/position_repository.py +11 -0
  175. investing_algorithm_framework/infrastructure/repositories/repository.py +84 -30
  176. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  177. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
  178. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
  179. investing_algorithm_framework/infrastructure/services/__init__.py +9 -4
  180. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  181. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +193 -0
  182. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  183. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  184. investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +9 -0
  185. investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +2596 -0
  186. investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +285 -0
  187. investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +468 -0
  188. investing_algorithm_framework/services/__init__.py +123 -15
  189. investing_algorithm_framework/services/configuration_service.py +77 -11
  190. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  191. investing_algorithm_framework/services/data_providers/data_provider_service.py +1058 -0
  192. investing_algorithm_framework/services/market_credential_service.py +40 -0
  193. investing_algorithm_framework/services/metrics/__init__.py +119 -0
  194. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  195. investing_algorithm_framework/services/metrics/beta.py +0 -0
  196. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  197. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  198. investing_algorithm_framework/services/metrics/drawdown.py +218 -0
  199. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  200. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  201. investing_algorithm_framework/services/metrics/generate.py +358 -0
  202. investing_algorithm_framework/services/metrics/mean_daily_return.py +84 -0
  203. investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
  204. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  205. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  206. investing_algorithm_framework/services/metrics/returns.py +452 -0
  207. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  208. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  209. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  210. investing_algorithm_framework/services/metrics/standard_deviation.py +156 -0
  211. investing_algorithm_framework/services/metrics/trades.py +473 -0
  212. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  213. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  214. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  215. investing_algorithm_framework/services/metrics/volatility.py +118 -0
  216. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  217. investing_algorithm_framework/services/order_service/__init__.py +9 -0
  218. investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
  219. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  220. investing_algorithm_framework/services/order_service/order_service.py +826 -0
  221. investing_algorithm_framework/services/portfolios/__init__.py +16 -0
  222. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
  223. investing_algorithm_framework/services/{portfolio_configuration_service.py → portfolios/portfolio_configuration_service.py} +27 -12
  224. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  225. investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
  226. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
  227. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
  228. investing_algorithm_framework/services/positions/__init__.py +7 -0
  229. investing_algorithm_framework/services/positions/position_service.py +210 -0
  230. investing_algorithm_framework/services/repository_service.py +8 -2
  231. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  232. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +117 -0
  233. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  234. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  235. investing_algorithm_framework/services/trade_service/__init__.py +9 -0
  236. investing_algorithm_framework/services/trade_service/trade_service.py +1099 -0
  237. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  238. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  239. investing_algorithm_framework-7.25.6.dist-info/METADATA +535 -0
  240. investing_algorithm_framework-7.25.6.dist-info/RECORD +268 -0
  241. {investing_algorithm_framework-1.5.dist-info → investing_algorithm_framework-7.25.6.dist-info}/WHEEL +1 -2
  242. investing_algorithm_framework-7.25.6.dist-info/entry_points.txt +3 -0
  243. investing_algorithm_framework/app/algorithm.py +0 -630
  244. investing_algorithm_framework/domain/models/backtest_profile.py +0 -414
  245. investing_algorithm_framework/domain/models/market_data/__init__.py +0 -11
  246. investing_algorithm_framework/domain/models/market_data/asset_price.py +0 -50
  247. investing_algorithm_framework/domain/models/market_data/ohlcv.py +0 -105
  248. investing_algorithm_framework/domain/models/market_data/order_book.py +0 -63
  249. investing_algorithm_framework/domain/models/market_data/ticker.py +0 -92
  250. investing_algorithm_framework/domain/models/order/order_fee.py +0 -45
  251. investing_algorithm_framework/domain/models/trade.py +0 -78
  252. investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
  253. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -223
  254. investing_algorithm_framework/domain/singleton.py +0 -9
  255. investing_algorithm_framework/domain/utils/backtesting.py +0 -82
  256. investing_algorithm_framework/infrastructure/models/order/order_fee.py +0 -21
  257. investing_algorithm_framework/infrastructure/repositories/order_fee_repository.py +0 -15
  258. investing_algorithm_framework/infrastructure/services/market_backtest_service.py +0 -360
  259. investing_algorithm_framework/infrastructure/services/market_service.py +0 -410
  260. investing_algorithm_framework/infrastructure/services/performance_service.py +0 -192
  261. investing_algorithm_framework/services/backtest_service.py +0 -268
  262. investing_algorithm_framework/services/market_data_service.py +0 -77
  263. investing_algorithm_framework/services/order_backtest_service.py +0 -122
  264. investing_algorithm_framework/services/order_service.py +0 -752
  265. investing_algorithm_framework/services/portfolio_service.py +0 -164
  266. investing_algorithm_framework/services/portfolio_snapshot_service.py +0 -68
  267. investing_algorithm_framework/services/position_cost_service.py +0 -5
  268. investing_algorithm_framework/services/position_service.py +0 -63
  269. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -225
  270. investing_algorithm_framework-1.5.dist-info/AUTHORS.md +0 -8
  271. investing_algorithm_framework-1.5.dist-info/METADATA +0 -230
  272. investing_algorithm_framework-1.5.dist-info/RECORD +0 -119
  273. investing_algorithm_framework-1.5.dist-info/top_level.txt +0 -1
  274. /investing_algorithm_framework/{infrastructure/services/performance_backtest_service.py → app/reporting/tables/stop_loss_table.py} +0 -0
  275. /investing_algorithm_framework/services/{position_snapshot_service.py → positions/position_snapshot_service.py} +0 -0
  276. {investing_algorithm_framework-1.5.dist-info → investing_algorithm_framework-7.25.6.dist-info}/LICENSE +0 -0
@@ -1,414 +0,0 @@
1
- from .base_model import BaseModel
2
- from .time_unit import TimeUnit
3
-
4
-
5
- class BacktestPosition(BaseModel):
6
-
7
- def __init__(self, position, trading_symbol=False):
8
- self.symbol = position.symbol
9
- self.amount = position.amount
10
- self._cost = position.cost
11
- self._price = 0.0
12
- self._trading_symbol = trading_symbol
13
-
14
- @property
15
- def price(self):
16
- return self._price
17
-
18
- @price.setter
19
- def price(self, value):
20
- self._price = value
21
-
22
- @property
23
- def cost(self):
24
-
25
- if self._trading_symbol:
26
- return self.amount
27
-
28
- return self._cost
29
-
30
- @property
31
- def value(self):
32
-
33
- if self._trading_symbol:
34
- return self.amount
35
-
36
- return self._price * self.amount
37
-
38
- @property
39
- def growth(self):
40
-
41
- if self._trading_symbol:
42
- return 0.0
43
-
44
- return self.value - self.cost
45
-
46
- @property
47
- def growth_rate(self):
48
-
49
- if self._trading_symbol:
50
- return 0.0
51
-
52
- if self.cost == 0:
53
- return 0.0
54
-
55
- return self.growth / self.cost * 100
56
-
57
-
58
- class BacktestProfile(BaseModel):
59
-
60
- def __init__(
61
- self,
62
- portfolio_id=None,
63
- initial_unallocated=0.0,
64
- interval=None,
65
- time_unit=None,
66
- backtest_start_date_data=None,
67
- backtest_data_index_date=None,
68
- backtest_start_date=None,
69
- backtest_end_date=None,
70
- backtest_index_date=None,
71
- trading_time_frame=None,
72
- trading_time_frame_start_date=None,
73
- symbols=None,
74
- market=None,
75
- number_of_days=0,
76
- number_of_orders=0,
77
- number_of_positions=0,
78
- market_data_file=None,
79
- number_of_trades_closed=0,
80
- number_of_trades_open=0,
81
- percentage_positive_trades=0.0,
82
- percentage_negative_trades=0.0,
83
- total_cost=0.0,
84
- trading_symbol=None,
85
- total_net_gain_percentage=0.0,
86
- total_net_gain=0,
87
- growth_rate=0.0,
88
- growth=0,
89
- total_value=0.0,
90
- positions=None,
91
- average_trade_duration=0,
92
- average_trade_size=0.0,
93
- trades=None
94
- ):
95
- self._portfolio_id = portfolio_id
96
- self._interval = interval
97
- self._time_unit = time_unit
98
- self._backtest_start_date_data = backtest_start_date_data
99
- self._backtest_start_date = backtest_start_date
100
- self._backtest_end_date = backtest_end_date
101
- self._backtest_index_date = backtest_index_date
102
- self._number_of_runs = 0
103
- self._trading_time_frame = trading_time_frame
104
- self._trading_time_frame_start_date = trading_time_frame_start_date
105
- self._symbols = symbols
106
- self._market = market
107
- self._number_of_days = number_of_days
108
- self._number_of_orders = number_of_orders
109
- self._number_of_positions = number_of_positions
110
- self._market_data_file = market_data_file
111
- self._percentage_positive_trades = percentage_positive_trades
112
- self._percentage_negative_trades = percentage_negative_trades
113
- self._number_of_trades_closed = number_of_trades_closed
114
- self._number_of_trades_open = number_of_trades_open
115
- self._total_cost = total_cost
116
- self._growth_rate = 0.0
117
- self._growth = 0.0
118
- self._initial_unallocated = initial_unallocated
119
- self._trading_symbol = trading_symbol
120
- self._total_net_gain_percentage = total_net_gain_percentage
121
- self._total_net_gain = total_net_gain
122
- self._backtest_data_index_date = backtest_data_index_date
123
- self._growth_rate = growth_rate
124
- self._growth = growth
125
- self._total_value = total_value
126
- self.positions = positions
127
- self._average_trade_duration = average_trade_duration
128
- self._average_trade_size = average_trade_size
129
- self._trades = trades
130
-
131
- @property
132
- def portfolio_id(self):
133
- return self._portfolio_id
134
-
135
- @portfolio_id.setter
136
- def portfolio_id(self, portfolio_id):
137
- self._portfolio_id = portfolio_id
138
-
139
- @property
140
- def interval(self):
141
- return self._interval
142
-
143
- @interval.setter
144
- def interval(self, value):
145
- self._interval = value
146
-
147
- @property
148
- def time_unit(self):
149
- return self._time_unit
150
-
151
- @time_unit.setter
152
- def time_unit(self, value):
153
- self._time_unit = value
154
-
155
- @property
156
- def symbols(self):
157
- return self._symbols
158
-
159
- @property
160
- def backtest_start_date_data(self):
161
- return self._backtest_start_date_data
162
-
163
- @property
164
- def backtest_start_date(self):
165
- return self._backtest_start_date
166
-
167
- @property
168
- def backtest_end_date(self):
169
- return self._backtest_end_date
170
-
171
- @property
172
- def backtest_index_date(self):
173
- return self._backtest_index_date
174
-
175
- @property
176
- def trading_time_frame(self):
177
- return self._trading_time_frame
178
-
179
- @property
180
- def trading_time_frame_start_date(self):
181
- return self._trading_time_frame_start_date
182
-
183
- @property
184
- def number_of_runs(self):
185
- return self._number_of_runs
186
-
187
- @property
188
- def market(self):
189
- return self._market
190
-
191
- @property
192
- def number_of_days(self):
193
- return self._number_of_days
194
-
195
- @symbols.setter
196
- def symbols(self, value):
197
- self._symbols = value
198
-
199
- @market.setter
200
- def market(self, value):
201
- self._market = value
202
-
203
- @backtest_start_date.setter
204
- def backtest_start_date(self, value):
205
- self._backtest_start_date = value
206
-
207
- @backtest_start_date_data.setter
208
- def backtest_start_date_data(self, value):
209
- self._backtest_start_date_data = value
210
-
211
- @backtest_end_date.setter
212
- def backtest_end_date(self, value):
213
- self._backtest_end_date = value
214
-
215
- @backtest_index_date.setter
216
- def backtest_index_date(self, value):
217
- self._backtest_index_date = value
218
-
219
- @number_of_runs.setter
220
- def number_of_runs(self, value):
221
- self._number_of_runs = value
222
-
223
- @trading_time_frame.setter
224
- def trading_time_frame(self, value):
225
- self._trading_time_frame = value
226
-
227
- @trading_time_frame_start_date.setter
228
- def trading_time_frame_start_date(self, value):
229
- self._trading_time_frame_start_date = value
230
-
231
- @number_of_days.setter
232
- def number_of_days(self, value):
233
- self._number_of_days = value
234
-
235
- @property
236
- def number_of_orders(self):
237
- return self._number_of_orders
238
-
239
- @number_of_orders.setter
240
- def number_of_orders(self, value):
241
- self._number_of_orders = value
242
-
243
- @property
244
- def number_of_positions(self):
245
- return self._number_of_positions
246
-
247
- @number_of_positions.setter
248
- def number_of_positions(self, value):
249
- self._number_of_positions = value
250
-
251
- @property
252
- def backtest_data_index_date(self):
253
- return self._backtest_data_index_date
254
-
255
- @backtest_data_index_date.setter
256
- def backtest_data_index_date(self, value):
257
- self._backtest_data_index_date = value
258
-
259
- @property
260
- def market_data_file(self):
261
- return self._market_data_file
262
-
263
- @market_data_file.setter
264
- def market_data_file(self, value):
265
- self._market_data_file = value
266
-
267
- @property
268
- def percentage_positive_trades(self):
269
- return self._percentage_positive_trades
270
-
271
- @percentage_positive_trades.setter
272
- def percentage_positive_trades(self, value):
273
- self._percentage_positive_trades = value
274
-
275
- @property
276
- def percentage_negative_trades(self):
277
- return self._percentage_negative_trades
278
-
279
- @percentage_negative_trades.setter
280
- def percentage_negative_trades(self, value):
281
- self._percentage_negative_trades = value
282
-
283
- @property
284
- def number_of_trades_closed(self):
285
- return self._number_of_trades_closed
286
-
287
- @number_of_trades_closed.setter
288
- def number_of_trades_closed(self, value):
289
- self._number_of_trades_closed = value
290
-
291
- @property
292
- def number_of_trades_open(self):
293
- return self._number_of_trades_open
294
-
295
- @number_of_trades_open.setter
296
- def number_of_trades_open(self, value):
297
- self._number_of_trades_open = value
298
-
299
- @property
300
- def total_cost(self):
301
- return self._total_cost
302
-
303
- @total_cost.setter
304
- def total_cost(self, value):
305
- self._total_cost = value
306
-
307
- @property
308
- def growth_rate(self):
309
- return self._growth_rate
310
-
311
- @growth_rate.setter
312
- def growth_rate(self, value):
313
- self._growth_rate = value
314
-
315
- @property
316
- def growth(self):
317
- return self._growth
318
-
319
- @growth.setter
320
- def growth(self, value):
321
- self._growth = value
322
-
323
- @property
324
- def initial_unallocated(self):
325
- return self._initial_unallocated
326
-
327
- @initial_unallocated.setter
328
- def initial_unallocated(self, value):
329
- self._initial_unallocated = value
330
-
331
- @property
332
- def trading_symbol(self):
333
- return self._trading_symbol
334
-
335
- @trading_symbol.setter
336
- def trading_symbol(self, value):
337
- self._trading_symbol = value
338
-
339
- @property
340
- def total_net_gain_percentage(self):
341
- return self._total_net_gain_percentage
342
-
343
- @total_net_gain_percentage.setter
344
- def total_net_gain_percentage(self, value):
345
- self._total_net_gain_percentage = value
346
-
347
- @property
348
- def total_net_gain(self):
349
- return self._total_net_gain
350
-
351
- @total_net_gain.setter
352
- def total_net_gain(self, value):
353
- self._total_net_gain = value
354
-
355
- @property
356
- def total_value(self):
357
- return self._total_value
358
-
359
- @total_value.setter
360
- def total_value(self, value):
361
- self._total_value = value
362
-
363
- @property
364
- def positions(self):
365
- return self._positions
366
-
367
- @positions.setter
368
- def positions(self, value):
369
- self._positions = value
370
-
371
- @property
372
- def average_trade_duration(self):
373
- return self._average_trade_duration
374
-
375
- @average_trade_duration.setter
376
- def average_trade_duration(self, value):
377
- self._average_trade_duration = value
378
-
379
- @property
380
- def average_trade_size(self):
381
- return self._average_trade_size
382
-
383
- @average_trade_size.setter
384
- def average_trade_size(self, value):
385
- self._average_trade_size = value
386
-
387
- @property
388
- def trades(self):
389
- return self._trades
390
-
391
- @trades.setter
392
- def trades(self, value):
393
- self._trades = value
394
-
395
- def get_runs_per_day(self):
396
-
397
- if self.time_unit is None:
398
- return 0
399
- elif TimeUnit.SECOND.equals(self.time_unit):
400
- return 86400 / self.interval
401
- elif TimeUnit.MINUTE.equals(self.time_unit):
402
- return 1440 / self.interval
403
- else:
404
- return 24 / self.interval
405
-
406
- def __repr__(self):
407
- return self.repr(
408
- start_date=self.backtest_start_date,
409
- end_date=self.backtest_end_date,
410
- backtest_index_date=self.backtest_index_date,
411
- start_date_data=self.backtest_start_date_data,
412
- time_unit=self.time_unit,
413
- interval=self.interval
414
- )
@@ -1,11 +0,0 @@
1
- from .order_book import OrderBook
2
- from .ticker import Ticker
3
- from .ohlcv import OHLCV
4
- from .asset_price import AssetPrice
5
-
6
- __all__ = [
7
- "Ticker",
8
- "OrderBook",
9
- "OHLCV",
10
- "AssetPrice"
11
- ]
@@ -1,50 +0,0 @@
1
- from datetime import datetime
2
-
3
-
4
- class AssetPrice:
5
-
6
- def __init__(self, symbol, price, datetime):
7
- self.symbol = symbol
8
- self.price = price
9
- self.datetime = datetime
10
-
11
- def get_symbol(self):
12
- return self.symbol
13
-
14
- def get_price(self):
15
-
16
- if self.price is None:
17
- return 0
18
-
19
- return self.price
20
-
21
- def get_datetime(self):
22
-
23
- if self.datetime is None:
24
- return datetime.utcnow()
25
-
26
- return self.datetime
27
-
28
- def repr(self, **fields) -> str:
29
- """
30
- Helper for __repr__
31
- """
32
-
33
- field_strings = []
34
- at_least_one_attached_attribute = False
35
-
36
- for key, field in fields.items():
37
- field_strings.append(f'{key}={field!r}')
38
- at_least_one_attached_attribute = True
39
-
40
- if at_least_one_attached_attribute:
41
- return f"<{self.__class__.__name__}({','.join(field_strings)})>"
42
-
43
- return f"<{self.__class__.__name__} {id(self)}>"
44
-
45
- def __repr__(self):
46
- return self.repr(
47
- symbol=self.get_symbol(),
48
- price=self.price,
49
- datetime=self.datetime
50
- )
@@ -1,105 +0,0 @@
1
- from datetime import datetime
2
- from investing_algorithm_framework.domain.constants import DATETIME_FORMAT
3
-
4
- import pandas as pd
5
-
6
-
7
- class OHLCV:
8
- COLUMNS = ["open", "high", "low", "close", "volume"]
9
-
10
- def __init__(self, symbol, data):
11
- self.symbol = symbol
12
- self.target_symbol = symbol.split("/")[0]
13
- self.trading_symbol = symbol.split("/")[1]
14
- self.data = []
15
- for row in data:
16
- self.data.append(
17
- [
18
- row[0],
19
- float(row[1]),
20
- float(row[2]),
21
- float(row[3]),
22
- float(row[4]),
23
- float(row[5])
24
- ]
25
- )
26
-
27
- def get_symbol(self):
28
- return self.symbol
29
-
30
- def get_target_symbol(self):
31
- return self.target_symbol
32
-
33
- def get_trading_symbol(self):
34
- return self.trading_symbol
35
-
36
- def get_data(self):
37
- return self.data
38
-
39
- def to_dict(self, date_format=DATETIME_FORMAT):
40
- dict_data = {}
41
-
42
- for column in self.COLUMNS:
43
- dict_data[column] = []
44
-
45
- for row in self.get_data():
46
- date = datetime.strptime(row[0], date_format)
47
- date = date.strftime(date_format)
48
- dict_data["open"].append(date)
49
- dict_data["high"].append(row[1])
50
- dict_data["low"].append(row[2])
51
- dict_data["close"].append(row[3])
52
- dict_data["volume"].append(row[4])
53
-
54
- return dict_data
55
-
56
- def to_array(self, date_format=DATETIME_FORMAT):
57
- rows = []
58
-
59
- for row in self.get_data():
60
- datetime_object = datetime.strptime(
61
- row[0], DATETIME_FORMAT
62
- )
63
- rows.append([
64
- datetime_object.strftime(date_format),
65
- row[1],
66
- row[2],
67
- row[3],
68
- row[4],
69
- row[5]
70
- ])
71
-
72
- return rows
73
-
74
- @staticmethod
75
- def from_dict(data):
76
- return OHLCV(
77
- symbol=data.get("symbol"),
78
- data=data.get("data"),
79
- )
80
-
81
- def repr(self, **fields) -> str:
82
- """
83
- Helper for __repr__
84
- """
85
-
86
- field_strings = []
87
- at_least_one_attached_attribute = False
88
-
89
- for key, field in fields.items():
90
- field_strings.append(f'{key}={field!r}')
91
- at_least_one_attached_attribute = True
92
-
93
- if at_least_one_attached_attribute:
94
- return f"<{self.__class__.__name__}({','.join(field_strings)})>"
95
-
96
- return f"<{self.__class__.__name__} {id(self)}>"
97
-
98
- def __repr__(self):
99
- return self.repr(
100
- symbol=self.get_symbol(),
101
- data=self.get_data()
102
- )
103
-
104
- def to_df(self):
105
- return pd.DataFrame(self.get_data(), columns=self.COLUMNS)
@@ -1,63 +0,0 @@
1
- from datetime import datetime
2
- from typing import List
3
-
4
-
5
- class OrderBook:
6
-
7
- def __init__(self, symbol, bids: List, asks: List, creation_date=None):
8
- self.symbol = symbol
9
- self.bids = bids
10
- self.asks = asks
11
-
12
- if creation_date is None:
13
- self.creation_date = datetime.now()
14
-
15
- def get_bids(self):
16
- return self.bids
17
-
18
- def get_asks(self):
19
- return self.asks
20
-
21
- def get_symbol(self):
22
- return self.symbol
23
-
24
- def to_dict(self):
25
-
26
- return {
27
- "symbol": self.symbol,
28
- "bids": self.bids,
29
- "asks": self.asks
30
- }
31
-
32
- @staticmethod
33
- def from_dict(data):
34
- return OrderBook(
35
- data.get("symbol"),
36
- data.get("bids"),
37
- data.get("asks"),
38
- data.get("creation_date")
39
- )
40
-
41
- def repr(self, **fields) -> str:
42
- """
43
- Helper for __repr__
44
- """
45
-
46
- field_strings = []
47
- at_least_one_attached_attribute = False
48
-
49
- for key, field in fields.items():
50
- field_strings.append(f'{key}={field!r}')
51
- at_least_one_attached_attribute = True
52
-
53
- if at_least_one_attached_attribute:
54
- return f"<{self.__class__.__name__}({','.join(field_strings)})>"
55
-
56
- return f"<{self.__class__.__name__} {id(self)}>"
57
-
58
- def __repr__(self):
59
- return self.repr(
60
- symbol=self.symbol,
61
- bids=self.bids,
62
- asks=self.asks
63
- )