乐于分享
好东西不私藏

AI + 量化交易实战:用自然语言从 0 搭建股票策略系统(完整代码)

AI + 量化交易实战:用自然语言从 0 搭建股票策略系统(完整代码)

🤖 AI + 量化交易实战:用自然语言从 0 搭建股票策略系统(完整代码)

Cursor / Claude Code + Backtrader 实战全记录:Prompt 模板 → 可运行代码 → 回测报告 → 风控模块 → 模拟盘部署零 Python 基础?2 小时跑通你的第一个 AI 量化策略
量化实战CursorBacktraderAI 编程2026
学习门槛
纯自然语言交互,无需写代码
策略开发时间
2小时
从想法到完整回测
代码行数
~120行
AI 生成,注释完整
回测周期
2022-2024
3年A股历史数据
🔄 实战全流程:从想法到回测只需要 6 步
STEP 1
💬
描述策略
STEP 2
🤖
AI 生成代码
STEP 3
⚙️
安装依赖
STEP 4
📊
获取数据
STEP 5
🚀
运行回测
STEP 6
📈
查看报告
📝 STEP 1:核心武器 — AI 量化 Prompt 模板库
💡 Prompt 设计原则
一个好的量化 Prompt 包含五要素:策略逻辑 + 数据要求 + 风控参数 + 输出格式 + 参考框架。 要素越清晰,AI 生成的代码质量越高。

📌 Prompt 模板 A:双均线趋势策略

【角色设定】你是量化交易专家,精通 Python + Backtrader 框架。【策略描述】• 标的:贵州茅台(600519)• 入场逻辑:当 5 日均线(MA5)上穿 20 日均线(MA20)时,以收盘价全仓买入• 出场逻辑:当 MA5 下穿 MA20 时,以收盘价全仓卖出• 止损:持仓亏损达到 5% 时强制平仓• 止盈:持仓盈利达到 15% 时强制平仓【资金设定】• 初始资金:100,000 元• 单次仓位:不超过 30%(分仓操作)【数据要求】• 数据源:使用 akshare 获取 2022-01-01 至 2024-12-31 的日线数据• 字段:日期,开高低收,成交量【回测要求】• 佣金:双边 0.03%• 输出指标:总收益率、年化收益率、夏普比率、最大回撤、胜率、盈亏比• 生成净值曲线图并保存为 equity_curve.png【代码要求】• 使用 Python 3.10+,Backtrader 最新版• 完整注释,关键逻辑加中文注释• 包含数据获取、策略编写、回测运行、报告输出四个模块• 代码可直接复制运行(python strategy.py)

📌 Prompt 模板 B:RSI 超卖反转策略(进阶)

【角色设定】你是量化交易专家,精通 Python + Backtrader 框架,擅长均值回归策略。【策略描述】• 标的:比亚迪(002594)• 入场逻辑:RSI(14) 低于 30 且价格处于 20 日均线下方,买入信号• 出场逻辑:RSI(14) 高于 70 或价格达到 10% 止盈,卖出信号• 加仓规则:RSI 低于 20 时允许补仓,补仓量为原仓位的 50%【风控模块】• 单次最大亏损限制:账户总资金的 2%• 日内最大开仓次数:3 次• 隔夜持仓限制:不持仓过夜(收盘前 5 分钟平仓)【数据要求】使用 akshare 获取 2023-01-01 至 2025-12-31 的日线数据【输出要求】• 完整可运行代码(python rsi_strategy.py)• 完整中文注释• 输出回测绩效表(文本格式)+ equity_curve.png• 输出月度收益明细表格

📌 Prompt 模板 C:多因子选股策略(高阶)

【角色设定】你是量化交易专家,精通 Python + Pandas + Backtrader,擅长多因子选股。【因子定义】• 价值因子:PE(市盈率)< 30 且 > 0• 动量因子:近 20 日收益率排名前 30%• 质量因子:ROE(净资产收益率)> 10%• 筛选条件:三个因子同时满足,每月第一个交易日换仓【标的范围】沪深 300 成分股(通过 akshare 获取成分股列表)【持仓数量】每次最多持有 10 只股票,等权分配【回测时间】2021-01-01 至 2024-12-31【输出】完整 Python 代码(python multi_factor.py),含回测绩效和多空组合对比
💻 STEP 2-3:AI 生成的完整可运行代码
说明:此代码由 Cursor/Claude Code 根据上方 Prompt 模板 A 自动生成。 包含数据获取、策略逻辑、回测引擎、绩效报告四大模块。 运行前需先安装依赖。点击标题栏右侧按钮可切换🔀换行↔️滚动模式。
🐍 Pythonma_cross_strategy.py
# -*- coding: utf-8 -*-"""双均线趋势策略由 AI(Cursor/Claude Code)根据 Prompt 自动生成策略逻辑:MA5 上穿 MA20 买入,MA5 下穿 MA20 卖出回测框架:Backtrader | 数据:akshare | 时间:2022-01-01 ~ 2024-12-31"""# ============ 依赖安装(首次运行前执行)============# pip install backtrader akshare matplotlib pandas# ============ 1. 数据获取模块 ============import akshare as akimport pandas as pdimport datetime as dtimport backtrader as btimport matplotlibmatplotlib.use('Agg')  # 非交互式后端,避免弹窗def get_stock_data(stock_code, start_date, end_date):    """    通过 akshare 获取 A 股历史行情数据    :param stock_code: 股票代码,如 '600519'(贵州茅台)    :param start_date: 开始日期,格式 'YYYYMMDD'    :param end_date: 结束日期,格式 'YYYYMMDD'    :return: DataFrame,列名标准化为 Backtrader 所需格式    """    print(ff"正在获取 {stock_code} 历史数据...")    df = ak.stock_zh_a_hist(        symbol=stock_code,        period="daily",        start_date=start_date,        end_date=end_date,        adjust="qfq"  # 前复权    )    # akshare 返回列名重映射    df = df[['日期','开盘','收盘','最高','最低','成交量']]    df.columns = ['date','open','close','high','low','volume']    df['date'] = pd.to_datetime(df['date'])    df = df.set_index('date')    print(ff"数据获取成功,共 {len(df)} 条日线数据")    return df# ============ 2. 策略逻辑模块 ============class MACrossStrategy(bt.Strategy):    """    双均线趋势策略    - 买入:MA5 上穿 MA20(金叉)    - 卖出:MA5 下穿 MA20(死叉)    - 止损:亏损 5% 强制平仓    - 止盈:盈利 15% 强制平仓    """    # 策略参数:周期、回测数据从外部传入    params = (        ('fast_ma'5),    # 快速均线周期        ('slow_ma'20),    # 慢速均线周期        ('stop_loss'0.05),  # 止损 5%        ('take_profit'0.15), # 止盈 15%    )    def __init__(self):        # 计算双均线指标        self.ma_fast = bt.indicators.SimpleMovingAverage(            self.data.close, period=self.params.fast_ma        )        self.ma_slow = bt.indicators.SimpleMovingAverage(            self.data.close, period=self.params.slow_ma        )        self.crossover = bt.indicators.CrossOver(self.ma_fast, self.ma_slow)        # 跟踪订单状态        self.order = None        self.buy_price = None    def next(self):        # 如果有挂单未成交,跳过        if self.order:            return        # ---- 买入逻辑:MA5 上穿 MA20 ----        if self.crossover > 0 and not self.position:            # 计算买入数量:30% 仓位            size = int((self.broker.getvalue() * 0.30) / self.data.close[0])            if size > 0:                self.buy_price = self.data.close[0]                self.order = self.buy(size=size)                print(ff"[买入] 日期:{self.data.datetime.date(0)} | 价格:{self.buy_price:.2f} | 数量:{size}")        # ---- 卖出逻辑:MA5 下穿 MA20 ----        elif self.crossover < 0 and self.position:            self.order = self.sell(size=self.position.size)            print(ff"[卖出] 日期:{self.data.datetime.date(0)} | 价格:{self.data.close[0]:.2f} | 原因:死叉")        # ---- 止损/止盈逻辑 ----        if self.position and self.buy_price:            pnl_ratio = (self.data.close[0] - self.buy_price) / self.buy_price            if pnl_ratio <= -self.params.stop_loss:                self.order = self.sell(size=self.position.size)                print(ff"[止损] 日期:{self.data.datetime.date(0)} | 亏损:{pnl_ratio*100:.1f}%")            elif pnl_ratio >= self.params.take_profit:                self.order = self.sell(size=self.position.size)                print(ff"[止盈] 日期:{self.data.datetime.date(0)} | 盈利:{pnl_ratio*100:.1f}%")    def notify_order(self, order):        if order.status in [order.Completed]:            self.order = None# ============ 3. 回测引擎模块 ============def run_backtest():    """    初始化 Backtrader 引擎,运行回测,输出绩效报告    """    cerebro = bt.Cerebro()    # 添加策略(可同时测试多个策略)    cerebro.addstrategy(MACrossStrategy)    # 设置初始资金和佣金    cerebro.broker.setcash(100000.0)  # 10万元    cerebro.broker.setcommission(commission=0.0003)  # 双边万三佣金    cerebro.broker.set_slippage_perc(0.001)  # 千分之一滑点    # 加载数据(贵州茅台 600519)    df = get_stock_data('600519''20220101''20241231')    data_feed = bt.feeds.PandasData(dataname=df)    cerebro.adddata(data_feed)    # 添加分析器:绩效指标    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe', riskfreerate=0.03)    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')    cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')    cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')    # 设置图表样式    cerebro.addwriter(bt.WriterFile, csv=True, outfile="backtest_result.csv")    # 运行回测    print("\n" + "="*50)    print("回测开始...")    strategies = cerebro.run()    strategy = strategies[0]    # 提取绩效指标    final_value = cerebro.broker.getvalue()    initial_cash = 100000.0    total_return = (final_value - initial_cash) / initial_cash * 100    sharpe_ratio = strategy.analyzers.sharpe.get_analysis().get('sharperatio'None)    max_dd = strategy.analyzers.drawdown.get_analysis().get('max', {}).get('drawdown'0)    total_return_annual = strategy.analyzers.returns.get_analysis().get('rtot'0) * 100    # 交易统计    trade_stats = strategy.analyzers.trades.get_analysis()    total_trades = trade_stats.get('total', {}).get('total'0)    won_trades = trade_stats.get('won', {}).get('total'0)    lost_trades = trade_stats.get('lost', {}).get('total'0)    win_rate = (won_trades / total_trades * 100if total_trades > 0 else 0    # 打印绩效报告    print("="*50)    print("📊 回测绩效报告(贵州茅台 MA 双均线策略 2022-2024)")    print("="*50)    print(ff"  初始资金:      ¥{initial_cash:,.2f}")    print(ff"  最终净值:      ¥{final_value:,.2f}")    print(ff"  总收益率:      {total_return:.2f}%")    print(ff"  年化收益率:    {total_return_annual:.2f}%")    print(ff"  夏普比率:      {sharpe_ratio:.3f}" if sharpe_ratio else "  夏普比率:      N/A")    print(ff"  最大回撤:      {max_dd:.2f}%")    print(ff"  总交易次数:    {total_trades}")    print(ff"  盈利次数:      {won_trades}")    print(ff"  亏损次数:      {lost_trades}")    print(ff"  胜率:          {win_rate:.1f}%")    print("="*50)    print(ff"最终账户余额:¥{final_value:,.2f}(手续费和滑点已扣除)")    # 绘制图表并保存    cerebro.plot(style='candlestick', barup='#26a69a', bardown='#ef5350',                 volume=False, figsize=(168))    print("\n策略图表已保存为 backtest_chart.png")# ============ 4. 主程序入口 ============if __name__ == "__main__":    run_backtest()
🤖 如何用 Cursor/Claude Code 获得这段代码
在 Cursor 中新建 ma_cross_strategy.py 文件,打开 Composer(Ctrl/Cmd + I), 将上述 Prompt 模板 A 粘贴进去,AI 将在几秒内生成完整代码。 如果代码有报错,把错误信息粘贴回去让 AI 修复,通常 1~2 轮即可运行通过。
⚙️ STEP 4:安装依赖 & 一键运行

📌 安装依赖(Terminal / PowerShell)

💻 Shell终端命令
# 创建独立 Python 环境(推荐)python -m venv venv.\venv\Scripts\activate   # Windows# source venv/bin/activate   # macOS/Linux# 一键安装所有依赖pip install backtrader akshare matplotlib pandas numpy# 验证安装python -c "import backtrader, akshare; print('✅ 依赖安装成功')"

📌 运行回测

🐍 Shell运行策略
# 运行双均线策略回测
python ma_cross_strategy.py
✅ 预期输出示例
正在获取 600519 历史数据...数据获取成功,共 730 条日线数据==================================================📊 回测绩效报告(贵州茅台 MA 双均线策略 2022-2024)==================================================初始资金: ¥100,000.00最终净值: ¥128,450.30总收益率: 28.45%年化收益率: 9.48%夏普比率: 0.852最大回撤: 18.32%总交易次数: 12盈利次数: 8亏损次数: 4胜率: 66.7%==================================================最终账户余额:¥128,450.30(手续费和滑点已扣除)
🛡️ STEP 5:AI 帮你增强风控模块(扩展代码)
💡 为什么需要风控模块
原始策略只有"止损5%+止盈15%"还不够。 AI 可以帮你快速添加:总账户止损(单日亏损2%强停)、 仓位上限(最多持有3只票)、 波动率过滤(市场波动过大时空仓)。
🐍 Pythonrisk_manager.py
# -*- coding: utf-8 -*-"""风控增强模块 — 由 AI 根据风控需求自动生成功能:账户总止损 | 单日最大亏损 | 最大持仓限制 | 波动率过滤用法:将此类混入(mixin)到现有策略,或直接替换 MACrossStrategy"""class RiskManager:    """    风控管理器 — 独立模块,可叠加到任意策略    """    params = (        ('max_daily_loss_pct'0.02),   # 单日最大亏损 2% 时停止交易        ('max_portfolio_loss'0.10),  # 账户总回撤超 10% 时清仓        ('max_positions'3),            # 最多同时持仓 3 只        ('volatility_threshold'0.03), # 日波动率超过 3% 时不新开仓        ('atr_stop_loss'2.0),           # ATR 的 2 倍作为动态止损    )    def __init__(self):        self.daily_pnl = 0.0        self.daily_start_value = None        self.peak_value = None  # 历史最高净值        self.trading_stopped = False        self.current_date = None        self.atr = bt.indicators.ATR(self.data, period=14)  # ATR 指标    def next(self):        current_date = self.data.datetime.date(0)        # 每日重置单日盈亏        if self.current_date != current_date:            if self.daily_start_value:                self.daily_pnl = (self.broker.getvalue() - self.daily_start_value) / self.daily_start_value                # 检查单日亏损是否超限                if self.daily_pnl <= -self.params.max_daily_loss_pct:                    self.trading_stopped = True                    self.close_all_positions()                    print(ff"[风控-日损] 日期:{current_date} | 单日亏损:{self.daily_pnl*100:.1f}% | 停止交易")            self.daily_start_value = self.broker.getvalue()            self.current_date = current_date        # 更新历史最高净值,检查账户总回撤        if self.peak_value is None or self.broker.getvalue() > self.peak_value:            self.peak_value = self.broker.getvalue()        else:            drawdown = (self.broker.getvalue() - self.peak_value) / self.peak_value            if drawdown <= -self.params.max_portfolio_loss:                self.trading_stopped = True                self.close_all_positions()                print(ff"[风控-总回撤] 日期:{current_date} | 回撤:{drawdown*100:.1f}% | 清仓止损")        # 波动率过滤:不追高,不在极端波动时开仓        daily_return = self.data.close[0] / self.data.close[-1] - 1        if abs(daily_return) > self.params.volatility_threshold:            # 波动过大时不产生新买入信号(由外部策略判断是否空仓)            pass    def can_open_position(self):        """检查是否可以开新仓位"""        if self.trading_stopped:            return False        if len(self.broker.positions) >= self.params.max_positions:            return False        return True    def get_atr_stop_price(self, entry_price):        """基于 ATR 计算动态止损价格"""        return entry_price - self.params.atr_stop_loss * self.atr[0]    def close_all_positions(self):        """紧急清仓"""        for pos in self.broker.positions.values():            if pos.size != 0:                self.sell(size=abs(pos.size))
🔗 如何将风控模块与主策略结合
最简单的方式是让 AI 帮你合并: "请将 RiskManager 类混入到 MACrossStrategy 中,使风控逻辑自动生效。 当 can_open_position() 返回 False 时,主策略不得开新仓位。" AI 会生成合并后的完整代码。
🚀 STEP 6:模拟盘验证 & 实盘部署路径
阶段工具选择关键动作通过标准
阶段1
 虚拟回测
Backtrader + akshare
3年历史数据验证
夏普>0.8,最大回撤<20%
阶段2
 模拟盘
聚宽/米筐模拟账户
至少跑满3个月
与回测结果偏差<15%
阶段3
 小资金实盘
券商 API / vnpy
使用10%~20%计划资金
连续3个月稳定运行
阶段4
 全量实盘
vnpy / Interactive Brokers
资金全部接入
系统稳定,月度审查

❌ 错误路径

  • 回测收益高 → 直接上全部资金实盘

  • 跳过模拟盘验证阶段

  • 实盘后频繁手动干预策略

  • 出现大回撤后盲目修改参数

  • 不知道策略何时失效就死扛

✅ 正确路径

  • 虚拟回测 → 模拟盘 → 小资金实盘 → 全量

  • 每个阶段设明确的通过/不通过标准

  • 实盘严格遵循策略参数,不手动干预

  • 定期做归因分析(策略收益来源)

  • 设定硬性止损线和策略终止条件

📊 关键回测指标解读:AI 帮你读懂绩效报告
指标含义优秀标准危险信号
夏普比率
每承受一单位风险获得的超额收益
> 1.0 优秀< 0.5
最大回撤
历史上从最高点到最低点的最大跌幅
< 20%> 40%
年化收益率
平均每年的复利收益率
> 15%< 5%
胜率
盈利交易次数 / 总交易次数
40%~60%> 70%(疑似过拟合)
盈亏比
平均盈利 / 平均亏损
> 1.5< 1.0
卡尔马比率
年化收益 / 最大回撤
> 0.5< 0.3
⚠️ 让 AI 帮你做样本外验证
运行完初始回测后,将以下 Prompt 发给 AI: "请将数据切分为 2022-01-01~2023-06-30(样本内) 和 2023-07-01~2024-12-31(样本外), 只用样本内数据优化参数,然后在样本外验证绩效。 如果样本外绩效比样本内下降超过 30%,说明策略可能过拟合。"
✅ 总结:从 0 到跑通策略只需要 4 步
1. 写 Prompt → 用本文的 3 个模板(均线/RSI/多因子)2. AI 生成代码 → Cursor / Claude Code 几秒出结果3. 安装依赖运行 → pip install + python 一键跑通4. 看报告迭代 → AI 帮你解读指标 + 优化策略最关键的一点:不要跳过模拟盘阶段。 再好的策略也要经过 3 个月以上的模拟盘验证,才能建立对策略行为的真正认知。 Vibe Trading 让你快速起步,但持续盈利靠的是对市场的深度理解
🚨 最后提醒
本文所有代码和策略仅作技术学习用途,不构成任何投资建议。 A 股量化实盘涉及合规要求,请务必在使用前了解相关法规和券商 API 使用协议。 量化交易存在亏损风险,请勿投入超出承受能力的资金。
AI + 量化交易实战教程 · 2026年5月 · Cursor/Backtrader 零基础入门指南⚠️ 本文仅作技术分享,不构成任何投资建议。量化交易存在亏损风险,请谨慎对待资金安全。