investing-algorithm-framework 3.7.0__py3-none-any.whl → 7.19.15__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 investing-algorithm-framework might be problematic. Click here for more details.
- investing_algorithm_framework/__init__.py +168 -45
- investing_algorithm_framework/app/__init__.py +32 -1
- investing_algorithm_framework/app/algorithm/__init__.py +7 -0
- investing_algorithm_framework/app/algorithm/algorithm.py +239 -0
- investing_algorithm_framework/app/algorithm/algorithm_factory.py +114 -0
- investing_algorithm_framework/app/analysis/__init__.py +15 -0
- investing_algorithm_framework/app/analysis/backtest_data_ranges.py +121 -0
- investing_algorithm_framework/app/analysis/backtest_utils.py +107 -0
- investing_algorithm_framework/app/analysis/permutation.py +116 -0
- investing_algorithm_framework/app/analysis/ranking.py +297 -0
- investing_algorithm_framework/app/app.py +1933 -589
- investing_algorithm_framework/app/app_hook.py +28 -0
- investing_algorithm_framework/app/context.py +1725 -0
- investing_algorithm_framework/app/eventloop.py +590 -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 +4 -2
- investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
- investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +1 -1
- investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
- investing_algorithm_framework/app/strategy.py +664 -84
- investing_algorithm_framework/app/task.py +5 -3
- investing_algorithm_framework/app/web/__init__.py +2 -1
- investing_algorithm_framework/app/web/create_app.py +4 -2
- investing_algorithm_framework/cli/__init__.py +0 -0
- investing_algorithm_framework/cli/cli.py +226 -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/create_app.py +40 -6
- investing_algorithm_framework/dependency_container.py +72 -56
- investing_algorithm_framework/domain/__init__.py +71 -47
- investing_algorithm_framework/domain/backtesting/__init__.py +21 -0
- investing_algorithm_framework/domain/backtesting/backtest.py +503 -0
- investing_algorithm_framework/domain/backtesting/backtest_date_range.py +96 -0
- investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +242 -0
- investing_algorithm_framework/domain/backtesting/backtest_metrics.py +459 -0
- investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
- investing_algorithm_framework/domain/backtesting/backtest_run.py +605 -0
- investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
- investing_algorithm_framework/domain/backtesting/combine_backtests.py +280 -0
- investing_algorithm_framework/domain/config.py +59 -91
- investing_algorithm_framework/domain/constants.py +13 -38
- investing_algorithm_framework/domain/data_provider.py +334 -0
- investing_algorithm_framework/domain/data_structures.py +3 -2
- investing_algorithm_framework/domain/exceptions.py +51 -1
- investing_algorithm_framework/domain/models/__init__.py +17 -12
- investing_algorithm_framework/domain/models/data/__init__.py +7 -0
- investing_algorithm_framework/domain/models/data/data_source.py +214 -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/market_credential.py +55 -1
- investing_algorithm_framework/domain/models/order/order.py +77 -83
- 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/portfolio.py +81 -3
- investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +26 -3
- investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +108 -11
- investing_algorithm_framework/domain/models/position/__init__.py +2 -1
- investing_algorithm_framework/domain/models/position/position.py +12 -0
- investing_algorithm_framework/domain/models/position/position_size.py +41 -0
- 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 +19 -151
- investing_algorithm_framework/domain/models/time_frame.py +37 -0
- investing_algorithm_framework/domain/models/time_interval.py +33 -0
- investing_algorithm_framework/domain/models/time_unit.py +66 -2
- investing_algorithm_framework/domain/models/trade/__init__.py +8 -1
- investing_algorithm_framework/domain/models/trade/trade.py +295 -171
- investing_algorithm_framework/domain/models/trade/trade_status.py +9 -2
- 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 +2 -9
- investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -6
- 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 +12 -7
- 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 +108 -0
- investing_algorithm_framework/infrastructure/__init__.py +31 -18
- investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
- investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1143 -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 +86 -12
- investing_algorithm_framework/infrastructure/models/__init__.py +6 -11
- investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -1
- investing_algorithm_framework/infrastructure/models/order/order.py +35 -49
- 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 +1 -1
- investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +8 -0
- investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +17 -5
- 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 +8 -0
- investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
- investing_algorithm_framework/infrastructure/repositories/order_repository.py +5 -0
- investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +1 -1
- investing_algorithm_framework/infrastructure/repositories/position_repository.py +11 -0
- investing_algorithm_framework/infrastructure/repositories/repository.py +81 -27
- 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 +4 -4
- investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
- investing_algorithm_framework/infrastructure/services/aws/state_handler.py +113 -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/services/__init__.py +113 -16
- investing_algorithm_framework/services/backtesting/__init__.py +0 -7
- investing_algorithm_framework/services/backtesting/backtest_service.py +566 -359
- investing_algorithm_framework/services/configuration_service.py +77 -11
- investing_algorithm_framework/services/data_providers/__init__.py +5 -0
- investing_algorithm_framework/services/data_providers/data_provider_service.py +850 -0
- investing_algorithm_framework/services/market_credential_service.py +16 -1
- investing_algorithm_framework/services/metrics/__init__.py +114 -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 +181 -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 +83 -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 +157 -0
- investing_algorithm_framework/services/metrics/trades.py +500 -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 +97 -0
- investing_algorithm_framework/services/metrics/win_rate.py +177 -0
- investing_algorithm_framework/services/order_service/__init__.py +3 -1
- investing_algorithm_framework/services/order_service/order_backtest_service.py +76 -89
- investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
- investing_algorithm_framework/services/order_service/order_service.py +407 -326
- investing_algorithm_framework/services/portfolios/__init__.py +3 -1
- investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +37 -3
- investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +22 -8
- investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
- investing_algorithm_framework/services/portfolios/portfolio_service.py +96 -28
- investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +97 -28
- investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +116 -313
- investing_algorithm_framework/services/positions/__init__.py +7 -0
- investing_algorithm_framework/services/positions/position_service.py +210 -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 +113 -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 +7 -1
- investing_algorithm_framework/services/trade_service/trade_service.py +1013 -315
- 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.19.15.dist-info/METADATA +537 -0
- investing_algorithm_framework-7.19.15.dist-info/RECORD +263 -0
- investing_algorithm_framework-7.19.15.dist-info/entry_points.txt +3 -0
- investing_algorithm_framework/app/algorithm.py +0 -1105
- investing_algorithm_framework/domain/graphs.py +0 -382
- investing_algorithm_framework/domain/metrics/__init__.py +0 -6
- investing_algorithm_framework/domain/models/backtesting/__init__.py +0 -11
- investing_algorithm_framework/domain/models/backtesting/backtest_date_range.py +0 -43
- investing_algorithm_framework/domain/models/backtesting/backtest_position.py +0 -120
- investing_algorithm_framework/domain/models/backtesting/backtest_report.py +0 -580
- investing_algorithm_framework/domain/models/backtesting/backtest_reports_evaluation.py +0 -243
- investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
- investing_algorithm_framework/domain/models/trading_time_frame.py +0 -223
- investing_algorithm_framework/domain/services/market_data_sources.py +0 -344
- investing_algorithm_framework/domain/services/market_service.py +0 -153
- investing_algorithm_framework/domain/singleton.py +0 -9
- investing_algorithm_framework/domain/utils/backtesting.py +0 -472
- investing_algorithm_framework/infrastructure/models/market_data_sources/__init__.py +0 -12
- investing_algorithm_framework/infrastructure/models/market_data_sources/ccxt.py +0 -559
- investing_algorithm_framework/infrastructure/models/market_data_sources/csv.py +0 -254
- investing_algorithm_framework/infrastructure/models/market_data_sources/us_treasury_yield.py +0 -47
- investing_algorithm_framework/infrastructure/services/market_service/__init__.py +0 -5
- investing_algorithm_framework/infrastructure/services/market_service/ccxt_market_service.py +0 -455
- investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -7
- investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -2
- investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -350
- investing_algorithm_framework/services/backtesting/backtest_report_writer_service.py +0 -53
- investing_algorithm_framework/services/backtesting/graphs.py +0 -61
- investing_algorithm_framework/services/market_data_source_service/__init__.py +0 -8
- investing_algorithm_framework/services/market_data_source_service/backtest_market_data_source_service.py +0 -150
- investing_algorithm_framework/services/market_data_source_service/market_data_source_service.py +0 -189
- investing_algorithm_framework/services/position_service.py +0 -31
- investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -264
- investing_algorithm_framework-3.7.0.dist-info/METADATA +0 -339
- investing_algorithm_framework-3.7.0.dist-info/RECORD +0 -147
- /investing_algorithm_framework/{domain → services}/metrics/price_efficiency.py +0 -0
- /investing_algorithm_framework/services/{position_snapshot_service.py → positions/position_snapshot_service.py} +0 -0
- {investing_algorithm_framework-3.7.0.dist-info → investing_algorithm_framework-7.19.15.dist-info}/LICENSE +0 -0
- {investing_algorithm_framework-3.7.0.dist-info → investing_algorithm_framework-7.19.15.dist-info}/WHEEL +0 -0
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from datetime import datetime
|
|
3
|
-
|
|
4
|
-
import polars
|
|
5
|
-
from dateutil.parser import parse
|
|
6
|
-
|
|
7
|
-
from investing_algorithm_framework.domain import OHLCVMarketDataSource, \
|
|
8
|
-
BacktestMarketDataSource, OperationalException, TickerMarketDataSource, \
|
|
9
|
-
DATETIME_FORMAT
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class CSVOHLCVMarketDataSource(OHLCVMarketDataSource):
|
|
15
|
-
"""
|
|
16
|
-
Implementation of a OHLCV data source that reads OHLCV data
|
|
17
|
-
from a csv file. Market data source that reads OHLCV data from a csv file.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
def empty(self, start_date, end_date=None):
|
|
21
|
-
if end_date is None:
|
|
22
|
-
end_date = self.create_end_date(
|
|
23
|
-
start_date, self.timeframe, self.window_size
|
|
24
|
-
)
|
|
25
|
-
data = self.get_data(start_date=start_date, end_date=end_date)
|
|
26
|
-
return len(data) == 0
|
|
27
|
-
|
|
28
|
-
def __init__(
|
|
29
|
-
self,
|
|
30
|
-
csv_file_path,
|
|
31
|
-
identifier=None,
|
|
32
|
-
market=None,
|
|
33
|
-
symbol=None,
|
|
34
|
-
timeframe=None,
|
|
35
|
-
window_size=None,
|
|
36
|
-
):
|
|
37
|
-
super().__init__(
|
|
38
|
-
identifier=identifier,
|
|
39
|
-
market=market,
|
|
40
|
-
symbol=symbol,
|
|
41
|
-
timeframe=timeframe,
|
|
42
|
-
window_size=window_size,
|
|
43
|
-
)
|
|
44
|
-
self._csv_file_path = csv_file_path
|
|
45
|
-
self._columns = [
|
|
46
|
-
"Datetime", "Open", "High", "Low", "Close", "Volume"
|
|
47
|
-
]
|
|
48
|
-
df = polars.read_csv(csv_file_path)
|
|
49
|
-
|
|
50
|
-
# Check if all column names are in the csv file
|
|
51
|
-
if not all(column in df.columns for column in self._columns):
|
|
52
|
-
# Identify missing columns
|
|
53
|
-
missing_columns = [column for column in self._columns if
|
|
54
|
-
column not in df.columns]
|
|
55
|
-
raise OperationalException(
|
|
56
|
-
f"Csv file {self._csv_file_path} does not contain "
|
|
57
|
-
f"all required ohlcv columns. "
|
|
58
|
-
f"Missing columns: {missing_columns}"
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
first_row = df.head(1)
|
|
62
|
-
last_row = df.tail(1)
|
|
63
|
-
self._start_date_data_source = parse(first_row["Datetime"][0])
|
|
64
|
-
self._end_date_data_source = parse(last_row["Datetime"][0])
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def csv_file_path(self):
|
|
68
|
-
return self._csv_file_path
|
|
69
|
-
|
|
70
|
-
def get_data(self, **kwargs):
|
|
71
|
-
"""
|
|
72
|
-
Get the data from the csv file. The data can be filtered by
|
|
73
|
-
the start_date and end_date in the kwargs. backtest_index_date
|
|
74
|
-
can also be provided to filter the data, where this will be used
|
|
75
|
-
as start_date.
|
|
76
|
-
|
|
77
|
-
Args:
|
|
78
|
-
**kwargs: Keyword arguments that can contain the following:
|
|
79
|
-
start_date (datetime): The start date to filter the data.
|
|
80
|
-
end_date (datetime): The end date to filter the data.
|
|
81
|
-
backtest_index_date (datetime): The backtest index date to
|
|
82
|
-
filter the data. This will be used as start_date.
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
df (polars.DataFrame): The data from the csv file.
|
|
86
|
-
"""
|
|
87
|
-
start_date = kwargs.get("start_date")
|
|
88
|
-
end_date = kwargs.get("end_date")
|
|
89
|
-
backtest_index_date = kwargs.get("backtest_index_date")
|
|
90
|
-
|
|
91
|
-
if start_date is None \
|
|
92
|
-
and end_date is None \
|
|
93
|
-
and backtest_index_date is None:
|
|
94
|
-
return polars.read_csv(
|
|
95
|
-
self.csv_file_path, columns=self._columns, separator=","
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
if backtest_index_date is not None:
|
|
99
|
-
end_date = backtest_index_date
|
|
100
|
-
start_date = self.create_start_date(
|
|
101
|
-
end_date, self.timeframe, self.window_size
|
|
102
|
-
)
|
|
103
|
-
else:
|
|
104
|
-
if start_date is None:
|
|
105
|
-
start_date = self.create_start_date(
|
|
106
|
-
end_date, self.timeframe, self.window_size
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
if end_date is None:
|
|
110
|
-
end_date = self.create_end_date(
|
|
111
|
-
start_date, self.timeframe, self.window_size
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
# # Check if start or end date are out of range with
|
|
115
|
-
# # the dates of the datasource.
|
|
116
|
-
# if self._start_date_data_source > start_date:
|
|
117
|
-
# raise OperationalException(
|
|
118
|
-
# f"Given start date {start_date} is before the start date "
|
|
119
|
-
# f"of the data source {self._start_date_data_source}"
|
|
120
|
-
# )
|
|
121
|
-
#
|
|
122
|
-
# if self._end_date_data_source < end_date:
|
|
123
|
-
# raise OperationalException(
|
|
124
|
-
# f"End date {end_date} is after the end date "
|
|
125
|
-
# f"of the data source {self._end_date_data_source}"
|
|
126
|
-
# )
|
|
127
|
-
|
|
128
|
-
df = polars.read_csv(
|
|
129
|
-
self.csv_file_path, columns=self._columns, separator=","
|
|
130
|
-
)
|
|
131
|
-
df = df.filter(
|
|
132
|
-
(df['Datetime'] >= start_date.strftime(DATETIME_FORMAT))
|
|
133
|
-
& (df['Datetime'] <= end_date.strftime(DATETIME_FORMAT))
|
|
134
|
-
)
|
|
135
|
-
return df
|
|
136
|
-
|
|
137
|
-
def dataframe_to_list_of_lists(self, dataframe, columns):
|
|
138
|
-
# Extract selected columns from DataFrame and convert
|
|
139
|
-
# to a list of lists
|
|
140
|
-
data_list_of_lists = dataframe[columns].values.tolist()
|
|
141
|
-
return data_list_of_lists
|
|
142
|
-
|
|
143
|
-
def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
|
|
144
|
-
pass
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
class CSVTickerMarketDataSource(TickerMarketDataSource):
|
|
148
|
-
|
|
149
|
-
def __init__(
|
|
150
|
-
self,
|
|
151
|
-
identifier,
|
|
152
|
-
market,
|
|
153
|
-
symbol,
|
|
154
|
-
csv_file_path,
|
|
155
|
-
):
|
|
156
|
-
super().__init__(
|
|
157
|
-
identifier=identifier,
|
|
158
|
-
market=market,
|
|
159
|
-
symbol=symbol,
|
|
160
|
-
)
|
|
161
|
-
self._csv_file_path = csv_file_path
|
|
162
|
-
self._columns = [
|
|
163
|
-
"Datetime", "Open", "High", "Low", "Close", "Volume"
|
|
164
|
-
]
|
|
165
|
-
df = polars.read_csv(self._csv_file_path)
|
|
166
|
-
|
|
167
|
-
if not all(column in df.columns for column in self._columns):
|
|
168
|
-
# Identify missing columns
|
|
169
|
-
missing_columns = [column for column in self._columns if
|
|
170
|
-
column not in df.columns]
|
|
171
|
-
raise OperationalException(
|
|
172
|
-
f"Csv file {self._csv_file_path} does not contain "
|
|
173
|
-
f"all required ohlcv columns. "
|
|
174
|
-
f"Missing columns: {missing_columns}"
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
first_row = df.head(1)
|
|
178
|
-
last_row = df.tail(1)
|
|
179
|
-
self._start_date_data_source = parse(first_row["Datetime"][0])
|
|
180
|
-
self._end_date_data_source = parse(last_row["Datetime"][0])
|
|
181
|
-
|
|
182
|
-
@property
|
|
183
|
-
def csv_file_path(self):
|
|
184
|
-
return self._csv_file_path
|
|
185
|
-
|
|
186
|
-
def get_data(self, **kwargs):
|
|
187
|
-
date = None
|
|
188
|
-
|
|
189
|
-
if "index_datetime" in kwargs:
|
|
190
|
-
date = kwargs["index_datetime"]
|
|
191
|
-
|
|
192
|
-
if "start_date" in kwargs:
|
|
193
|
-
date = kwargs["start_date"]
|
|
194
|
-
|
|
195
|
-
if 'date' in kwargs:
|
|
196
|
-
date = kwargs['date']
|
|
197
|
-
|
|
198
|
-
if date is None:
|
|
199
|
-
raise OperationalException("Date is required to get ticker data")
|
|
200
|
-
|
|
201
|
-
if not isinstance(date, datetime):
|
|
202
|
-
|
|
203
|
-
if isinstance(date, str):
|
|
204
|
-
date = parse(date)
|
|
205
|
-
else:
|
|
206
|
-
raise OperationalException(
|
|
207
|
-
"Date value should be either a string or datetime object"
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
if date < self._start_date_data_source:
|
|
211
|
-
raise OperationalException(
|
|
212
|
-
f"Date {date} is before the start date "
|
|
213
|
-
f"of the data source {self._start_date_data_source}"
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
if date > self._end_date_data_source:
|
|
217
|
-
raise OperationalException(
|
|
218
|
-
f"Date {date} is after the end date "
|
|
219
|
-
f"of the data source {self._end_date_data_source}"
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Filter the data based on the backtest index date and the end date
|
|
223
|
-
df = polars.read_csv(self._csv_file_path)
|
|
224
|
-
df = df.filter(
|
|
225
|
-
(df['Datetime'] >= date.strftime(DATETIME_FORMAT))
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
# Check if the dataframe is empty
|
|
229
|
-
if df.shape[0] == 0:
|
|
230
|
-
raise OperationalException(
|
|
231
|
-
f"No ticker data found for {self.symbol} "
|
|
232
|
-
f"at {date.strftime(DATETIME_FORMAT)}"
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
first_row = df.head(1)[0]
|
|
236
|
-
|
|
237
|
-
# Calculate the bid and ask price based on the high and low price
|
|
238
|
-
return {
|
|
239
|
-
"symbol": self.symbol,
|
|
240
|
-
"bid": float((first_row["Low"][0])
|
|
241
|
-
+ float(first_row["High"][0])) / 2,
|
|
242
|
-
"ask": float((first_row["Low"][0])
|
|
243
|
-
+ float(first_row["High"][0])) / 2,
|
|
244
|
-
"datetime": first_row["Datetime"][0],
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
def dataframe_to_list_of_lists(self, dataframe, columns):
|
|
248
|
-
# Extract selected columns from DataFrame and convert
|
|
249
|
-
# to a list of lists
|
|
250
|
-
data_list_of_lists = dataframe[columns].values.tolist()
|
|
251
|
-
return data_list_of_lists
|
|
252
|
-
|
|
253
|
-
def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
|
|
254
|
-
pass
|
investing_algorithm_framework/infrastructure/models/market_data_sources/us_treasury_yield.py
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
from investing_algorithm_framework.domain import MarketDataSource, \
|
|
3
|
-
BacktestMarketDataSource
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class UsTreasuryYieldDataSource(MarketDataSource):
|
|
7
|
-
"""
|
|
8
|
-
UsTreasuryYield is a subclass of MarketDataSource.
|
|
9
|
-
It is used to get the US Treasury Yield data.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
|
|
13
|
-
pass
|
|
14
|
-
|
|
15
|
-
URL = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/" \
|
|
16
|
-
"v2/accounting/od/avg_interest_rates?" \
|
|
17
|
-
"filter=record_date:gte:2024-01-01"
|
|
18
|
-
|
|
19
|
-
def get_data(
|
|
20
|
-
self,
|
|
21
|
-
time_stamp=None,
|
|
22
|
-
from_time_stamp=None,
|
|
23
|
-
to_time_stamp=None,
|
|
24
|
-
**kwargs
|
|
25
|
-
):
|
|
26
|
-
response = requests.get(self.URL)
|
|
27
|
-
|
|
28
|
-
if response.status_code == 200:
|
|
29
|
-
# Extract risk-free rate from API response
|
|
30
|
-
# (e.g., 10-year Treasury yield)
|
|
31
|
-
treasury_yield_data = response.json()
|
|
32
|
-
entries = treasury_yield_data["data"]
|
|
33
|
-
for entry in entries:
|
|
34
|
-
print(entry)
|
|
35
|
-
print(entries[-1])
|
|
36
|
-
print(entries[-1]["avg_interest_rate_amt"])
|
|
37
|
-
# print(treasury_yield_data)
|
|
38
|
-
# ten_year_yield = treasury_yield_data["data"][0]["value"]
|
|
39
|
-
# risk_free_rate = ten_year_yield / 100 # Convert
|
|
40
|
-
# percentage to decimal
|
|
41
|
-
# print("10-Year Treasury Yield (Risk-Free Rate):", risk_free_rate)
|
|
42
|
-
else:
|
|
43
|
-
print("Failed to retrieve Treasury yield data. Status code:",
|
|
44
|
-
response.status_code)
|
|
45
|
-
|
|
46
|
-
def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
|
|
47
|
-
pass
|