investing-algorithm-framework 1.3.1__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.
- investing_algorithm_framework/__init__.py +195 -16
- investing_algorithm_framework/analysis/__init__.py +16 -0
- investing_algorithm_framework/analysis/backtest_data_ranges.py +202 -0
- investing_algorithm_framework/analysis/data.py +170 -0
- investing_algorithm_framework/analysis/markdown.py +91 -0
- investing_algorithm_framework/analysis/ranking.py +298 -0
- investing_algorithm_framework/app/__init__.py +31 -4
- investing_algorithm_framework/app/algorithm/__init__.py +7 -0
- investing_algorithm_framework/app/algorithm/algorithm.py +193 -0
- investing_algorithm_framework/app/algorithm/algorithm_factory.py +118 -0
- investing_algorithm_framework/app/app.py +2233 -264
- investing_algorithm_framework/app/app_hook.py +28 -0
- investing_algorithm_framework/app/context.py +1724 -0
- investing_algorithm_framework/app/eventloop.py +620 -0
- investing_algorithm_framework/app/reporting/__init__.py +27 -0
- investing_algorithm_framework/app/reporting/ascii.py +921 -0
- investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
- investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
- investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
- investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
- investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
- investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
- investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
- investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
- investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
- investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
- investing_algorithm_framework/app/reporting/generate.py +185 -0
- investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
- investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
- investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
- investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
- investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
- investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
- investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
- investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
- investing_algorithm_framework/app/stateless/action_handlers/__init__.py +6 -3
- investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
- investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +2 -1
- investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
- investing_algorithm_framework/app/stateless/exception_handler.py +1 -1
- investing_algorithm_framework/app/strategy.py +873 -52
- investing_algorithm_framework/app/task.py +5 -3
- investing_algorithm_framework/app/web/__init__.py +2 -1
- investing_algorithm_framework/app/web/controllers/__init__.py +2 -2
- investing_algorithm_framework/app/web/controllers/orders.py +4 -3
- investing_algorithm_framework/app/web/controllers/portfolio.py +1 -1
- investing_algorithm_framework/app/web/controllers/positions.py +3 -3
- investing_algorithm_framework/app/web/create_app.py +4 -2
- investing_algorithm_framework/app/web/error_handler.py +1 -1
- investing_algorithm_framework/app/web/schemas/order.py +2 -2
- investing_algorithm_framework/app/web/schemas/position.py +1 -0
- investing_algorithm_framework/cli/__init__.py +0 -0
- investing_algorithm_framework/cli/cli.py +231 -0
- investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
- investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
- investing_algorithm_framework/cli/initialize_app.py +603 -0
- investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
- investing_algorithm_framework/cli/templates/app.py.template +18 -0
- investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
- investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
- investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
- investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
- investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
- investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
- investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
- investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
- investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
- investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
- investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
- investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
- investing_algorithm_framework/cli/templates/env.example.template +2 -0
- investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
- investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
- investing_algorithm_framework/cli/templates/readme.md.template +135 -0
- investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
- investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
- investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
- investing_algorithm_framework/cli/validate_backtest_checkpoints.py +197 -0
- investing_algorithm_framework/create_app.py +43 -9
- investing_algorithm_framework/dependency_container.py +121 -33
- investing_algorithm_framework/domain/__init__.py +109 -22
- investing_algorithm_framework/domain/algorithm_id.py +69 -0
- investing_algorithm_framework/domain/backtesting/__init__.py +25 -0
- investing_algorithm_framework/domain/backtesting/backtest.py +548 -0
- investing_algorithm_framework/domain/backtesting/backtest_date_range.py +113 -0
- investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +241 -0
- investing_algorithm_framework/domain/backtesting/backtest_metrics.py +470 -0
- investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
- investing_algorithm_framework/domain/backtesting/backtest_run.py +663 -0
- investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
- investing_algorithm_framework/domain/backtesting/backtest_utils.py +198 -0
- investing_algorithm_framework/domain/backtesting/combine_backtests.py +392 -0
- investing_algorithm_framework/domain/config.py +60 -138
- investing_algorithm_framework/domain/constants.py +23 -34
- investing_algorithm_framework/domain/data_provider.py +334 -0
- investing_algorithm_framework/domain/data_structures.py +42 -0
- investing_algorithm_framework/domain/decimal_parsing.py +40 -0
- investing_algorithm_framework/domain/exceptions.py +51 -1
- investing_algorithm_framework/domain/models/__init__.py +29 -14
- investing_algorithm_framework/domain/models/app_mode.py +34 -0
- investing_algorithm_framework/domain/models/base_model.py +3 -1
- investing_algorithm_framework/domain/models/data/__init__.py +7 -0
- investing_algorithm_framework/domain/models/data/data_source.py +222 -0
- investing_algorithm_framework/domain/models/data/data_type.py +46 -0
- investing_algorithm_framework/domain/models/event.py +35 -0
- investing_algorithm_framework/domain/models/market/__init__.py +5 -0
- investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
- investing_algorithm_framework/domain/models/order/__init__.py +3 -4
- investing_algorithm_framework/domain/models/order/order.py +243 -86
- investing_algorithm_framework/domain/models/order/order_status.py +2 -2
- investing_algorithm_framework/domain/models/order/order_type.py +1 -3
- investing_algorithm_framework/domain/models/portfolio/__init__.py +7 -2
- investing_algorithm_framework/domain/models/portfolio/portfolio.py +134 -1
- investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +37 -37
- investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +208 -0
- investing_algorithm_framework/domain/models/position/__init__.py +3 -2
- investing_algorithm_framework/domain/models/position/position.py +29 -0
- investing_algorithm_framework/domain/models/position/position_size.py +41 -0
- investing_algorithm_framework/domain/models/position/{position_cost.py → position_snapshot.py} +16 -8
- investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
- investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
- investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
- investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
- investing_algorithm_framework/domain/models/strategy_profile.py +33 -0
- investing_algorithm_framework/domain/models/time_frame.py +94 -98
- investing_algorithm_framework/domain/models/time_interval.py +33 -0
- investing_algorithm_framework/domain/models/time_unit.py +111 -2
- investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
- investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
- investing_algorithm_framework/domain/models/trade/__init__.py +11 -0
- investing_algorithm_framework/domain/models/trade/trade.py +389 -0
- investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
- investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
- investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
- investing_algorithm_framework/domain/order_executor.py +112 -0
- investing_algorithm_framework/domain/portfolio_provider.py +118 -0
- investing_algorithm_framework/domain/services/__init__.py +11 -0
- investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
- investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
- investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
- investing_algorithm_framework/domain/services/rounding_service.py +27 -0
- investing_algorithm_framework/domain/services/state_handler.py +38 -0
- investing_algorithm_framework/domain/strategy.py +1 -29
- investing_algorithm_framework/domain/utils/__init__.py +16 -4
- investing_algorithm_framework/domain/utils/csv.py +22 -0
- investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
- investing_algorithm_framework/domain/utils/dates.py +57 -0
- investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
- investing_algorithm_framework/domain/utils/polars.py +53 -0
- investing_algorithm_framework/domain/utils/random.py +29 -0
- investing_algorithm_framework/download_data.py +244 -0
- investing_algorithm_framework/infrastructure/__init__.py +39 -11
- investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
- investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1152 -0
- investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
- investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
- investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
- investing_algorithm_framework/infrastructure/database/sql_alchemy.py +87 -13
- investing_algorithm_framework/infrastructure/models/__init__.py +13 -4
- investing_algorithm_framework/infrastructure/models/decimal_parser.py +14 -0
- investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -2
- investing_algorithm_framework/infrastructure/models/order/order.py +73 -73
- investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
- investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
- investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +3 -2
- investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +37 -0
- investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +57 -3
- investing_algorithm_framework/infrastructure/models/position/__init__.py +2 -2
- investing_algorithm_framework/infrastructure/models/position/position.py +16 -11
- investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +23 -0
- investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
- investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
- investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
- investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
- investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
- investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
- investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
- investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
- investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
- investing_algorithm_framework/infrastructure/repositories/__init__.py +13 -5
- investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
- investing_algorithm_framework/infrastructure/repositories/order_repository.py +32 -19
- investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +2 -2
- investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +56 -0
- investing_algorithm_framework/infrastructure/repositories/position_repository.py +47 -4
- investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +21 -0
- investing_algorithm_framework/infrastructure/repositories/repository.py +85 -31
- investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
- investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
- investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
- investing_algorithm_framework/infrastructure/services/__init__.py +9 -2
- investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
- investing_algorithm_framework/infrastructure/services/aws/state_handler.py +193 -0
- investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
- investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
- investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +9 -0
- investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +2596 -0
- investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +285 -0
- investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +468 -0
- investing_algorithm_framework/services/__init__.py +127 -10
- investing_algorithm_framework/services/configuration_service.py +95 -0
- investing_algorithm_framework/services/data_providers/__init__.py +5 -0
- investing_algorithm_framework/services/data_providers/data_provider_service.py +1058 -0
- investing_algorithm_framework/services/market_credential_service.py +40 -0
- investing_algorithm_framework/services/metrics/__init__.py +119 -0
- investing_algorithm_framework/services/metrics/alpha.py +0 -0
- investing_algorithm_framework/services/metrics/beta.py +0 -0
- investing_algorithm_framework/services/metrics/cagr.py +60 -0
- investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
- investing_algorithm_framework/services/metrics/drawdown.py +218 -0
- investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
- investing_algorithm_framework/services/metrics/exposure.py +210 -0
- investing_algorithm_framework/services/metrics/generate.py +358 -0
- investing_algorithm_framework/services/metrics/mean_daily_return.py +84 -0
- investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
- investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
- investing_algorithm_framework/services/metrics/recovery.py +113 -0
- investing_algorithm_framework/services/metrics/returns.py +452 -0
- investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
- investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
- investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
- investing_algorithm_framework/services/metrics/standard_deviation.py +156 -0
- investing_algorithm_framework/services/metrics/trades.py +473 -0
- investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
- investing_algorithm_framework/services/metrics/ulcer.py +0 -0
- investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
- investing_algorithm_framework/services/metrics/volatility.py +118 -0
- investing_algorithm_framework/services/metrics/win_rate.py +177 -0
- investing_algorithm_framework/services/order_service/__init__.py +9 -0
- investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
- investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
- investing_algorithm_framework/services/order_service/order_service.py +826 -0
- investing_algorithm_framework/services/portfolios/__init__.py +16 -0
- investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
- investing_algorithm_framework/services/{portfolio_configuration_service.py → portfolios/portfolio_configuration_service.py} +27 -12
- investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
- investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
- investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
- investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
- investing_algorithm_framework/services/positions/__init__.py +7 -0
- investing_algorithm_framework/services/positions/position_service.py +210 -0
- investing_algorithm_framework/services/positions/position_snapshot_service.py +18 -0
- investing_algorithm_framework/services/repository_service.py +8 -2
- investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
- investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +117 -0
- investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
- investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
- investing_algorithm_framework/services/trade_service/__init__.py +9 -0
- investing_algorithm_framework/services/trade_service/trade_service.py +1099 -0
- investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
- investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
- investing_algorithm_framework-7.25.6.dist-info/METADATA +535 -0
- investing_algorithm_framework-7.25.6.dist-info/RECORD +268 -0
- {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/WHEEL +1 -2
- investing_algorithm_framework-7.25.6.dist-info/entry_points.txt +3 -0
- investing_algorithm_framework/app/algorithm.py +0 -410
- investing_algorithm_framework/domain/models/market_data/__init__.py +0 -11
- investing_algorithm_framework/domain/models/market_data/asset_price.py +0 -50
- investing_algorithm_framework/domain/models/market_data/ohlcv.py +0 -76
- investing_algorithm_framework/domain/models/market_data/order_book.py +0 -63
- investing_algorithm_framework/domain/models/market_data/ticker.py +0 -92
- investing_algorithm_framework/domain/models/order/order_fee.py +0 -45
- investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
- investing_algorithm_framework/domain/models/trading_time_frame.py +0 -205
- investing_algorithm_framework/domain/singleton.py +0 -9
- investing_algorithm_framework/infrastructure/models/order/order_fee.py +0 -21
- investing_algorithm_framework/infrastructure/models/position/position_cost.py +0 -32
- investing_algorithm_framework/infrastructure/repositories/order_fee_repository.py +0 -15
- investing_algorithm_framework/infrastructure/repositories/position_cost_repository.py +0 -16
- investing_algorithm_framework/infrastructure/services/market_service.py +0 -422
- investing_algorithm_framework/services/market_data_service.py +0 -75
- investing_algorithm_framework/services/order_service.py +0 -464
- investing_algorithm_framework/services/portfolio_service.py +0 -105
- investing_algorithm_framework/services/position_cost_service.py +0 -5
- investing_algorithm_framework/services/position_service.py +0 -50
- investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -219
- investing_algorithm_framework/setup_logging.py +0 -40
- investing_algorithm_framework-1.3.1.dist-info/AUTHORS.md +0 -8
- investing_algorithm_framework-1.3.1.dist-info/METADATA +0 -172
- investing_algorithm_framework-1.3.1.dist-info/RECORD +0 -103
- investing_algorithm_framework-1.3.1.dist-info/top_level.txt +0 -1
- {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/LICENSE +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from dateutil import parser
|
|
4
|
+
from datetime import timezone, datetime
|
|
5
|
+
import pandas
|
|
6
|
+
import polars
|
|
7
|
+
from typing import Union, Optional
|
|
8
|
+
|
|
9
|
+
from investing_algorithm_framework.services import DataProviderService, \
|
|
10
|
+
ConfigurationService, MarketCredentialService
|
|
11
|
+
from investing_algorithm_framework.infrastructure import \
|
|
12
|
+
get_default_data_providers
|
|
13
|
+
from investing_algorithm_framework.domain import DataSource, \
|
|
14
|
+
OperationalException, DataType
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class DownloadResult:
|
|
19
|
+
"""
|
|
20
|
+
Result container for download function.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
data: The downloaded data as a pandas or polars DataFrame.
|
|
24
|
+
path: The file path where the data was saved (None if not saved).
|
|
25
|
+
"""
|
|
26
|
+
data: Union[pandas.DataFrame, polars.DataFrame]
|
|
27
|
+
path: Optional[Path] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def create_data_storage_path(
|
|
31
|
+
symbol: str,
|
|
32
|
+
market: str,
|
|
33
|
+
time_frame: str,
|
|
34
|
+
start_date: datetime,
|
|
35
|
+
end_date: datetime,
|
|
36
|
+
storage_path: str,
|
|
37
|
+
data_type: str = "ohlcv",
|
|
38
|
+
) -> Path:
|
|
39
|
+
"""
|
|
40
|
+
Create the file path where data would be stored.
|
|
41
|
+
|
|
42
|
+
This function generates the same path that the download function
|
|
43
|
+
uses when saving data, allowing you to reference the file later.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
symbol: Trading pair (e.g., "BTC/EUR")
|
|
47
|
+
market: Market identifier (e.g., "BITVAVO")
|
|
48
|
+
time_frame: Time frame (e.g., "2h", "4h", "1d")
|
|
49
|
+
start_date: Start date of the data
|
|
50
|
+
end_date: End date of the data
|
|
51
|
+
storage_path: Base directory for storing files
|
|
52
|
+
data_type: Type of data (default: "ohlcv")
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Path: The full file path where data would be stored.
|
|
56
|
+
"""
|
|
57
|
+
datetime_format = "%Y-%m-%d-%H-%M"
|
|
58
|
+
symbol_formatted = symbol.upper().replace('/', '-')
|
|
59
|
+
start_date_str = start_date.strftime(datetime_format)
|
|
60
|
+
end_date_str = end_date.strftime(datetime_format)
|
|
61
|
+
filename = (
|
|
62
|
+
f"{data_type.upper()}_{symbol_formatted}_{market.upper()}_"
|
|
63
|
+
f"{time_frame}_{start_date_str}_{end_date_str}.csv"
|
|
64
|
+
)
|
|
65
|
+
return Path(storage_path) / filename
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def download(
|
|
69
|
+
symbol: str,
|
|
70
|
+
market: str = None,
|
|
71
|
+
date: Union[datetime, str] = None,
|
|
72
|
+
time_frame: str = None,
|
|
73
|
+
data_type: Union[str, DataType] = DataType.OHLCV,
|
|
74
|
+
start_date: Union[datetime, str] = None,
|
|
75
|
+
end_date: Union[datetime, str] = None,
|
|
76
|
+
window_size: int = 200,
|
|
77
|
+
pandas: bool = True,
|
|
78
|
+
save: bool = True,
|
|
79
|
+
storage_path: Union[str, Path] = None,
|
|
80
|
+
save_to: Union[str, Path] = None,
|
|
81
|
+
) -> Union[pandas.DataFrame, polars.DataFrame]:
|
|
82
|
+
"""
|
|
83
|
+
Download market data from the specified source. This function
|
|
84
|
+
uses the MarketDataSourceService to get the data provider
|
|
85
|
+
for the given set of parameters.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
symbol (str): The symbol to download data for.
|
|
89
|
+
market (str): The market to download data from.
|
|
90
|
+
data_type (str): The type of data to
|
|
91
|
+
download (e.g., "ohlcv", "ticker").
|
|
92
|
+
start_date (str): The start date for the data download.
|
|
93
|
+
end_date (str): The end date for the data download.
|
|
94
|
+
window_size (int): The size of the data window.
|
|
95
|
+
pandas (bool): Whether to return the data as a pandas DataFrame.
|
|
96
|
+
save (bool): Whether to save the downloaded data.
|
|
97
|
+
storage_path (str): The directory to save the downloaded data.
|
|
98
|
+
save_to (str): The path to save the downloaded data. If provided,
|
|
99
|
+
it overrides storage_path.
|
|
100
|
+
time_frame (str): The time frame for the data download.
|
|
101
|
+
date (str): The date for the data download.
|
|
102
|
+
window_size (int): The size of the data window.
|
|
103
|
+
pandas (bool): Whether to return the data as a pandas DataFrame.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
None
|
|
107
|
+
"""
|
|
108
|
+
configuration_service = ConfigurationService()
|
|
109
|
+
market_credential_service = MarketCredentialService()
|
|
110
|
+
data_provider_service = DataProviderService(
|
|
111
|
+
default_data_providers=get_default_data_providers(),
|
|
112
|
+
configuration_service=configuration_service,
|
|
113
|
+
market_credential_service=market_credential_service,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
if start_date is not None and isinstance(start_date, str):
|
|
117
|
+
start_date = parser.parse(start_date)
|
|
118
|
+
start_date = start_date.replace(tzinfo=timezone.utc)
|
|
119
|
+
|
|
120
|
+
if end_date is not None and isinstance(end_date, str):
|
|
121
|
+
end_date = parser.parse(end_date)
|
|
122
|
+
end_date = end_date.replace(tzinfo=timezone.utc)
|
|
123
|
+
|
|
124
|
+
if date is not None and isinstance(date, str):
|
|
125
|
+
date = parser.parse(date)
|
|
126
|
+
date = date.replace(tzinfo=timezone.utc)
|
|
127
|
+
|
|
128
|
+
# Check if all the datetime parameters are in UTC
|
|
129
|
+
if date is not None \
|
|
130
|
+
and (date.tzinfo is None or date.tzinfo != timezone.utc):
|
|
131
|
+
raise OperationalException("Date must be a UTC datetime object")
|
|
132
|
+
|
|
133
|
+
if start_date is not None \
|
|
134
|
+
and (
|
|
135
|
+
start_date.tzinfo is None or start_date.tzinfo != timezone.utc
|
|
136
|
+
):
|
|
137
|
+
raise OperationalException("Start date must be a UTC datetime object")
|
|
138
|
+
|
|
139
|
+
if end_date is not None \
|
|
140
|
+
and (end_date.tzinfo is None or end_date.tzinfo != timezone.utc):
|
|
141
|
+
raise OperationalException("End date must be a UTC datetime object")
|
|
142
|
+
|
|
143
|
+
data_source = DataSource(
|
|
144
|
+
symbol=symbol,
|
|
145
|
+
market=market,
|
|
146
|
+
data_type=data_type,
|
|
147
|
+
time_frame=time_frame,
|
|
148
|
+
date=date,
|
|
149
|
+
start_date=start_date,
|
|
150
|
+
end_date=end_date,
|
|
151
|
+
window_size=window_size,
|
|
152
|
+
pandas=pandas,
|
|
153
|
+
save=save,
|
|
154
|
+
storage_path=storage_path
|
|
155
|
+
)
|
|
156
|
+
data_provider_service.index_data_providers(
|
|
157
|
+
data_sources=[data_source]
|
|
158
|
+
)
|
|
159
|
+
return data_provider_service.get_data(
|
|
160
|
+
data_source=data_source,
|
|
161
|
+
date=date,
|
|
162
|
+
start_date=start_date,
|
|
163
|
+
end_date=end_date,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def download_v2(
|
|
168
|
+
symbol: str,
|
|
169
|
+
market: str = None,
|
|
170
|
+
date: Union[datetime, str] = None,
|
|
171
|
+
time_frame: str = None,
|
|
172
|
+
data_type: Union[str, DataType] = DataType.OHLCV,
|
|
173
|
+
start_date: Union[datetime, str] = None,
|
|
174
|
+
end_date: Union[datetime, str] = None,
|
|
175
|
+
window_size: int = 200,
|
|
176
|
+
pandas: bool = True,
|
|
177
|
+
save: bool = True,
|
|
178
|
+
storage_path: Union[str, Path] = None,
|
|
179
|
+
) -> DownloadResult:
|
|
180
|
+
"""
|
|
181
|
+
Download market data and return both the DataFrame and file path.
|
|
182
|
+
|
|
183
|
+
This is an improved version of download() that returns a DownloadResult
|
|
184
|
+
containing both the downloaded data and the file path where it was saved.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
symbol: Trading pair (e.g., "BTC/EUR")
|
|
188
|
+
market: Market identifier (e.g., "BITVAVO")
|
|
189
|
+
time_frame: Time frame (e.g., "2h", "4h", "1d")
|
|
190
|
+
data_type: Type of data (default: "ohlcv")
|
|
191
|
+
start_date: Start date for data range
|
|
192
|
+
end_date: End date for data range
|
|
193
|
+
date: Specific date for data download
|
|
194
|
+
window_size: Size of the data window
|
|
195
|
+
pandas: Whether to return the data as a pandas DataFrame
|
|
196
|
+
save: Whether to save the data to disk
|
|
197
|
+
storage_path: Base directory for storing files
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
DownloadResult with .data (DataFrame) and .path (Path or None)
|
|
201
|
+
"""
|
|
202
|
+
# Parse dates if they are strings
|
|
203
|
+
parsed_start_date = start_date
|
|
204
|
+
parsed_end_date = end_date
|
|
205
|
+
|
|
206
|
+
if parsed_start_date is not None and isinstance(parsed_start_date, str):
|
|
207
|
+
parsed_start_date = parser.parse(parsed_start_date)
|
|
208
|
+
parsed_start_date = parsed_start_date.replace(tzinfo=timezone.utc)
|
|
209
|
+
|
|
210
|
+
if parsed_end_date is not None and isinstance(parsed_end_date, str):
|
|
211
|
+
parsed_end_date = parser.parse(parsed_end_date)
|
|
212
|
+
parsed_end_date = parsed_end_date.replace(tzinfo=timezone.utc)
|
|
213
|
+
|
|
214
|
+
# Download the data using the existing function
|
|
215
|
+
data = download(
|
|
216
|
+
symbol=symbol,
|
|
217
|
+
market=market,
|
|
218
|
+
date=date,
|
|
219
|
+
time_frame=time_frame,
|
|
220
|
+
data_type=data_type,
|
|
221
|
+
start_date=start_date,
|
|
222
|
+
end_date=end_date,
|
|
223
|
+
window_size=window_size,
|
|
224
|
+
pandas=pandas,
|
|
225
|
+
save=save,
|
|
226
|
+
storage_path=storage_path,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Determine the file path if data was saved
|
|
230
|
+
file_path = None
|
|
231
|
+
if save and storage_path and parsed_start_date and parsed_end_date:
|
|
232
|
+
data_type_str = data_type.value \
|
|
233
|
+
if isinstance(data_type, DataType) else data_type
|
|
234
|
+
file_path = create_data_storage_path(
|
|
235
|
+
symbol=symbol,
|
|
236
|
+
market=market,
|
|
237
|
+
time_frame=time_frame,
|
|
238
|
+
start_date=parsed_start_date,
|
|
239
|
+
end_date=parsed_end_date,
|
|
240
|
+
storage_path=str(storage_path),
|
|
241
|
+
data_type=data_type_str,
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
return DownloadResult(data=data, path=file_path)
|
|
@@ -1,24 +1,52 @@
|
|
|
1
|
-
from .repositories import SQLOrderRepository, SQLPositionRepository, \
|
|
2
|
-
SQLPortfolioRepository, SQLPositionCostRepository, SQLOrderFeeRepository
|
|
3
|
-
from .services import MarketService
|
|
4
1
|
from .database import setup_sqlalchemy, Session, \
|
|
5
|
-
create_all_tables
|
|
6
|
-
from .models import SQLPortfolio, SQLOrder, SQLPosition,
|
|
7
|
-
|
|
2
|
+
create_all_tables, clear_db
|
|
3
|
+
from .models import SQLPortfolio, SQLOrder, SQLPosition, \
|
|
4
|
+
SQLPortfolioSnapshot, SQLPositionSnapshot, SQLTrade, \
|
|
5
|
+
SQLTradeTakeProfit, SQLTradeStopLoss
|
|
6
|
+
from .repositories import SQLOrderRepository, SQLPositionRepository, \
|
|
7
|
+
SQLPortfolioRepository, SQLTradeRepository, \
|
|
8
|
+
SQLPortfolioSnapshotRepository, SQLPositionSnapshotRepository, \
|
|
9
|
+
SQLTradeTakeProfitRepository, SQLTradeStopLossRepository, \
|
|
10
|
+
SQLOrderMetadataRepository
|
|
11
|
+
from .services import AzureBlobStorageStateHandler, AWSS3StorageStateHandler, \
|
|
12
|
+
BacktestService
|
|
13
|
+
from .data_providers import CSVOHLCVDataProvider, get_default_data_providers, \
|
|
14
|
+
get_default_ohlcv_data_providers, CCXTOHLCVDataProvider, \
|
|
15
|
+
PandasOHLCVDataProvider
|
|
16
|
+
from .order_executors import CCXTOrderExecutor, BacktestOrderExecutor
|
|
17
|
+
from .portfolio_providers import CCXTPortfolioProvider
|
|
8
18
|
|
|
9
19
|
__all__ = [
|
|
20
|
+
"clear_db",
|
|
10
21
|
"create_all_tables",
|
|
11
22
|
"SQLPositionRepository",
|
|
12
23
|
"SQLPortfolioRepository",
|
|
13
|
-
"SQLPositionCostRepository",
|
|
14
24
|
"SQLOrderRepository",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
25
|
+
"SQLPortfolioSnapshotRepository",
|
|
26
|
+
"SQLPositionSnapshotRepository",
|
|
17
27
|
"setup_sqlalchemy",
|
|
18
28
|
"Session",
|
|
19
29
|
"SQLPortfolio",
|
|
30
|
+
"SQLTrade",
|
|
20
31
|
"SQLOrder",
|
|
21
|
-
"SQLOrderFee",
|
|
22
32
|
"SQLPosition",
|
|
23
|
-
"
|
|
33
|
+
"SQLPortfolioSnapshot",
|
|
34
|
+
"SQLPositionSnapshot",
|
|
35
|
+
"AzureBlobStorageStateHandler",
|
|
36
|
+
"SQLTradeRepository",
|
|
37
|
+
"SQLTradeTakeProfit",
|
|
38
|
+
"SQLTradeStopLoss",
|
|
39
|
+
"SQLTradeTakeProfitRepository",
|
|
40
|
+
"SQLTradeStopLossRepository",
|
|
41
|
+
"SQLOrderMetadataRepository",
|
|
42
|
+
"CSVOHLCVDataProvider",
|
|
43
|
+
"CCXTOrderExecutor",
|
|
44
|
+
"CCXTPortfolioProvider",
|
|
45
|
+
"get_default_data_providers",
|
|
46
|
+
"get_default_ohlcv_data_providers",
|
|
47
|
+
"AWSS3StorageStateHandler",
|
|
48
|
+
"CCXTOHLCVDataProvider",
|
|
49
|
+
"BacktestOrderExecutor",
|
|
50
|
+
"PandasOHLCVDataProvider",
|
|
51
|
+
"BacktestService",
|
|
24
52
|
]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from .ccxt import CCXTOHLCVDataProvider
|
|
2
|
+
from .csv import CSVOHLCVDataProvider
|
|
3
|
+
from .pandas import PandasOHLCVDataProvider
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_default_data_providers():
|
|
7
|
+
"""
|
|
8
|
+
Function to get the default data providers.
|
|
9
|
+
|
|
10
|
+
Returns:
|
|
11
|
+
list: List of default data providers.
|
|
12
|
+
"""
|
|
13
|
+
return [
|
|
14
|
+
CCXTOHLCVDataProvider(),
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_default_ohlcv_data_providers():
|
|
19
|
+
"""
|
|
20
|
+
Function to get the default OHLCV data providers.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
list: List of default OHLCV data providers.
|
|
24
|
+
"""
|
|
25
|
+
return [
|
|
26
|
+
CCXTOHLCVDataProvider(),
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
'CSVOHLCVDataProvider',
|
|
32
|
+
'CCXTOHLCVDataProvider',
|
|
33
|
+
'get_default_data_providers',
|
|
34
|
+
'get_default_ohlcv_data_providers',
|
|
35
|
+
'PandasOHLCVDataProvider',
|
|
36
|
+
]
|