From 7134a51afa71ab146b52987c194adace62f8b034 Mon Sep 17 00:00:00 2001 From: Yuante Li <104308117+WinstonLiyt@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:20:09 +0800 Subject: [PATCH] fix: fix some bugs in RD-Agent(Q) (#1143) * fix some bugs in RD-Agent(Q) * fix factor from report * fix ci --- .../app/qlib_rd_loop/factor_from_report.py | 21 +++++++++++++++++-- .../scenarios/qlib/developer/factor_runner.py | 2 +- .../scenarios/qlib/developer/model_runner.py | 2 +- .../scenarios/qlib/proposal/quant_proposal.py | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/rdagent/app/qlib_rd_loop/factor_from_report.py b/rdagent/app/qlib_rd_loop/factor_from_report.py index 984c7519..defb8d1f 100644 --- a/rdagent/app/qlib_rd_loop/factor_from_report.py +++ b/rdagent/app/qlib_rd_loop/factor_from_report.py @@ -12,7 +12,7 @@ from rdagent.components.document_reader.document_reader import ( load_and_process_pdfs_by_langchain, ) from rdagent.core.conf import RD_AGENT_SETTINGS -from rdagent.core.proposal import Hypothesis +from rdagent.core.proposal import Hypothesis, HypothesisFeedback from rdagent.log import rdagent_logger as logger from rdagent.oai.llm_utils import APIBackend from rdagent.scenarios.qlib.experiment.factor_experiment import QlibFactorExperiment @@ -136,8 +136,25 @@ class FactorReportLoop(FactorRDLoop, metaclass=LoopMeta): logger.log_object(exp.sub_workspace_list, tag="coder result") return exp + def feedback(self, prev_out: dict[str, Any]): + e = prev_out.get(self.EXCEPTION_KEY, None) + if e is not None: + feedback = HypothesisFeedback( + observations=str(e), + hypothesis_evaluation="", + new_hypothesis="", + reason="", + decision=False, + ) + logger.log_object(feedback, tag="feedback") + self.trace.hist.append((prev_out["direct_exp_gen"]["exp_gen"], feedback)) + else: + feedback = self.summarizer.generate_feedback(prev_out["running"], self.trace) + logger.log_object(feedback, tag="feedback") + self.trace.hist.append((prev_out["running"], feedback)) -def main(report_folder=None, path=None, all_duration: str | None = None, checkout: bool = True): + +def main(report_folder=None, path=None, all_duration=None, checkout=True): """ Auto R&D Evolving loop for fintech factors (the factors are extracted from finance reports). diff --git a/rdagent/scenarios/qlib/developer/factor_runner.py b/rdagent/scenarios/qlib/developer/factor_runner.py index ea69a9e5..667c334a 100644 --- a/rdagent/scenarios/qlib/developer/factor_runner.py +++ b/rdagent/scenarios/qlib/developer/factor_runner.py @@ -145,7 +145,7 @@ class QlibFactorRunner(CachedRunner[QlibFactorExperiment]): "lr": str(sota_training_hyperparameters.get("lr", "2e-4")), "early_stop": str(sota_training_hyperparameters.get("early_stop", 10)), "batch_size": str(sota_training_hyperparameters.get("batch_size", 256)), - "weight_decay": str(sota_training_hyperparameters.get("weight_decay", 0.0)), + "weight_decay": str(sota_training_hyperparameters.get("weight_decay", 0.0001)), } ) sota_model_type = sota_model_exp.sub_tasks[0].model_type diff --git a/rdagent/scenarios/qlib/developer/model_runner.py b/rdagent/scenarios/qlib/developer/model_runner.py index 3d3dea71..47c934e6 100644 --- a/rdagent/scenarios/qlib/developer/model_runner.py +++ b/rdagent/scenarios/qlib/developer/model_runner.py @@ -65,7 +65,7 @@ class QlibModelRunner(CachedRunner[QlibModelExperiment]): env_to_use.update( { "n_epochs": str(training_hyperparameters.get("n_epochs", "100")), - "lr": str(training_hyperparameters.get("lr", "1e-3")), + "lr": str(training_hyperparameters.get("lr", "2e-4")), "early_stop": str(training_hyperparameters.get("early_stop", 10)), "batch_size": str(training_hyperparameters.get("batch_size", 256)), "weight_decay": str(training_hyperparameters.get("weight_decay", 0.0001)), diff --git a/rdagent/scenarios/qlib/proposal/quant_proposal.py b/rdagent/scenarios/qlib/proposal/quant_proposal.py index a31bc051..b61ce4c0 100644 --- a/rdagent/scenarios/qlib/proposal/quant_proposal.py +++ b/rdagent/scenarios/qlib/proposal/quant_proposal.py @@ -61,7 +61,7 @@ class QlibQuantHypothesisGen(FactorAndModelHypothesisGen): # ========= LLM ========== elif QUANT_PROP_SETTING.action_selection == "llm": hypothesis_and_feedback = ( - T("scenarios.qlib.prompts:hypothesis_and_feedback").render(trace=trace) + T("scenarios.qlib.prompts:hypothesis_and_feedback").r(trace=trace) if len(trace.hist) > 0 else "No previous hypothesis and feedback available since it's the first round." )