quant-ai / src /models /rl_agent.py
Ypeng12's picture
feat(ai): add reinforcement learning trading agent and optimize regime switching
f73ac05
Raw History Blame Contribute Delete
2.14 kB
# src/models/rl_agent.py
"""
Quant.ai Model Wrapper for Reinforcement Learning Trading Agent.
Implements standard fit(df, feature_cols, target_col) and predict(df, feature_cols) interface.
"""
import numpy as np
import pandas as pd
from typing import List, Dict, Optional
from backend.app.ml.rl_trading_agent import TradingEnvironment, RLTradingAgent
class RLAgentModel:
def __init__(self, episodes: int = 20, learning_rate: float = 0.05, cost_bps: float = 5.0):
self.episodes = episodes
self.learning_rate = learning_rate
self.cost_bps = cost_bps
self.agent: Optional[RLTradingAgent] = None
def fit(self, train_df: pd.DataFrame, feature_cols: List[str], target_col: str = "fwd_ret_5d"):
"""Fits RL Agent policy on training dataset over multiple market episodes."""
env = TradingEnvironment(
df=train_df,
feature_cols=feature_cols,
fwd_ret_col=target_col,
cost_bps=self.cost_bps
)
state_dim = len(env.feature_cols) + 1
self.agent = RLTradingAgent(
state_dim=state_dim,
learning_rate=self.learning_rate,
epsilon_start=0.8,
epsilon_decay=0.98
)
self.agent.train(env, episodes=self.episodes)
return self
def predict(self, test_df: pd.DataFrame, feature_cols: List[str]) -> np.ndarray:
"""
Predicts continuous alpha score / target portfolio position for out-of-sample test dataset.
Returns target position weights [0.0, 1.0, 0.5] mapped as alpha score.
"""
if self.agent is None:
return np.zeros(len(test_df))
scores = []
cur_pos = 0.0
for idx, row in test_df.iterrows():
feat_vals = row[[c for c in feature_cols if c in test_df.columns]].fillna(0.0).values
state = np.append(feat_vals, cur_pos)
action_res = self.agent.predict_action(state)
target_pos = action_res["target_position"]
cur_pos = target_pos
scores.append(target_pos)
return np.array(scores)