
Ml Strategy
Machine-learning predictive strategy based on sklearn walk-forward training, feature...
Install
npx skills add HKUDS/Vibe-Trading --skill ml-strategy -g -a claude-code -y- Repository
- HKUDS/Vibe-Trading37.4k
- Category
- Engineering
- Updated
- 3d ago
- License
- MIT
- Context cost
- Mediumabout 3,000 tokens
- Runs scripts
- No, instructions only
What it does
Machine-learning predictive strategy based on sklearn walk-forward training, feature engineering, and signal generation. Suitable for any OHLCV data.
Machine-Learning Predictive Strategy
Purpose
Use sklearn machine-learning models (RandomForest / GradientBoosting / Ridge) to predict the direction of future returns and generate trading signals. Walk-forward training is used to avoid future data leakage, and feature engineering extracts useful factors from OHLCV data.
Signal Logic
- Validate input: check OHLCV columns, minimum row count, NaN ratio, skip symbols that fail
- Feature engineering: build multi-dimensional factors from raw OHLCV data (momentum, volatility, RSI, moving-average ratios, volume ratio, and more). All features are sanitized (inf removed, division-by-zero guarded)
- Label construction: future N-day return > 0 is the positive class (
1), < 0 is the negative class (0) - Walk-forward training: use an expanding or sliding window, train on historical data only, and roll forward day by day for prediction
- Signal generation: map
predict_proba[:, 1]to[-1.0, 1.0], or use discrete signals frompredictin{-1, 0, 1}. Output is guaranteed clean (no NaN, clipped to range)
Complete SignalEngine Example
This is the recommended full pipeline. Copy and customise, safety is built in.
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
def validate_data(df: pd.DataFrame, min_rows: int = 300) -> bool:
"""Check that OHLCV data meets minimum quality for ML training.
Args:
df: DataFrame with DatetimeIndex.
min_rows: Minimum number of rows required.
Returns:
True if data is usable.
"""
required = {"open", "high", "low", "close", "volume"}
if not required.issubset(df.columns):
return False
if len(df) < min_rows:
return False
if df["close"].isnull().mean() > 0.2:
return False
return True
