NVIDIA Developer Blog · · 12 min read

Automating and Optimizing Financial Signal Discovery with Multi-Agent Systems

Mirrored from NVIDIA Developer Blog for archival readability. Support the source by reading on the original site.

Automating and Optimizing Financial Signal Discovery with Multi-Agent Systems

An illustration of a woman working in finance across multiple computer screens.

In quantitative finance, researchers build algorithms to trade assets, derivatives, and other financial instruments. A key part of that work is finding signals: patterns in messy market data that may help predict future returns. These signals can come from price and volume data, economic indicators, fundamentals, or alternative sources like news sentiment.

For years, quant firms have uncovered and tested signals largely by hand. Traditionally, quantitative researchers have to manually hypothesize, code, backtest, and refine hundreds of potential signals. The workflow is often fragmented, moving between data scientists, developers, and analysts, which creates significant lag in a market that moves in milliseconds. Now, AI can help automate parts of this workflow and speed up the research cycle. The quantitative signal discovery agent developer example from NVIDIA shows how to automate signal discovery using agentic architecture built with the NVIDIA Nemotron family of open models and the NVIDIA NeMo Agent Toolkit open-source library. 

In this blog post, we walk you through a complete example of building an agentic system for signal discovery using the NeMo Agent Toolkit. 

Agentic systems for signal discovery

Agentic AI is bridging the gap between human expertise and automated efficiency. We designed a system of signal-discovery agents using NeMo Agent Toolkit to change signal discovery from a manual grind into a self-evolving, autonomous loop. The result is a painless process for designing, testing, and optimizing the agentic system.

The system coordinates three specialized agents:

  • Signal agent: Identifies potential alpha signals from market data.
  • Code agent: Translates signal descriptions into executable Python code.
  • Evaluation agent: Runs backtests, applies logical evaluation, and iteratively refines signal suggestions. 

NeMo Agent Toolkit multi-agent signal discovery loop

The NeMo Agent Toolkit provides the orchestration layer to build intelligent agents that plan complex research tasks, use tools to execute Python code, and reflect on backtesting results to refine their own hypotheses. Our proposed system consists of three specialized agents that interact in a continuous cycle of creation, execution, and refinement. The NeMo Agent Toolkit manages the “handoffs” between these agents, ensuring that context (such as signal definitions or backtest results) is preserved across the workflow.

Diagram showing the architecture of the quantitative signal discovery agent developer example, which uses the NeMo Agent Toolkit to orchestrate three specialized agents—Signal Agent, Code Agent, and Evaluation Agent—in a continuous loop of creation, execution, and refinement for financial signal discovery.
Figure 1. Architecture of the quantitative signal discovery agent developer example

The signal generator

This agent acts as the creative brain, using nemotron-3-nano-30b-a3b through NVIDIA NIM to hypothesize new signal expressions. We designed the following system prompt: “You are a senior quantitative researcher at a top hedge fund. Generate {config.num_signals} unique stock selection signals based on the request” to define the core objective of the agent.  

To ensure it produced logically sound results rather than “hallucinating” math, we provided it with a structured library of mathematical calculators as building blocks. Each calculator is a dictionary containing a name, signature, and meaning. In our example, there are 66 different operators covering operations from arithmetic, math (abs, clip, power), rank, and time series (log return, momentum, delta). For example, Rank_Add, normalizes two different sets of data (like price and volume) into a shared 0-to-1 percentile scale and sums them together. We provide the interpretation and the Python code, enabling the agent to combine different market signals into a single, balanced score. 

{
  "name": "Rank_Add",
  "signature": "Rank_Add(x: pd.DataFrame, y: pd.DataFrame) -> pd.DataFrame",
  "meanings": "Return the sum of the quantiles of the elements in DataFrame x and the corresponding elements in DataFrame y.",
  "code": "def Rank_Add(x, y):\n    rank_x = x.T.rank() / (len(x.T) + 1)\n    rank_y = y.T.rank() / (len(y.T) + 1)\n    return (rank_x + rank_y).T\n"
}

By supplying these reference operators, the agent can reason through its “toolbox” to select the best combination of operators to measure market trends, ensuring the resulting signal is both high-quality and theoretically sound. 

The signal generator outputs the “blueprint” as directed by the following prompt: 

Return each signal as a JSON object with these fields:
- name: Signal name (descriptive)
- formula: Formula using ONLY the operators listed above
- meaning: Economic intuition (what alpha it captures)
- category: One of [momentum, volatility, volume, reversal, quality, other]
- data_fields_used: List of data fields used (Open, Close, High, Low, Volume)
- operators_used: List of operators used
- lookback_periods: List of lookback days used

By asking the agent to output all the details, we ensure the interpretability and reproducibility of the signals generated by the agent; also, tracking this information will also facilitate the evaluation step further down the loop. 

The code agent

Once a hypothesis is formed, the code agent transforms natural language ideas into executable Python code. In the NeMo Agent Toolkit ecosystem, this agent is specifically tuned for tool-calling and code generation. It takes the blueprint from the signal agent and produces Python code that calculates the signal against historical price-volume data—with the operator implementations from calculator.json inlined automatically so the resulting module is self-contained and portable.

The evaluation agent

This agent processes the raw data from the code agent to calculate the Information Coefficient (IC) and Rank IC metrics that quantify how well the signal predicts price movement. In quantitative research, Rank IC is the correlation between the ranks of your signal values and the ranks of subsequent asset returns. 

Unlike the standard Pearson IC, Rank IC is more robust against outliers and focuses on the relative ordering of assets—an essential feature for building ranking-based trading strategies.

Usually, a “good” institutional-grade signal maintains a mean Rank IC between 0.02 and 0.05. Anything consistently above 0.05 is considered a very strong signal, often found in high-frequency or niche momentum strategies. 

The user can define an acceptance threshold for the evaluation agent to decide when to accept a generated signal. If a signal has suboptimal performance in backtesting, the evaluation agent generates optimization suggestions that are fed back into the Signal Agent’s next iteration. This creates a self-improving loop where each subsequent generation of signals is more refined than the last.

Why NeMo Agent Toolkit for automating signal discovery?

Using the toolkit for this specific use case provides multiple benefits:

Config-driven workflows

The toolkit helps shift the project from a rigid script to a flexible research platform. Instead of hard-coding the interactions between agents, you define the system’s logic—including personas, tools, and constraints—entirely within a YAML configuration. This modularity makes it trivial to swap models for different tasks. For example, you can assign a high-reasoning model to handle hypothesis generation while using a faster, more cost-effective model for the code agent without modifying the underlying source code.

In our implementation, the config.yml acts as the single source of truth for the entire signal discovery experiment. It centralizes every critical parameter, from the IC thresholds to the depth of the optimization loop. This enables quantitative researchers to iterate at high velocity—adjusting the forward-returns period or tightening the IC requirements—simply by editing a YAML file.

llms:
  signal_generator:
    _type: nim
    model_name: nvidia/nemotron-3-nano-30b-a3b
    base_url: "https://integrate.api.nvidia.com/v1/"
    temperature: 0.8
    max_tokens: 3000

  code_generator:
    _type: nim
    model_name: nvidia/nemotron-3-nano-30b-a3b
    base_url: "https://integrate.api.nvidia.com/v1/"
    temperature: 0.0
    max_tokens: 2000

  optimization_advisor:
    _type: nim
    model_name: nvidia/nemotron-3-nano-30b-a3b
    base_url: "https://integrate.api.nvidia.com/v1/"
    temperature: 0.5
    max_tokens: 1000

workflow:
  _type: signal_optimizer
  signal_generator_llm: signal_generator
  code_generator_llm: code_generator
  optimization_advisor_llm: optimization_advisor
  ic_threshold: 0.02
  p_value_threshold: 0.05
  max_iterations: 3
  num_signals: 2
  forward_periods: 5

Built-in observability 

Arize Phoenix tracing adds observability to NIM-powered signal discovery agents in long-running quantitative workflows. Since signal discovery involves high-latency loops—generating complex price-volume formulas, running vectorized backtests, and performing fitness evaluations—Phoenix enables us to visualize the reasoning traces of the LLM in real time.

Screenshot showing the Phoenix UI, showing the trace of a multi-agent workflow in the NeMo Agent Toolkit for signal discovery. The trace displays the sequence of steps, token usage, and tool calls made by the signal generator and code agent.
Figure 2. NeMo Agent Toolkit Tracing provides a visual trace of the LLM agent’s reasoning across the signal discovery workflow

By tracking reasoning traces and token usage across the ChatNVIDIA() calls, we can pinpoint whether a bottleneck lies in the model’s logic generation and gain deeper insights into the agent’s thinking process at each step. This transparency is essential for debugging “silent failures” where an agent might produce a mathematically valid but economically meaningless signal, enabling optimization for both the prompt strategy and the computational costs of the discovery cycle.

End-to-end example: Mining momentum-based signals

Momentum-based signals are one of the most commonly used in trading. They are based on the empirical observation that assets that have performed well recently tend to continue their upward trajectory, while those performing poorly often continue to decline. Let’s run the workflow against this prompt:

nat run --config_file configs/config-optimization.yml --input "momentum signals"

The nat run command spins up the workflow based on the YAML config to perform the generation and optimization loop:

026-04-24 14:34:02 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:353 - === Iteration 1/3 ===
2026-04-24 14:34:02 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:355 - Generating signals...
2026-04-24 14:34:10 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:360 - Generating code...
2026-04-24 14:34:13 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:366 - Evaluating IC...
2026-04-24 14:34:13 - INFO     - signal_discovery_workflow.signal_evaluator:391 - Found 2 signal function(s): ['signal_volume_adjusted_momentum', 'signal_20_day_price_rank_momentum']
2026-04-24 14:34:15 - INFO     - signal_discovery_workflow.signal_evaluator:457 -   signal_volume_adjusted_momentum: |IC| = 0.0103
2026-04-24 14:34:18 - INFO     - signal_discovery_workflow.signal_evaluator:457 -   signal_20_day_price_rank_momentum: |IC| = 0.0138
2026-04-24 14:34:18 - INFO     - signal_discovery_workflow.signal_evaluator:472 - Selected best signal: signal_20_day_price_rank_momentum with |IC| = 0.0138
2026-04-24 14:34:19 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:371 - Mean IC: -0.0138, p-value: 7.202971903375044e-07
2026-04-24 14:34:19 - INFO     - signal_discovery_workflow.signal_discovery_optimization_workflow:413 - Generating optimization feedback...
signal_discovery_workflow.signal_discovery_optimization_workflow:353 - === Iteration 2/3 ===
...
signal_discovery_workflow.signal_discovery_optimization_workflow:353 - === Iteration 3/3 ===
...

After three optimization iterations, we get the following generated signals:

Signal 1: ExpVolume-Adjusted Momentum
    Formula:    Div(TS_Return(Close, 10), Decay_Exp(Volume, 10))
    Meaning:    10‑day price return scaled by exponentially weighted volume, isolating momentum that is amplified when trading activity is sustained
    Category:   momentum
    Data fields: Close, Volume
    Operators:   Div, TS_Return, Decay_Exp
    Lookback:    [10]

  Signal 2: Rank-Adjusted Return Momentum << SELECTED
    Formula:    Rank_Mul(Rank(Close), Rank(TS_Return(Close, 10)))
    Meaning:    Combines the relative standing of price with the relative strength of recent returns, highlighting stocks that are both highly ranked in price and showing strong upward momentum
    Category:   momentum
    Data fields: Close

Evaluation Metrics (on: signal_rank_adjusted_return_momentum):
----------------------------------------
  Mean IC: -0.0134
  IC Std: 0.1483
  IC IR: -0.0906
  T-stat: -5.3655
  P-value: 0.000000
  Num Periods: 3504
  Positive IC Ratio: 46.38%

In this demonstration, the signal agent generated two momentum-based stock-selection signals using the structured library of mathematical operators we provided.

The first, ExpVolume-Adjusted Momentum, computes each stock’s 10-day price return and divides it by an exponentially weighted moving average of trading volume over the same span:

\(\Large \text{Signal}_1(t) = \frac{ \frac{\text{Close}(t) - \text{Close}(t-10)}{\text{Close}(t-10)} }{ \mathrm{EWMA}_{\alpha}\!\left[\text{Volume}\right](t) }\)

The denominator is the recursive exponentially-weighted average with span 10:

\(\Large \mathrm{EWMA}_{\alpha}\bigl[\text{Volume}\bigr](t) = \alpha \cdot \text{Volume}(t) + (1-\alpha)\cdot \mathrm{EWMA}_{\alpha}\bigl[\text{Volume}\bigr](t-1), \qquad \alpha = \frac{2}{10+1}.\)

The intuition is that a fixed 10-day return carries more weight when supported by sustained recent volume—stocks with the same price return but weaker, fading volume receive a larger signal magnitude.

The second, Rank-Adjusted Return Momentum, composes two cross-sectional ranks: each stock’s price rank and the rank of its 10-day return, multiplied together so the signal is large only when both are high simultaneously:

\(\Large \text{Signal}_2(t) \propto \mathrm{Rank}_t\!\bigl(\text{Close}\bigr) \cdot \mathrm{Rank}_t\!\bigl(\mathrm{TS\_Return}(\text{Close}, 10)\bigr)\)

The cross-sectional rank on day \(t\) is the within-day quantile across the \(N\) S\&P 500 names:
\(\Large \mathrm{Rank}_t(x) = \frac{\mathrm{rank}\bigl(x_t\bigr)}{N+1} \in (0, 1)\)

This isolates stocks that are simultaneously highly priced \emph{and} showing strong recent momentum—the product sharpens the signal versus either rank in isolation, since middle-of-the-pack names on either dimension are damped multiplicatively.

The evaluator backtested both signals against S&P 500 forward returns and selected Rank-Adjusted Return Momentum as the stronger candidate, achieving a mean IC of -0.0134 (IC standard deviation 0.1483, information ratio -0.091) with a \(t\)-statistic of -5.37, a vanishingly small \(p\)-value (\(p < 10^{-7}\)) over 3,504 trading days.

The positive-IC ratio of 46.4% confirms the signal leans negative more often than not. While $|IC|$ sits just below the 0.02 acceptance threshold (hence the “best-effort” outcome after two iterations), the highly significant negative sign means the signal carries consistent predictive information—high-priced, high-momentum stocks systematically underperform forward, the textbook short-momentum / reversal pattern. 

Quantitative signal discovery agent developer example

We finish walking through an example of how to build a highly scalable, flexible, and powerful engine for uncovering new sources of alpha. The quantitative signal discovery agent developer example is easily extensible:

  • Try different signal categories by changing the –input string, such as “volatility signals”, “mean reversion signals”, or “volume-price divergence signals”.
  • Mix model sizes per agent. Assign a higher-capability reasoning model like nemotron-3-super-120b-a12b to the signal agent for richer ideation while keeping the smaller nemotron-3-nano-30b-a3b for the code agent and advisor, only a one-line change in YAML.
  • Add your own operators by editing template/calculator.json. Drop in your firm’s proprietary technical indicators or alternative-data transforms; the signal agent will discover them automatically on the next run.
  • Plug in your own data. Replace the included S&P 500 CSVs with your own universe (Asian equities, crypto, ETFs) or add new data fields like fundamentals or sentiment.
  • Tune the optimization criteria—such as ic_threshold, max_iterations, and forward_periods—to match your investment style.

Get started

Visit build.nvidia.com to deploy the notebook in a GPU-accelerated environment with either NVIDIA Brev or your own cloud infrastructure using the quantitative signal discovery agent notebook on GitHub.

Discuss (0)

Tags

Agentic AI / Generative AI | Financial Services | Blueprint | NeMo | Nemotron | Intermediate Technical | AI Agent

About the Authors

Avatar photo
About Peihan Huo
Peihan Huo is a solutions architect on the Financial Services Industry team at NVIDIA. He has expertise in mathematical optimization, reinforcement learning, and financial modeling. Currently, his work focuses on accelerating capital markets workflows by leveraging NVIDIA’s advanced computing technologies. Peihan earned a bachelor's degree in Applied Mathematics from Brown University and a PhD in Applied Mathematics from Cornell University.
Avatar photo
About Yang Shen
Yang Shen is an analyst in Quantitative Research at Huatai Securities. He joined Huatai Securities in 2023 and focuses primarily on quantitative strategy research and large language model applications in investment research. Yang holds both a Bachelor’s degree and a Master’s degree in Psychology from Peking University.
Avatar photo
About Hanyue He
Hanyue He is a solutions architect on the China Financial Services Industry team at NVIDIA. She has expertise in LLM inference and LLM applications. Currently, her work focuses on supporting the development of top AI labs in China by leveraging NVIDIA libraries. Hanyue earned a bachelor’s degree in Internet of Things from Beijing University of Posts and Telecommunications and a master’s degree in Computer Science from Hong Kong University.
Avatar photo
About Ioana Boier
Ioana Boier is the global head of Capital Markets Strategy at NVIDIA. Her background is in Quantitative Finance and Computer Science research. Prior to joining NVIDIA, she was the head of Quantitative Portfolio Solutions at Alphadyne Asset Management, and led research teams at Citadel LLC, BNP Paribas, and IBM T.J. Watson Research. She has a PhD in Computer Science from Purdue University and is the author of multiple peer-reviewed publications, patents, and the winner of several awards for applied research delivered into products.

Comments

Discussion (0)

Sign in to join the discussion. Free account, 30 seconds — email code or GitHub.

Sign in →

No comments yet. Sign in and be the first to say something.

More from NVIDIA Developer Blog