当前位置:首页>python>用 Python 回测交易策略?Lumibot 让均值回归策略轻松跑起来!

用 Python 回测交易策略?Lumibot 让均值回归策略轻松跑起来!

  • 2026-09-05 21:01:22
用 Python 回测交易策略?Lumibot 让均值回归策略轻松跑起来!

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

在量化交易的世界里,回测(Backtesting)是验证交易策略是否有效的关键步骤。很多 Python 初学者想要入门量化交易,却被复杂的框架和繁琐的数据处理劝退。今天给大家介绍一个简洁易用的 Python 量化交易库——Lumibot,并通过一个经典的均值回归策略(Mean Reversion Strategy)来演示如何用它完成策略回测。

本文将带你了解均值回归策略的核心思想,并手把手教你用 Lumibot 框架实现一个基于移动平均线的交易策略,最终对 Tesla(TSLA)股票进行历史回测。


什么是均值回归策略?

想象一个钟摆在摆动:当它偏离中心(均值)太远时,重力会将它拉回中心。股票价格也有类似的特性——当价格偏离长期均值过多时,往往会出现"回归"的趋势。

均值回归策略正是基于这一思想,利用统计指标(如 RSI、移动平均线等)来判断买卖时机。其核心逻辑如下:

  • • 买入信号:短期移动平均线从下方穿越长期移动平均线(金叉),说明价格可能开始上涨。
  • • 卖出信号:短期移动平均线从上方穿越长期移动平均线(死叉),说明价格可能开始下跌。

该策略因为简单直观,被广泛应用于股票、外汇和大宗商品等金融产品的交易中。


均值回归策略的三大核心组件

1. 趋势过滤(Trend Filter)

确认市场或资产处于上升趋势。例如,检查价格是否在 200 日简单移动平均线(SMA)之上。

2. 超买/超卖判断(Oversold/Overbought Conditions)

利用 SMA 识别潜在的入场点。例如,当价格大幅低于 50 日 SMA 时,可能处于超卖状态。

3. 进出场规则(Entry and Exit Rules)

当价格跌至 50 日 SMA 下方且出现回归迹象时买入;当价格反弹并突破 50 日 SMA 时卖出。


环境搭建

首先安装 Lumibot:

pip install lumibot

接下来需要获取 Alpaca 券商的 API 凭证。前往 Alpaca 官网注册账户后,在控制面板的 API Keys 部分生成你的 API Key 和 API Secret。

创建一个 config.py 文件,保存你的 API 凭证:

# config.py —— 保存 Alpaca 券商的 API 配置信息
ALPACA_CONFIG = {
    "API_KEY"
: "你的 API Key",
    "API_SECRET"
: "你的 API Secret",
    "ENDPOINT"
: "https://paper-api.alpaca.markets",
    # 如果要进行实盘交易,使用:https://api.alpaca.markets

}

导入依赖库

# 导入 Alpaca 配置
from
 config import ALPACA_CONFIG
# 导入 Lumibot 相关模块

from
 lumibot.brokers import Alpaca
from
 lumibot.backtesting import YahooDataBacktesting
from
 lumibot.strategies import Strategy
from
 lumibot.traders import Trader
# 导入日期和数值计算库

from
 datetime import datetime
import
 numpy as np

编写均值回归策略

初始化策略参数

class MeanReversionStrategy(Strategy):
    def
 initialize(self):
        self
.signal = None               # 交易信号,初始为空
        self
.start = "2022-01-01"        # 策略起始日期
        self
.sleeptime = "1D"            # 每天检查一次交易信号
        self
.short_window = 5            # 短期移动平均线窗口(5 天)
        self
.long_window = 20            # 长期移动平均线窗口(20 天)
        self
.position_size = 100         # 每次交易的股数

这里定义了两个关键参数:short_window(短期均线,5 天)和 long_window(长期均线,20 天)。策略每天运行一次(sleeptime = "1D"),每次交易 100 股。

核心交易逻辑

    def on_trading_iteration(self):
        # 获取 TSLA 的历史价格数据

        historical_prices = self.get_historical_prices(
            "TSLA"
, max(self.short_window, self.long_window) + 1
        )
        stock_data = historical_prices.df

        # 计算短期和长期移动平均线

        stock_data[f'{self.short_window}-day'] = (
            stock_data['close'].rolling(self.short_window).mean()
        )
        stock_data[f'{self.long_window}-day'] = (
            stock_data['close'].rolling(self.long_window).mean()
        )

        # 生成买入信号:短期均线从下方穿越长期均线(金叉)

        stock_data['Signal'] = np.where(
            np.logical_and(
                stock_data[f'{self.short_window}-day'] > stock_data[f'{self.long_window}-day'],
                stock_data[f'{self.short_window}-day'].shift(1) < stock_data[f'{self.long_window}-day'].shift(1)
            ), "BUY", None
        )

        # 生成卖出信号:短期均线从上方穿越长期均线(死叉)

        stock_data['Signal'] = np.where(
            np.logical_and(
                stock_data[f'{self.short_window}-day'] < stock_data[f'{self.long_window}-day'],
                stock_data[f'{self.short_window}-day'].shift(1) > stock_data[f'{self.long_window}-day'].shift(1)
            ), "SELL", stock_data['Signal']
        )

        # 获取最新一天的交易信号

        self
.signal = stock_data.iloc[-1].Signal
        symbol = "TSLA"

        # 如果信号为买入

        if
 self.signal == 'BUY':
            pos = self.get_position(symbol)
            if
 pos is not None:
                self
.sell_all()          # 先清仓已有持仓
            # 创建并提交买单

            order = self.create_order(symbol, self.position_size, "buy")
            self
.submit_order(order)

        # 如果信号为卖出

        elif
 self.signal == 'SELL':
            pos = self.get_position(symbol)
            if
 pos is not None:
                self
.sell_all()          # 清仓已有持仓
            # 创建并提交卖单

            order = self.create_order(symbol, self.position_size, "sell")
            self
.submit_order(order)

运行回测

if __name__ == "__main__":
    real_trade = False  # 设为 True 则进行实盘交易

    if
 real_trade:
        # 实盘模式:连接 Alpaca 券商

        broker = Alpaca(ALPACA_CONFIG)
        strategy = MeanReversionStrategy(broker=broker)
        trader = Trader()
        trader.add_strategy(strategy)
        trader.run_all()
    else
:
        # 回测模式:使用 Yahoo 历史数据

        start = datetime(2022, 1, 1)   # 回测起始日期
        end = datetime(2024, 5, 1)     # 回测结束日期
        MeanReversionStrategy.backtest(
            YahooDataBacktesting,
            start,
            end
        )

将 real_trade 设为 False 即可使用 Yahoo 历史数据进行回测,时间范围为 2022 年 1 月 1 日至 2024 年 5 月 1 日。


策略逻辑要点回顾

整个策略的运行流程可以概括为以下几步:

  1. 1. 每天获取 TSLA 的历史收盘价数据。
  2. 2. 分别计算 5 日和 20 日的简单移动平均线。
  3. 3. 当 5 日均线从下方穿越 20 日均线时,产生买入信号。
  4. 4. 当 5 日均线从上方穿越 20 日均线时,产生卖出信号。
  5. 5. 根据信号执行对应的买入或卖出操作,每次交易 100 股。
  6. 6. 在执行新交易前,自动清仓已有持仓,避免仓位冲突。

总结

Lumibot 是一个对 Python 初学者非常友好的量化交易框架。通过继承 Strategy 类并实现 initialize 和 on_trading_iteration 两个方法,就可以快速搭建一个完整的交易策略。结合 Yahoo 历史数据,我们无需实盘账户即可完成策略回测。

均值回归策略虽然逻辑简单,但它是理解量化交易入门概念的绝佳起点。在实际应用中,你可以尝试调整移动平均线的窗口参数、更换标的股票、加入止损止盈逻辑,甚至结合 RSI 等其他技术指标来优化策略效果。

需要注意的是,回测结果仅代表历史表现,不能保证未来收益。在进行实盘交易前,请充分了解市场风险。


参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;
    专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章