ml_crypto_lab/README.md
2026-06-26 14:23:12 +07:00

186 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ml_crypto_lab
Удобный проектный каркас для ML-исследований торговых режимов:
- проектирование признаков;
- проектирование целевых параметров;
- обучение моделей;
- сохранение полного описания эксперимента;
- создание ансамблей;
- повторное использование сохранённых моделей на новых данных.
Главная идея: **каждый артефакт знает, из чего он был создан**.
Модель сохраняется не просто как `model.pkl`, а вместе с:
- списком входных признаков;
- именем target;
- параметрами признаков;
- параметрами target-а;
- параметрами модели;
- результатами train/test/valid;
- backtest-метриками;
- версией кода/конфига.
## Быстрый запуск
```bash
pip install -r requirements.txt
python scripts/run_full_experiment.py --config configs/experiment.yaml
```
После запуска появится папка:
```text
artifacts/runs/<run_id>/
```
В ней будут:
```text
models/ сохранённые модели
predictions/ предсказания моделей
reports/ таблицы результатов
ensembles/ ансамбли
run_config.yaml фактический конфиг запуска
registry_snapshot.json что было доступно в registry
```
## Основные сущности
### Feature Builder
Любая функция, которая принимает OHLCV-данные и возвращает DataFrame признаков.
Пример:
```python
@FEATURE_REGISTRY.register("market_basic")
def build_market_basic(df, cfg):
...
return features_df
```
### Target Builder
Любая функция, которая принимает OHLCV-данные и возвращает Series/DataFrame target-ов.
```python
@TARGET_REGISTRY.register("zigzag")
def build_zigzag_targets(df, cfg):
...
return target_df
```
### Model Factory
Фабрика модели. Возвращает объект с `.fit()` и `.predict()`.
```python
@MODEL_REGISTRY.register("logreg")
def make_logreg(cfg):
return SklearnBinaryModel(...)
```
### Experiment
Комбинация:
```text
feature_set + target + model
```
Каждая такая комбинация сохраняется отдельно.
## Как добавить новый признак
Создай файл, например:
```text
src/ml_crypto_lab/features/my_features.py
```
Добавь:
```python
from ml_crypto_lab.core.registry import FEATURE_REGISTRY
@FEATURE_REGISTRY.register("my_feature_block")
def build_my_features(df, cfg):
out = ...
return out
```
Потом добавь имя в `configs/experiment.yaml`:
```yaml
feature_sets:
my_set:
builders:
- name: my_feature_block
params: {}
```
## Как добавить новый target
Аналогично:
```python
from ml_crypto_lab.core.registry import TARGET_REGISTRY
@TARGET_REGISTRY.register("my_target")
def build_my_target(df, cfg):
return target_df
```
И в конфиг:
```yaml
target_sets:
my_targets:
builders:
- name: my_target
params: {}
```
## Как добавить новую модель
```python
from ml_crypto_lab.core.registry import MODEL_REGISTRY
@MODEL_REGISTRY.register("my_model")
def make_my_model(cfg):
return MyModelWrapper(...)
```
## Важная логика
Проект специально разделяет:
```text
features
отдельно
targets
отдельно
models
отдельно
experiments
отдельно
ensembles
отдельно
```
Так не возникает ситуации, когда непонятно:
```text
какая модель
на каких признаках
по какому target-у
с какими параметрами
была обучена
```