极客前沿

AI 入门第一步:用 Python 搭建你的第一个策略回测

2026-07-08 01:35
DEV Machine Learning
查看原文

零基础学会安装 Python 环境、下载金融数据,并跑通一个简单的移动平均线回测代码。

想用 AI 做量化交易,第一步不是写复杂模型,而是先学会回测——用历史数据验证你的交易策略是否靠谱。本文带你从零开始,装好工具、跑通第一个回测,避开新手最容易掉进去的坑。

准备环境:安装 Python 和必备库

你需要一个能运行 Python 的环境。如果你是纯新手,推荐直接装 Anaconda(一个打包了 Python 和常用数据科学库的发行版,省去一个个安装的麻烦)。

  1. 去 Anaconda 官网(anaconda.com)下载对应你系统的安装包,安装时选“Add Anaconda to my PATH environment variable”(方便后续在命令行使用)。
  2. 安装完成后,打开终端(Mac/Linux)或 Anaconda Prompt(Windows),输入 conda list,如果看到一堆包名就说明成功了。
  3. 接下来安装回测需要的两个库:pandas(处理表格数据)和 yfinance(免费获取股票历史数据)。在终端里依次输入:conda install pandaspip install yfinance。如果遇到网络慢,可以换成国内镜像,比如 pip install yfinance -i https://pypi.tuna.tsinghua.edu.cn/simple

获取数据:下载股票历史价格

回测需要真实的历史价格。我们用 yfinance 获取苹果(AAPL)过去两年的日线数据。

Tutorial Image
  • 打开你喜欢的代码编辑器(比如 VS Code 或 Jupyter Notebook),新建一个 Python 文件。
  • 输入以下代码并运行:
    import yfinance as yf
    data = yf.download('AAPL', start='2022-01-01', end='2024-01-01')
    print(data.head())
  • 你会看到包含开盘价、收盘价等列的表格。注意:数据默认是未复权的,回测前需要调整。yfinance 下载时加参数 auto_adjust=True 就能拿到复权价格(已处理分红、拆股等事件),避免价格出现假跳变。

跑通第一个回测:移动平均线策略

现在写一个最简单的策略:当短期均线上穿长期均线时买入,反之卖出。代码不到 40 行,但要注意一个关键细节——避免未来信息(即回测时用了未来才有的数据,这会让结果虚高)。

  1. 计算两条均线:short_ma = data['Close'].rolling(window=20).mean()long_ma = data['Close'].rolling(window=50).mean()
  2. 生成交易信号:当 short_ma 从下方穿过 long_ma 时买入(信号为1),反之卖出(信号为-1)。关键一步:用 .shift(1) 把信号往后移一天,这样模拟的是“收盘后产生信号,第二天开盘才交易”,而不是当天收盘价买卖(那相当于作弊)。
  3. 计算每日收益:假设每次交易都按第二天开盘价成交,并扣除手续费(比如万分之三)。
  4. 最后比较策略收益与简单“买入持有”的收益。如果策略跑不过买入持有,那就别实盘。

完整的代码示例(复制即可运行):

import pandas as pd
import yfinance as yf

# 下载数据
data = yf.download('AAPL', start='2022-01-01', end='2024-01-01', auto_adjust=True)
close = data['Close']

# 计算均线
short = close.rolling(20).mean()
long = close.rolling(50).mean()

# 生成信号(避免未来信息)
signal = pd.Series(0, index=close.index)
signal[short > long] = 1
signal[short < long] = -1
signal = signal.shift(1) # 重要:后移一天

# 计算策略收益(假设无手续费)
daily_ret = close.pct_change()
strategy_ret = (signal * daily_ret).dropna()
cumulative = (1 + strategy_ret).cumprod()

# 比较买入持有
buy_hold = (1 + daily_ret).cumprod()
print('策略累计收益:', cumulative.iloc[-1])
print('买入持有累计收益:', buy_hold.iloc[-1])

常见坑与下一步

  • 检查数据质量:用 data.isnull().sum() 看有没有缺失值,用 data.index.duplicated().sum() 看有没有重复日期。脏数据会导致回测结果完全失真。
  • 避免幸存者偏差:如果你只测试当前仍存在的股票(比如只测标普500现在的成分股),就忽略了那些已经退市或破产的公司——你的策略可能恰好避开了它们。建议用全历史成分股列表或指数本身来测试。
  • 多试参数:向量化回测很快,你可以测试几十组均线参数,找出稳健的组合,而不是靠一个参数碰运气。

现在你已经装好了环境、拿来了数据、跑通了第一个回测。下一步可以尝试加入止损、交易成本,或者换成其他策略(比如 RSI 背离)。记住:回测最大的作用不是让你自信,而是让你发现自己的策略到底有多脆弱。保持怀疑,才能进步。

内容来源

DEV Machine Learning

发布时间

2026-07-08 01:35

返回 AI技术