AI Quantitative Research: 5 Prompts to Build a 48% Annual Return System
Can AI Really Do Quantitative Research?
This isn't hype, it's fact.
In this experiment, I used 5 prompts to have AI complete the entire workflow from "stock screening" to "backtesting" to "optimization". The final strategy achieved:
- 48.17% Annualized Return
- 1.69 Sharpe Ratio
- -30.38% Max Drawdown
In this article, I'll demonstrate 5 types of quantitative research tasks AI can perform, and share the optimization process for the final strategy.
Note: The following are historical backtest results and do not represent future performance.
Skill 1: Revenue New High Screening
First task: Find stocks with revenue hitting new highs.
Find stocks where the 3-month average revenue hits a 12-month high, with sufficient liquidity (20-day average volume > 500 lots)
Show Code
from finlab import data
from finlab.backtest import sim
# Get revenue and volume data
rev = data.get("monthly_revenue:當月營收")
vol = data.get("price:成交股數") / 1000 # Convert to lots
# Calculate conditions
rev_ma3 = rev.average(3)
rev_high = (rev_ma3 == rev_ma3.rolling(12).max())
vol_filter = vol.average(20) > 500
# Select stocks meeting conditions
position = rev_high & vol_filter
# Backtest
report = sim(position.loc['2015':], resample='M', position_limit=0.1, upload=False)
report.to_html('skill1_revenue_high.html')Pure revenue new high achieves about 19.77% annualized. A decent start, but not good enough.
Skill 2: Institutional Flow Analysis
Second task: Find stocks with consecutive trust fund buying.
Find stocks with trust fund buying for 5 consecutive days, select top 10 by buying volume
Show Code
from finlab import data
from finlab.backtest import sim
# Get trust fund trading data
trust_net = data.get("institutional_investors_trading_summary:投信買賣超股數")
vol = data.get("price:成交股數") / 1000
# Trust fund buying for 5 consecutive days
trust_buy_5d = (trust_net > 0).sustain(5)
# Liquidity filter
vol_filter = vol.average(20) > 300
# Combine conditions
cond = trust_buy_5d & vol_filter
position = trust_net[cond].is_largest(10)
# Backtest
report = sim(position.loc['2015':], resample='M', upload=False)
report.to_html('skill2_trust_buy.html')Trust fund strategy needs to be combined with other conditions to work effectively.
Skill 3: Technical Indicator Strategy
Third task: Build a momentum strategy with RSI and MACD.
Build a momentum strategy using RSI and MACD:
- RSI > 50 indicates bullish
- MACD golden cross
- Price above 60-day moving average
Show Code
from finlab import data
from finlab.backtest import sim
close = data.get("price:收盤價")
vol = data.get("price:成交股數") / 1000
# Technical indicators
rsi = data.indicator("RSI", timeperiod=14)
macd, macd_signal, macd_hist = data.indicator("MACD", fastperiod=12, slowperiod=26, signalperiod=9)
sma60 = close.average(60)
# Condition combinations
cond_rsi = rsi > 50
cond_macd = (macd > macd_signal) & (macd.shift() < macd_signal.shift())
cond_trend = close > sma60
vol_filter = vol.average(20) > 300
# Entry signals
cond = cond_rsi & cond_macd & cond_trend & vol_filter
position = close[cond].is_largest(20)
# Backtest
report = sim(position.loc['2015':], resample='W', upload=False)
report.to_html('skill3_technical.html')Pure technical indicator strategy shows unstable performance, needs fundamental support.
Skill 4: Value Investing Screening
Fourth task: Find undervalued quality companies.
Find undervalued stocks: P/E < 15, Dividend Yield > 5%, ROE > 10%
Show Code
from finlab import data
from finlab.backtest import sim
# Get valuation data
pe = data.get("price_earning_ratio:本益比")
div_yield = data.get("price_earning_ratio:殖利率(%)")
roe = data.get("fundamental_features:ROE稅後")
vol = data.get("price:成交股數") / 1000
# Value screening conditions
cond_pe = (pe > 0) & (pe < 15)
cond_yield = div_yield > 5
cond_roe = roe > 10
cond_vol = vol.average(20) > 300
# Combine conditions and select stocks
cond = cond_pe & cond_yield & cond_roe & cond_vol
position = div_yield[cond].is_largest(15)
# Backtest
report = sim(position.loc['2015':], resample='M', upload=False)
report.to_html('skill4_value.html')Value investing strategy achieves about 13.19% annualized. Stable but not exciting.
Skill 5: Consecutive Condition sustain()
This is a unique FinLab feature: sustain() detects whether conditions hold consecutively.
Show Code
# Revenue YoY growth > 10% for 3 consecutive months
rev_growth = data.get("monthly_revenue:去年同月增減(%)")
consecutive_growth = (rev_growth > 10).sustain(3)
# This is stricter than single conditions, filtering out one-time growthThis feature plays a crucial role in the ultimate strategy.
The Problem: No Single Strategy Is Good Enough
After seeing four skills, what did you notice?
| Strategy | Annualized Return | Problem |
|---|---|---|
| Revenue New High | ~20% | Doesn't filter false breakouts |
| Trust Fund Buying | Unstable | Needs fundamental support |
| Technical Indicators | Unstable | Too much noise |
| Value Investing | ~13% | Lacks momentum |
No single strategy reaches the 30%+ target.
This is where AI's true value begins...
Want to build your own strategy?
Describe your stock-picking ideas in natural language. AI automatically validates, backtests, and gives you answers
Start Free