bquant 0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. bquant/__init__.py +31 -0
  2. bquant/analysis/__init__.py +297 -0
  3. bquant/analysis/candlestick/__init__.py +100 -0
  4. bquant/analysis/chart/__init__.py +98 -0
  5. bquant/analysis/statistical/__init__.py +414 -0
  6. bquant/analysis/statistical/hypothesis_testing.py +657 -0
  7. bquant/analysis/technical/__init__.py +98 -0
  8. bquant/analysis/timeseries/__init__.py +102 -0
  9. bquant/analysis/zones/__init__.py +547 -0
  10. bquant/analysis/zones/sequence_analysis.py +661 -0
  11. bquant/analysis/zones/zone_features.py +520 -0
  12. bquant/cli.py +160 -0
  13. bquant/core/__init__.py +112 -0
  14. bquant/core/cache.py +534 -0
  15. bquant/core/config.py +328 -0
  16. bquant/core/exceptions.py +351 -0
  17. bquant/core/logging_config.py +368 -0
  18. bquant/core/numpy_fix.py +99 -0
  19. bquant/core/performance.py +554 -0
  20. bquant/core/utils.py +327 -0
  21. bquant/data/__init__.py +85 -0
  22. bquant/data/loader.py +436 -0
  23. bquant/data/processor.py +644 -0
  24. bquant/data/samples/__init__.py +442 -0
  25. bquant/data/samples/datasets.py +246 -0
  26. bquant/data/samples/embedded/__init__.py +16 -0
  27. bquant/data/samples/embedded/mt_xauusd_m15.py +9018 -0
  28. bquant/data/samples/embedded/tv_xauusd_1h.py +17018 -0
  29. bquant/data/samples/utils.py +393 -0
  30. bquant/data/schemas.py +285 -0
  31. bquant/data/validator.py +498 -0
  32. bquant/indicators/__init__.py +115 -0
  33. bquant/indicators/base.py +487 -0
  34. bquant/indicators/calculators.py +404 -0
  35. bquant/indicators/library.py +514 -0
  36. bquant/indicators/loaders.py +413 -0
  37. bquant/indicators/macd.py +754 -0
  38. bquant/ml/__init__.py +19 -0
  39. bquant/visualization/__init__.py +316 -0
  40. bquant/visualization/charts.py +616 -0
  41. bquant/visualization/statistical.py +812 -0
  42. bquant/visualization/themes.py +599 -0
  43. bquant/visualization/zones.py +775 -0
  44. bquant-0.0.0.dist-info/METADATA +167 -0
  45. bquant-0.0.0.dist-info/RECORD +49 -0
  46. bquant-0.0.0.dist-info/WHEEL +5 -0
  47. bquant-0.0.0.dist-info/entry_points.txt +2 -0
  48. bquant-0.0.0.dist-info/licenses/LICENSE +21 -0
  49. bquant-0.0.0.dist-info/top_level.txt +1 -0
bquant/__init__.py ADDED
@@ -0,0 +1,31 @@
1
+ """
2
+ BQuant - Quantitative Research Toolkit for Financial Markets
3
+
4
+ A comprehensive toolkit for quantitative analysis of financial data,
5
+ starting with MACD analysis and expandable to all aspects of market research.
6
+ """
7
+
8
+ __version__ = "0.0.0"
9
+ __author__ = "kogriv"
10
+ __email__ = "kogriv@gmail.com"
11
+
12
+ # Core exports
13
+ from bquant.core.config import (
14
+ get_data_path,
15
+ get_indicator_params,
16
+ validate_timeframe,
17
+ PROJECT_ROOT,
18
+ DATA_DIR
19
+ )
20
+
21
+ # Version info
22
+ __all__ = [
23
+ "__version__",
24
+ "__author__",
25
+ "__email__",
26
+ "get_data_path",
27
+ "get_indicator_params",
28
+ "validate_timeframe",
29
+ "PROJECT_ROOT",
30
+ "DATA_DIR"
31
+ ]
@@ -0,0 +1,297 @@
1
+ """
2
+ Модуль анализа данных BQuant
3
+
4
+ Этот модуль содержит различные виды анализа финансовых данных:
5
+ - Статистический анализ
6
+ - Анализ зон
7
+ - Технический анализ
8
+ - Анализ свечей
9
+ - Временной анализ
10
+ - Графический анализ
11
+ """
12
+
13
+ from typing import Dict, Any, Optional, List
14
+ import pandas as pd
15
+ from datetime import datetime
16
+
17
+ from ..core.logging_config import get_logger
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ # Версия модуля анализа
22
+ __version__ = "0.0.0"
23
+
24
+ # Поддерживаемые виды анализа
25
+ SUPPORTED_ANALYSIS_TYPES = {
26
+ 'statistical': 'Статистический анализ данных и гипотез',
27
+ 'zones': 'Анализ зон и паттернов',
28
+ 'technical': 'Технический анализ индикаторов',
29
+ 'chart': 'Графический анализ и паттерны',
30
+ 'candlestick': 'Анализ свечных паттернов',
31
+ 'timeseries': 'Временной анализ данных'
32
+ }
33
+
34
+
35
+ class AnalysisResult:
36
+ """
37
+ Базовый класс для результатов анализа.
38
+
39
+ Attributes:
40
+ analysis_type: Тип проведенного анализа
41
+ timestamp: Время проведения анализа
42
+ data_size: Размер анализируемых данных
43
+ results: Словарь с результатами анализа
44
+ metadata: Дополнительные метаданные
45
+ """
46
+
47
+ def __init__(self, analysis_type: str, results: Dict[str, Any],
48
+ data_size: int = 0, metadata: Optional[Dict[str, Any]] = None):
49
+ """
50
+ Инициализация результата анализа.
51
+
52
+ Args:
53
+ analysis_type: Тип анализа
54
+ results: Результаты анализа
55
+ data_size: Размер данных
56
+ metadata: Дополнительные метаданные
57
+ """
58
+ self.analysis_type = analysis_type
59
+ self.timestamp = datetime.now()
60
+ self.data_size = data_size
61
+ self.results = results or {}
62
+ self.metadata = metadata or {}
63
+
64
+ logger.debug(f"Created {analysis_type} analysis result with {data_size} data points")
65
+
66
+ def to_dict(self) -> Dict[str, Any]:
67
+ """
68
+ Конвертация результата в словарь.
69
+
70
+ Returns:
71
+ Словарь с результатами анализа
72
+ """
73
+ return {
74
+ 'analysis_type': self.analysis_type,
75
+ 'timestamp': self.timestamp.isoformat(),
76
+ 'data_size': self.data_size,
77
+ 'results': self.results,
78
+ 'metadata': self.metadata
79
+ }
80
+
81
+ def save_to_csv(self, file_path: str) -> None:
82
+ """
83
+ Сохранение результатов в CSV файл.
84
+
85
+ Args:
86
+ file_path: Путь к файлу для сохранения
87
+ """
88
+ try:
89
+ # Пытаемся конвертировать результаты в DataFrame
90
+ if isinstance(self.results, dict) and self.results:
91
+ # Если результаты можно представить как табличные данные
92
+ df = pd.DataFrame(self.results)
93
+ df.to_csv(file_path, index=False)
94
+ logger.info(f"Analysis results saved to {file_path}")
95
+ else:
96
+ # Сохраняем как простую структуру
97
+ data = self.to_dict()
98
+ df = pd.DataFrame([data])
99
+ df.to_csv(file_path, index=False)
100
+ logger.info(f"Analysis metadata saved to {file_path}")
101
+ except Exception as e:
102
+ logger.error(f"Failed to save analysis results to CSV: {e}")
103
+ raise
104
+
105
+ def __str__(self) -> str:
106
+ """Строковое представление результата."""
107
+ return f"AnalysisResult({self.analysis_type}, {self.data_size} points, {self.timestamp})"
108
+
109
+ def __repr__(self) -> str:
110
+ """Детальное представление результата."""
111
+ return (f"AnalysisResult(type='{self.analysis_type}', "
112
+ f"data_size={self.data_size}, "
113
+ f"results_keys={list(self.results.keys())}, "
114
+ f"timestamp='{self.timestamp}')")
115
+
116
+
117
+ class BaseAnalyzer:
118
+ """
119
+ Базовый класс для всех анализаторов BQuant.
120
+
121
+ Обеспечивает общий интерфейс и функциональность для различных видов анализа.
122
+ """
123
+
124
+ def __init__(self, name: str, config: Optional[Dict[str, Any]] = None):
125
+ """
126
+ Инициализация базового анализатора.
127
+
128
+ Args:
129
+ name: Имя анализатора
130
+ config: Конфигурация анализатора
131
+ """
132
+ self.name = name
133
+ self.config = config or {}
134
+ self.logger = get_logger(f"{__name__}.{name}")
135
+
136
+ self.logger.info(f"Initialized {name} analyzer")
137
+
138
+ def validate_data(self, data: pd.DataFrame) -> bool:
139
+ """
140
+ Валидация входных данных.
141
+
142
+ Args:
143
+ data: DataFrame с данными для анализа
144
+
145
+ Returns:
146
+ True если данные корректны
147
+ """
148
+ if data is None or data.empty:
149
+ self.logger.error("Data is None or empty")
150
+ return False
151
+
152
+ if len(data) < self.config.get('min_data_points', 10):
153
+ self.logger.error(f"Insufficient data points: {len(data)} < {self.config.get('min_data_points', 10)}")
154
+ return False
155
+
156
+ return True
157
+
158
+ def analyze(self, data: pd.DataFrame, **kwargs) -> AnalysisResult:
159
+ """
160
+ Основной метод анализа. Должен быть переопределен в дочерних классах.
161
+
162
+ Args:
163
+ data: DataFrame с данными для анализа
164
+ **kwargs: Дополнительные параметры
165
+
166
+ Returns:
167
+ AnalysisResult с результатами анализа
168
+ """
169
+ raise NotImplementedError("analyze method must be implemented in subclass")
170
+
171
+ def prepare_data(self, data: pd.DataFrame) -> pd.DataFrame:
172
+ """
173
+ Подготовка данных перед анализом.
174
+
175
+ Args:
176
+ data: Исходные данные
177
+
178
+ Returns:
179
+ Подготовленные данные
180
+ """
181
+ # Базовая подготовка - просто копируем данные
182
+ prepared_data = data.copy()
183
+
184
+ # Сортируем по индексу если это временные данные
185
+ if isinstance(prepared_data.index, pd.DatetimeIndex):
186
+ prepared_data = prepared_data.sort_index()
187
+
188
+ self.logger.debug(f"Prepared {len(prepared_data)} data points for analysis")
189
+ return prepared_data
190
+
191
+
192
+ def get_available_analyzers() -> Dict[str, str]:
193
+ """
194
+ Получить список доступных анализаторов.
195
+
196
+ Returns:
197
+ Словарь {анализатор: описание}
198
+ """
199
+ analyzers = {}
200
+
201
+ # Статистические анализаторы
202
+ try:
203
+ from .statistical import get_statistical_analyzers
204
+ analyzers.update(get_statistical_analyzers())
205
+ except ImportError:
206
+ logger.debug("Statistical analyzers not available")
207
+
208
+ # Зональные анализаторы
209
+ try:
210
+ from .zones import get_zone_analyzers
211
+ analyzers.update(get_zone_analyzers())
212
+ except ImportError:
213
+ logger.debug("Zone analyzers not available")
214
+
215
+ # Технические анализаторы
216
+ try:
217
+ from .technical import get_technical_analyzers
218
+ analyzers.update(get_technical_analyzers())
219
+ except ImportError:
220
+ logger.debug("Technical analyzers not available")
221
+
222
+ # Свечные анализаторы
223
+ try:
224
+ from .candlestick import get_candlestick_analyzers
225
+ analyzers.update(get_candlestick_analyzers())
226
+ except ImportError:
227
+ logger.debug("Candlestick analyzers not available")
228
+
229
+ # Временные анализаторы
230
+ try:
231
+ from .timeseries import get_timeseries_analyzers
232
+ analyzers.update(get_timeseries_analyzers())
233
+ except ImportError:
234
+ logger.debug("Timeseries analyzers not available")
235
+
236
+ # Графические анализаторы
237
+ try:
238
+ from .chart import get_chart_analyzers
239
+ analyzers.update(get_chart_analyzers())
240
+ except ImportError:
241
+ logger.debug("Chart analyzers not available")
242
+
243
+ return analyzers
244
+
245
+
246
+ def create_analyzer(analyzer_type: str, **kwargs) -> BaseAnalyzer:
247
+ """
248
+ Фабрика для создания анализаторов.
249
+
250
+ Args:
251
+ analyzer_type: Тип анализатора
252
+ **kwargs: Параметры для анализатора
253
+
254
+ Returns:
255
+ Экземпляр анализатора
256
+ """
257
+ # Здесь будет реализована фабрика анализаторов
258
+ # Пока возвращаем базовый анализатор
259
+ logger.info(f"Creating {analyzer_type} analyzer")
260
+
261
+ if analyzer_type not in SUPPORTED_ANALYSIS_TYPES:
262
+ raise ValueError(f"Unsupported analyzer type: {analyzer_type}")
263
+
264
+ # Возвращаем базовый анализатор как заглушку
265
+ return BaseAnalyzer(analyzer_type, kwargs)
266
+
267
+
268
+ # Ленивый импорт подмодулей для избежания циклических зависимостей
269
+ def __getattr__(name: str):
270
+ """Ленивый импорт подмодулей."""
271
+ import importlib
272
+
273
+ if name == 'statistical':
274
+ return importlib.import_module('.statistical', __name__)
275
+ elif name == 'zones':
276
+ return importlib.import_module('.zones', __name__)
277
+ elif name == 'technical':
278
+ return importlib.import_module('.technical', __name__)
279
+ elif name == 'chart':
280
+ return importlib.import_module('.chart', __name__)
281
+ elif name == 'candlestick':
282
+ return importlib.import_module('.candlestick', __name__)
283
+ elif name == 'timeseries':
284
+ return importlib.import_module('.timeseries', __name__)
285
+ else:
286
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
287
+
288
+
289
+ # Экспорт основных классов и функций
290
+ __all__ = [
291
+ 'AnalysisResult',
292
+ 'BaseAnalyzer',
293
+ 'get_available_analyzers',
294
+ 'create_analyzer',
295
+ 'SUPPORTED_ANALYSIS_TYPES',
296
+ '__version__'
297
+ ]
@@ -0,0 +1,100 @@
1
+ """
2
+ Модуль анализа свечных паттернов BQuant
3
+
4
+ Предоставляет функции для анализа японских свечей:
5
+ - Распознавание свечных паттернов
6
+ - Анализ price action
7
+ - Паттерны разворота и продолжения
8
+ - Доджи, молот, повешенный и другие формации
9
+
10
+ СТАТУС: Заглушка - будет реализован в будущих версиях
11
+ """
12
+
13
+ from typing import Dict, List, Any, Optional
14
+ import pandas as pd
15
+
16
+ from ...core.logging_config import get_logger
17
+ from .. import BaseAnalyzer, AnalysisResult
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ # Версия модуля анализа свечей
22
+ __version__ = "0.1.0-stub"
23
+
24
+
25
+ class CandlestickAnalyzer(BaseAnalyzer):
26
+ """
27
+ Заглушка для анализатора свечных паттернов.
28
+ """
29
+
30
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
31
+ """
32
+ Инициализация анализатора свечных паттернов.
33
+
34
+ Args:
35
+ config: Конфигурация анализатора
36
+ """
37
+ super().__init__("CandlestickAnalyzer", config)
38
+ self.logger.warning("CandlestickAnalyzer is a stub implementation")
39
+
40
+ def analyze(self, data: pd.DataFrame, **kwargs) -> AnalysisResult:
41
+ """
42
+ Заглушка для анализа свечных паттернов.
43
+
44
+ Args:
45
+ data: DataFrame с OHLCV данными
46
+ **kwargs: Дополнительные параметры
47
+
48
+ Returns:
49
+ AnalysisResult с заглушкой результатов
50
+ """
51
+ self.logger.info("Performing stub candlestick analysis")
52
+
53
+ results = {
54
+ 'status': 'stub_implementation',
55
+ 'message': 'Candlestick analysis module is not yet implemented',
56
+ 'planned_features': [
57
+ 'Candlestick pattern recognition',
58
+ 'Price action analysis',
59
+ 'Reversal patterns',
60
+ 'Continuation patterns',
61
+ 'Doji, hammer, hanging man detection'
62
+ ]
63
+ }
64
+
65
+ metadata = {
66
+ 'analyzer': 'CandlestickAnalyzer',
67
+ 'implementation_status': 'stub',
68
+ 'version': __version__
69
+ }
70
+
71
+ return AnalysisResult(
72
+ analysis_type='candlestick',
73
+ results=results,
74
+ data_size=len(data),
75
+ metadata=metadata
76
+ )
77
+
78
+
79
+ def get_candlestick_analyzers() -> Dict[str, str]:
80
+ """
81
+ Получить список доступных анализаторов свечных паттернов.
82
+
83
+ Returns:
84
+ Словарь {анализатор: описание}
85
+ """
86
+ return {
87
+ 'candlestick': 'Анализ свечных паттернов (заглушка)',
88
+ 'price_action': 'Price action анализ (заглушка)',
89
+ 'reversal': 'Паттерны разворота (заглушка)',
90
+ 'continuation': 'Паттерны продолжения (заглушка)',
91
+ 'doji': 'Доджи паттерны (заглушка)'
92
+ }
93
+
94
+
95
+ # Экспорт
96
+ __all__ = [
97
+ 'CandlestickAnalyzer',
98
+ 'get_candlestick_analyzers',
99
+ '__version__'
100
+ ]
@@ -0,0 +1,98 @@
1
+ """
2
+ Модуль графического анализа BQuant
3
+
4
+ Предоставляет функции для графического анализа финансовых данных:
5
+ - Анализ графических паттернов
6
+ - Распознавание формаций
7
+ - Трендовые линии
8
+ - Фигуры технического анализа
9
+
10
+ СТАТУС: Заглушка - будет реализован в будущих версиях
11
+ """
12
+
13
+ from typing import Dict, List, Any, Optional
14
+ import pandas as pd
15
+
16
+ from ...core.logging_config import get_logger
17
+ from .. import BaseAnalyzer, AnalysisResult
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ # Версия модуля графического анализа
22
+ __version__ = "0.1.0-stub"
23
+
24
+
25
+ class ChartAnalyzer(BaseAnalyzer):
26
+ """
27
+ Заглушка для анализатора графических паттернов.
28
+ """
29
+
30
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
31
+ """
32
+ Инициализация анализатора графических паттернов.
33
+
34
+ Args:
35
+ config: Конфигурация анализатора
36
+ """
37
+ super().__init__("ChartAnalyzer", config)
38
+ self.logger.warning("ChartAnalyzer is a stub implementation")
39
+
40
+ def analyze(self, data: pd.DataFrame, **kwargs) -> AnalysisResult:
41
+ """
42
+ Заглушка для графического анализа.
43
+
44
+ Args:
45
+ data: DataFrame с данными
46
+ **kwargs: Дополнительные параметры
47
+
48
+ Returns:
49
+ AnalysisResult с заглушкой результатов
50
+ """
51
+ self.logger.info("Performing stub chart analysis")
52
+
53
+ results = {
54
+ 'status': 'stub_implementation',
55
+ 'message': 'Chart analysis module is not yet implemented',
56
+ 'planned_features': [
57
+ 'Chart pattern recognition',
58
+ 'Trend line detection',
59
+ 'Formation analysis',
60
+ 'Visual pattern matching'
61
+ ]
62
+ }
63
+
64
+ metadata = {
65
+ 'analyzer': 'ChartAnalyzer',
66
+ 'implementation_status': 'stub',
67
+ 'version': __version__
68
+ }
69
+
70
+ return AnalysisResult(
71
+ analysis_type='chart',
72
+ results=results,
73
+ data_size=len(data),
74
+ metadata=metadata
75
+ )
76
+
77
+
78
+ def get_chart_analyzers() -> Dict[str, str]:
79
+ """
80
+ Получить список доступных анализаторов графических паттернов.
81
+
82
+ Returns:
83
+ Словарь {анализатор: описание}
84
+ """
85
+ return {
86
+ 'chart': 'Графический анализ (заглушка)',
87
+ 'patterns': 'Графические паттерны (заглушка)',
88
+ 'trendlines': 'Трендовые линии (заглушка)',
89
+ 'formations': 'Графические формации (заглушка)'
90
+ }
91
+
92
+
93
+ # Экспорт
94
+ __all__ = [
95
+ 'ChartAnalyzer',
96
+ 'get_chart_analyzers',
97
+ '__version__'
98
+ ]