Files
Mark Aron Szulyovszky b5ddee8dce feat(HPO): added run_hpo script (#237)
* feat(HPO): added `run_hpo` script

* fix(Linter): ran

* feat(HPO): removed any reference to sweep (superseeded by optuna)

* fix(HPO): optimize for sharpe

* fix(Config): removed glassnode data, save trials from hpo

* feat(Labelling): added three-balanced method works again

* fix(BetSizing): set the correct class labels

* fix(HPO): powerset should return what's expected, added two new normalization methods

* fix(Linter): ran

* fix(DataLoader): sort the dataframe when fetching data

* fix(Config): only take z-score of other assets
2022-03-15 14:43:16 +01:00

110 lines
3.6 KiB
Python

from data_loader.types import ForwardReturnSeries, XDataFrame, ySeries
from utils.evaluate import evaluate_predictions
from utils.helpers import equal_except_nan
from .train_model import train_model
import pandas as pd
from models.base import Model
from typing import Optional
from config.types import Config
from .types import (
BetSizingWithMetaOutcome,
ModelOverTime,
TransformationsOverTime,
)
from training.walk_forward import walk_forward_process_transformations
from transformations.base import Transformation
from labeling.labellers.utils import (
discretize_binary_zero_one,
discretize_threeway_threshold,
)
import pprint
def bet_sizing_with_meta_model(
X: XDataFrame,
input_predictions: pd.Series,
y: ySeries,
forward_returns: ForwardReturnSeries,
model: Model,
transformations: list[Transformation],
config: Config,
from_index: Optional[pd.Timestamp],
transformations_over_time: Optional[TransformationsOverTime] = None,
preloaded_models: Optional[ModelOverTime] = None,
) -> BetSizingWithMetaOutcome:
input_predictions.name = "model_predictions"
discretized_predictions = input_predictions.apply(
discretize_threeway_threshold(0.33)
)
discretized_predictions.name = "model_discretized_predictions"
meta_y: pd.Series = pd.concat([discretized_predictions, y], axis=1).apply(
equal_except_nan, axis=1
)
meta_X = pd.concat([X, input_predictions, discretized_predictions], axis=1)
if transformations_over_time is None:
print("Preprocess transformations")
transformations_over_time = walk_forward_process_transformations(
X=meta_X,
y=meta_y,
forward_returns=forward_returns,
window_size=config.initial_window_size,
retrain_every=config.retrain_every,
from_index=from_index,
transformations=transformations,
)
meta_outcome = train_model(
ticker_to_predict="prediction_correct",
X=meta_X,
y=meta_y,
forward_returns=forward_returns,
model=model,
initial_window_size=config.initial_window_size,
retrain_every=config.retrain_every,
from_index=from_index,
level="meta",
class_labels=[0, 1],
transformations_over_time=transformations_over_time,
model_over_time=preloaded_models,
)
meta_predictions = meta_outcome.predictions
bet_size = meta_outcome.probabilities.iloc[:, 1]
avg_predictions_with_sizing = input_predictions * meta_predictions * bet_size
if config.mode == "training":
pp = pprint.PrettyPrinter(depth=2)
meta_stats = evaluate_predictions(
forward_returns=forward_returns,
y_pred=meta_outcome.predictions,
y_true=meta_y,
discretize_func=discretize_binary_zero_one,
labels=[0, 1],
transaction_costs=config.transaction_costs,
)
pp.pprint(meta_stats)
stats = evaluate_predictions(
forward_returns=forward_returns,
y_pred=avg_predictions_with_sizing,
y_true=y,
discretize_func=config.labeling.get_discretize_function(),
labels=config.labeling.get_labels(),
transaction_costs=config.transaction_costs,
)
pp.pprint(stats)
else:
stats = None
model_id = "model_" + config.target_asset.file_name + "_meta"
outcome_dict = vars(meta_outcome)
outcome_dict["model_id"] = model_id
return BetSizingWithMetaOutcome(
**outcome_dict,
transformations=transformations_over_time,
weights=avg_predictions_with_sizing,
stats=stats,
)