量化金融这个系列走到第 100 篇,这次我们完整落地一个经典策略:海龟交易法则的 Python 实现。网上讲海龟法则的文章很多,但多数停留在“进场突破 20 日高点、止损 2ATR”这种概念层面,缺少一份能直接跑回测、能看到净值曲线、能输出绩效指标的完整代码。这篇就把思路到代码一次讲透。
先给结论:海龟法则是一个典型的趋势跟踪策略,核心逻辑不复杂,但完整实现牵扯到唐奇安通道、ATR 波动率止损、分批加仓、退出规则四个部分。用 Python 写出来,只需要 pandas、numpy、matplotlib 三个库,不需要深度学习环境,不需要 GPU,一台普通电脑就能跑。数据源可以换成 AKShare、Tushare 或你自己本地的 CSV 文件,代码结构上完全兼容。
这篇文章会带你完成以下内容:先拆解海龟法则的完整交易规则;然后给出可直接复制的 Python 代码,包含数据获取、指标计算、信号生成、回测引擎和可视化;接着介绍批量回测多品种、多周期的方法;最后给出常见报错和排查思路。如果你想系统学习量化金融,或者正在找一套可扩展的策略回测模板,这一篇可以直接收藏。
1. 核心能力速览
先把海龟法则 Python 实现的规格说清楚,方便你判断这套代码是否适合自己:
| 能力项 | 说明 |
|---|---|
| 策略类型 | 趋势跟踪、突破入场、ATR 动态止损 |
| 编程语言 | Python 3.8+ |
| 依赖库 | pandas、numpy、matplotlib |
| 数据格式 | CSV 文件或外部数据源接口返回的 DataFrame |
| 回测方式 | 向量化信号生成 + 逐行事件驱动回测 |
| 支持品种 | 股票、期货、加密货币等 K 线数据均可 |
| 支持周期 | 日线、小时线、分钟线均可,按数据频率调整参数 |
| 批量回测 | 支持多品种、多参数循环回测 |
| 输出指标 | 总收益率、年化收益率、最大回撤、夏普比率、胜率、盈亏比 |
| 运行环境 | Windows / Linux / macOS 均可,无需 GPU |
| 扩展方向 | 可接实时行情、可对接交易接口做仿真或实盘 |
这套代码的核心价值不是“预测涨跌”,而是把海龟法则的交易规则固化成一组可验证、可复现的逻辑,然后用历史数据检验它在不同品种上的表现。
2. 海龟法则策略逻辑拆解
海龟法则本身是一套公开的交易规则,不是某个开源项目的私有算法。理解它的关键是四个组成部分。
2.1 入场规则
原版海龟法则使用两个唐奇安通道来确定突破方向:
- 入场做多:价格突破过去 20 日最高价。
- 入场做空:价格跌破过去 20 日最低价。
这里要注意,唐奇安通道和布林带不同,它不考虑均值和标准差,只取最高价和最低价的时间窗口极值。窗口参数可以调整,常见有 20 日入场、55 日入场两套系统,长短周期各有利弊,后面批量回测时我们会对比不同窗口的表现。
2.2 分批加仓规则
海龟法则不是一次性满仓,而是采用单位头寸管理。每笔初始头寸对应一个 N 值,N 就是当前 ATR(平均真实波幅)。加仓规则是:
- 价格每上涨 0.5 个 N,就加仓一个单位。
- 最多加仓到 4 个单位。
- 最后一个单位入场后,等待退出信号。
这套规则的本质是根据市场波动率动态调整仓位:波动越大,单次仓位越小;波动越小,单次仓位越大。它把“仓位控制”和“止损距离”统一到同一个波动率尺度上,这是海龟法则最有价值的地方。
2.3 止损规则
止损同样使用 N 值,但要注意区分两种常见表述:
- 原版海龟法则采用 2N 止损,即入场价格反向波动 2 个 N 就强制退出。
- 部分资料常写 0.5N 止损,实际上 0.5N 是加仓间隔,不是初始止损。
完整逻辑是:建立头寸后,以入场价回撤 2 个 N 为止损线;每次加仓后,止损线同步上移,整体始终保证 4 个单位头寸的总风险控制在 2% 以内。代码实现时,为了简化,我们统一采用 2N 移动止损。
2.4 退出规则
海龟法则的退出逻辑和入场逻辑对称:
- 多头头寸跌破过去 10 日最低价时退出。
- 空头头寸突破过去 10 日最高价时退出。
退出窗口比入场窗口短,意味着策略在趋势启动后能拿住单子,但趋势一旦转弱会快速离场,避免回吐过多利润。
3. 环境准备与依赖库安装
这是最容易卡住初学者的环节。先说结论:这套代码只需要基础数据分析库,不需要安装任何深度学习和量化专用框架。
3.1 Python 环境检查
先确认本机 Python 版本:
python --version推荐使用 Python 3.8 及以上版本。如果没有安装 Python,或者不确定环境变量是否配置正确,建议先看一遍 Python 安装和 vscode Python 环境配置的教程,把基础环境理顺再继续。
3.2 安装依赖库
在命令行执行:
pip install pandas numpy matplotlib如果下载速度慢,可以使用国内镜像源:
pip install pandas numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后验证一下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt print(pd.__version__) print(np.__version__)能正常打印版本号说明环境没问题。如果是 macOS 或 Linux 系统,依赖安装方式一样,不需要额外处理。
3.3 数据准备
回测需要 K 线数据,包含至少 6 个字段:日期、开盘价、最高价、最低价、收盘价、成交量。推荐先用 CSV 文件测试,文件结构如下:
date,open,high,low,close,volume 2023-01-03,100.0,102.5,99.8,101.2,120000 2023-01-04,101.5,103.0,100.2,102.8,135000 2023-01-05,102.6,104.2,101.5,103.5,110000获取真实数据时,可以用 AKShare 或 Tushare 等数据接口,也可以从交易软件导出 CSV。为了测试代码,可以直接用模拟数据验证流程是否走通,后面再替换成真实行情。
4. 海龟法则完整 Python 代码实现
下面给出完整的 Python 实现。代码分成四个模块:指标计算、信号生成、回测引擎、结果可视化。你可以把全部代码保存到一个.py文件里,也可以按模块拆分成多个文件。
4.1 导入库与读取数据
import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei", "Arial Unicode MS", "sans-serif"] plt.rcParams["axes.unicode_minus"] = False def load_data(filepath): """ 读取 CSV 格式的 K 线数据 要求包含 date, open, high, low, close, volume 字段 """ df = pd.read_csv(filepath, parse_dates=["date"]) df = df.sort_values("date").reset_index(drop=True) return df这里有一个关键细节:数据必须按时间正序排列,否则后续计算滚动窗口时会得到错误结果。读取后统一用sort_values排序,避免源数据乱序导致信号错乱。
4.2 计算唐奇安通道与 ATR
这是整个策略的核心。唐奇安通道用于识别突破,ATR 用于计算止损距离和仓位大小。
def calculate_indicators(df, entry_window=20, exit_window=10, atr_window=20): """ 计算唐奇安通道和 ATR entry_window: 入场突破窗口 exit_window: 退出突破窗口 atr_window: ATR 计算窗口 """ result = df.copy() # 唐奇安通道 result["entry_high"] = result["high"].rolling(window=entry_window).max() result["entry_low"] = result["low"].rolling(window=entry_window).min() result["exit_high"] = result["high"].rolling(window=exit_window).max() result["exit_low"] = result["low"].rolling(window=exit_window).min() # 真实波幅 previous_close = result["close"].shift(1) tr = pd.concat( [ result["high"] - result["low"], (result["high"] - previous_close).abs(), (result["low"] - previous_close).abs(), ], axis=1, ).max(axis=1) # 使用 Wilder 平滑计算 ATR,这是海龟法则原版采用的方法 result["atr"] = tr.ewm(alpha=1 / atr_window, adjust=False).mean() return result很多人习惯用rolling(window).mean()算 ATR,但海龟法则原版用的是 Wilder 平滑,也就是对真实波幅做指数加权平均。两者的差异在数据量较小时尤其明显,推荐使用ewm的方式。
4.3 生成交易信号
信号生成的核心逻辑是:判断当天收盘价是否突破唐奇安通道上轨或下轨。这里给出一个干净的纯信号版本,不引入未来函数。
def generate_signals(df, entry_window=20, exit_window=10): """ 生成交易信号 返回 DataFrame,包含 position 字段 position: 1 表示持有多头,-1 表示持有空头,0 表示空仓 """ signal_df = calculate_indicators(df, entry_window, exit_window) signal_df["signal"] = 0 # 多头突破入场 long_entry = signal_df["close"] > signal_df["entry_high"] # 空头突破入场 short_entry = signal_df["close"] < signal_df["entry_low"] # 多头退出 long_exit = signal_df["close"] < signal_df["exit_low"] # 空头退出 short_exit = signal_df["close"] > signal_df["exit_high"] position = 0 positions = [] for i in range(len(signal_df)): row = signal_df.iloc[i] if position == 0: if long_entry.iloc[i]: position = 1 elif short_entry.iloc[i]: position = -1 elif position == 1: if long_exit.iloc[i]: position = 0 elif position == -1: if short_exit.iloc[i]: position = 0 positions.append(position) signal_df["position"] = positions return signal_df这个循环的作用是模拟真实交易中的状态流转。有一点需要特别说明:entry_high和exit_low一旦确定就不能再变,上一根 K 线突破后,下一根 K 线的通道值变化不应影响已经建立的仓位,所以用逐行循环管理状态,而不是直接向量化赋值。
如果你追求更快的运行速度,可以把循环改成 numba 或 numpy 矢量化版本,但对日线级别的回测来说,这个循环速度已经完全够用。
4.4 构建回测引擎
这是整套代码中最关键的部分。前面只产生了仓位状态,还没有计算收益、资金曲线和绩效指标。
def backtest(df, initial_capital=1000000, risk_ratio=0.02, n_units=4): """ 海龟法则回测引擎 initial_capital: 初始资金 risk_ratio: 单笔最大风险比例 n_units: 最大持仓单位数 """ signal_df = df.copy() # 计算每日收益率 signal_df["returns"] = signal_df["close"].pct_change().fillna(0) # 计算策略收益率 # 这里是简化的等权仓位模型,用 position 乘以收益率 signal_df["strategy_returns"] = signal_df["position"].shift(1) * signal_df["returns"] # 计算资金曲线 signal_df["capital"] = initial_capital * (1 + signal_df["strategy_returns"]).cumprod() # 计算最大回撤 signal_df["cumulative_max"] = signal_df["capital"].cummax() signal_df["drawdown"] = signal_df["capital"] / signal_df["cumulative_max"] - 1 # 绩效指标 total_return = signal_df["capital"].iloc[-1] / initial_capital - 1 trading_days = len(signal_df) annual_return = (1 + total_return) ** (252 / trading_days) - 1 max_drawdown = signal_df["drawdown"].min() # 夏普比率 excess_returns = signal_df["strategy_returns"] - 0.02 / 252 sharpe = np.sqrt(252) * excess_returns.mean() / excess_returns.std() # 统计交易笔数 position_changes = signal_df["position"].diff().fillna(0) trade_count = int((position_changes != 0).sum()) return { "signal_df": signal_df, "total_return": total_return, "annual_return": annual_return, "max_drawdown": max_drawdown, "sharpe_ratio": sharpe, "trade_count": trade_count, }这个回测引擎有几个需要注意的工程细节:
第一,strategy_returns使用的是position.shift(1),意思是今天的收益由昨天收盘时持有的仓位决定。这样做是为了避免未来函数:信号在第 t 根 K 线收盘后产生,实际收益从第 t+1 根 K 线开始计算。
第二,原版海龟法则有分批加仓逻辑,简化版代码使用固定仓位比例,方便你快速验证策略方向。如果你需要精确模拟 0.5N 加仓,可以在回测循环内加入仓位计算逻辑,这是后续进阶方向。
第三,夏普比率计算中,无风险利率取 2%,按 252 个交易日年化,这是一个通用处理方式,实际使用时可自己调整。
4.5 策略运行与结果输出
def run_backtest(filepath, entry_window=20, exit_window=10): df = load_data(filepath) signal_df = generate_signals(df, entry_window, exit_window) result = backtest(signal_df) print("=" * 50) print("海龟法则回测结果") print("=" * 50) print(f"入场窗口: {entry_window} 日") print(f"退出窗口: {exit_window} 日") print(f"总收益率: {result['total_return'] * 100:.2f}%") print(f"年化收益率: {result['annual_return'] * 100:.2f}%") print(f"最大回撤: {result['max_drawdown'] * 100:.2f}%") print(f"夏普比率: {result['sharpe_ratio']:.2f}") print(f"交易笔数: {result['trade_count']}") # 绘制资金曲线 fig, axes = plt.subplots(2, 1, figsize=(12, 8)) axes[0].plot(signal_df["date"], signal_df["capital"]) axes[0].set_title("海龟法则资金曲线") axes[0].set_ylabel("资金") axes[1].plot(signal_df["date"], signal_df["drawdown"]) axes[1].set_title("回撤曲线") axes[1].set_ylabel("回撤") plt.tight_layout() plt.show() return result if __name__ == "__main__": # 替换成你的数据文件路径 run_backtest("./data/example.csv")代码到这里已经是一个完整可运行的海龟法则回测程序。执行后你会看到四个关键输出:资金曲线图、回撤曲线图、年化收益率、最大回撤。这是判断一个策略是否值得继续优化的基础。
5. 功能测试与效果验证
代码写完不代表能用,建议按下面的流程做一轮完整的验证。
5.1 用模拟数据验证流程
先造一组简单的序列测试,确认指标计算和信号生成没有问题:
np.random.seed(42) date_range = pd.date_range("2018-01-01", periods=500, freq="D") trend = np.linspace(100, 130, 500) noise = np.random.normal(0, 2, 500) close = trend + noise df_demo = pd.DataFrame( { "date": date_range, "open": close - np.random.rand(500), "high": close + np.abs(np.random.normal(0, 2, 500)), "low": close - np.abs(np.random.normal(0, 2, 500)), "close": close, "volume": np.random.randint(10000, 50000, 500), } ) df_demo.to_csv("./demo.csv", index=False) print("模拟数据已生成")这份数据带明显上升趋势,海龟法则这种趋势跟踪策略在趋势数据上不应该太差。如果跑出来资金曲线明显向上,说明逻辑基本正确。
5.2 判断策略是否有效的标准
回测跑完后,重点看这几个维度:
- 资金曲线是否整体向上,有没有长时间停顿或下行。
- 最大回撤是否在你能接受的范围之内。海龟法则的典型特征是“低胜率、高盈亏比”,大部分交易可能亏损,但少数几笔大盈利会覆盖前面的亏损。
- 交易笔数是否足够。如果 500 根 K 线只产生 2 次交易,可能入场信号太严格;如果产生 100 次交易,可能是通道窗口设置过短。
- 夏普比率建议至少大于 0,大于 1 说明风险调整后收益已经不错。
5.3 验证是否存在未来函数
这是回测最容易踩的坑。验证方法很简单:把信号和收益的日期对齐打印出来,检查第 t 天的信号是否被第 t 天的收益率直接使用。上面代码中我们已经用shift(1)处理了这个问题,但如果你修改代码,要特别注意这一点。
# 检查未来函数 check_df = result["signal_df"][["date", "close", "entry_high", "position", "returns", "strategy_returns"]] print(check_df.tail(20))如果某一行position是 1,但同一天的strategy_returns已经包含了当天价格的涨跌,说明存在未来函数,需要修正。
6. 批量回测:多品种、多参数扫描
海龟法则在不同品种、不同周期上的表现差异很大。单独回测一个品种不能说明问题,必须做批量测试。
6.1 多品种循环回测
假设你有 5 个品种的 CSV 文件,可以用一个循环统一回测:
import os data_dir = "./data" symbols = ["BTCUSDT.csv", "ETHUSDT.csv", "AAPL.csv", "000300.csv", "rb888.csv"] results = [] for symbol in symbols: filepath = os.path.join(data_dir, symbol) try: df = load_data(filepath) signal_df = generate_signals(df, entry_window=20, exit_window=10) result = backtest(signal_df) results.append( { "symbol": symbol, "total_return": result["total_return"], "annual_return": result["annual_return"], "max_drawdown": result["max_drawdown"], "sharpe_ratio": result["sharpe_ratio"], "trade_count": result["trade_count"], } ) print(f"{symbol} 回测完成") except Exception as e: print(f"{symbol} 回测失败: {e}") result_df = pd.DataFrame(results) print(result_df.sort_values("sharpe_ratio", ascending=False))数据文件命名规则要统一,如果某些品种没有对应数据,代码里用 try/except 跳过,避免整个任务中断。
6.2 参数网格扫描
除了多品种,还可以扫描入场窗口和退出窗口的参数组合:
from itertools import product entry_windows = [20, 40, 55] exit_windows = [10, 20] param_results = [] for entry, exit_ in product(entry_windows, exit_windows): df = load_data("./data/rb888.csv") signal_df = generate_signals(df, entry_window=entry, exit_window=exit) result = backtest(signal_df) param_results.append( { "entry_window": entry, "exit_window": exit_, "annual_return": result["annual_return"], "max_drawdown": result["max_drawdown"], "sharpe_ratio": result["sharpe_ratio"], } ) param_df = pd.DataFrame(param_results) print(param_df.sort_values("sharpe_ratio", ascending=False))参数扫描的核心原则是:不能只看收益最高的参数,还要看参数在相邻区域是否稳定。如果一个参数组合收益很高,但前后两个相邻参数组合收益极差,大概率是过拟合,实盘中很难复现。
6.3 批量任务的工程建议
当你开始批量回测时,建议遵守以下几条:
- 每次回测前打印开始时间和结束时间,方便排查卡住的任务。
- 单品种回测失败不要中断整个任务,用 try/except 捕获并记录日志。
- 结果统一用 CSV 保存,方便后续分析。
- 如果要跑上千组参数,建议使用 Python 的 multiprocessing 并行加速,否则耗时较长。
7. 接口 API 与实盘对接思路
严格来说,以上代码是一个回测框架,不能直接用于实盘。如果你想把这个策略接到实盘或仿真环境中,有两条路径。
7.1 策略信号输出成接口服务
你可以用 Flask 或 FastAPI 把策略信号封装成 HTTP 接口,这样其他程序就能定时调用,获取当前持仓建议。
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class MarketData(BaseModel): symbol: str close: float high: float low: float @app.post("/turtle_signal") def get_signal(data: MarketData): """ 接收最新一根 K 线数据,返回建议信号 """ # 这里需要维护历史窗口数据,实际使用时建议用缓存或数据库 # 下面是简化示例 if data.close > current_entry_high: return {"symbol": data.symbol, "action": "buy"} elif data.close < current_entry_low: return {"symbol": data.symbol, "action": "sell"} else: return {"symbol": data.symbol, "action": "hold"}实际部署时,需要维护一个历史数据缓存,每次收到最新 K 线就更新滚动窗口,再计算唐奇安通道和 ATR。
7.2 对接量化交易平台
vn.py、掘金、聚宽等平台都提供 Python 策略接口,可以接收历史 K 线和实时行情,并发送委托单。对接思路基本一致:
- 把
generate_signals和calculate_indicators函数移植到平台策略模板中。 - 在
on_bar或on_tick回调函数中更新最新 K 线。 - 满足入场条件时调用平台的 buy/sell 接口下单。
- 满足退出条件时调用平台的 sell/cover 接口平仓。
实盘对接属于高风险操作,建议先用平台的仿真环境运行至少一到两个月,确认策略稳定后再考虑真实资金。任何策略都有失效可能,历史表现不代表未来收益,这一点必须有清醒认识。
8. 资源占用与性能观察
虽然这套代码不涉及 GPU 和深度学习,但批量回测时仍需关注性能问题。
8.1 内存占用
日线级别回测,单个品种 5000 根 K 线,DataFrame 占用内存很小,不到 100MB。但如果一次性加载 100 个品种各 10 万根分钟线,内存可能会超过 8GB。建议按需读取,单个品种回测完成后立即释放 DataFrame。
import gc del df gc.collect()8.2 时间性能
逐行循环是速度瓶颈。日线数据量小,速度可以接受。分钟线数据量变大后,建议用 numba 加速信号生成循环:
from numba import jit @jit(nopython=True) def generate_signal_fast(close, entry_high, entry_low, exit_low, exit_high): n = len(close) position = np.zeros(n, dtype=np.int8) current_pos = 0 for i in range(n): if current_pos == 0: if close[i] > entry_high[i]: current_pos = 1 elif close[i] < entry_low[i]: current_pos = -1 elif current_pos == 1: if close[i] < exit_low[i]: current_pos = 0 elif current_pos == -1: if close[i] > exit_high[i]: current_pos = 0 position[i] = current_pos return position使用 numba 前需要安装:
pip install numba8.3 如何定位性能瓶颈
如果批量回测速度很慢,按这个顺序排查:
- 数据读取是否重复:全品种共用同一个数据加载函数,每次调用都会重新读取 CSV。
- 指标计算是否重复:同一份数据在参数扫描时被反复计算,可以先缓存指标结果,再按窗口参数切片。
- 循环是否有必要:信号生成必须用循环,但收益计算可以用向量化,不要把所有逻辑都放进循环里。
9. 常见问题与排查方法
这里整理了几类高频问题,按排查优先级排列。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
运行报错ModuleNotFoundError: No module named 'pandas' | Python 环境中未安装依赖库 | 执行pip list查看已安装包 | 执行pip install pandas numpy matplotlib |
| 资金曲线一直是直线 | 策略信号没有触发,position 全部为 0 | 打印position.value_counts()查看仓位分布 | 检查 channel 数据是否为空,确认数据范围是否足够初始化滚动窗口 |
| 回测收益异常高 | 存在未来函数,信号用了当天收盘后的信息 | 打印 date、position、returns 对齐情况 | 确认收益率计算使用position.shift(1) |
| 指标计算结果全是 NaN | 滚动窗口最小值大于数据长度 | 检查数据量是否达到 20 行以上 | 增加数据范围,或调小窗口参数 |
| ATR 为 0 或极小 | 数据中存在连续相同价格,或停牌导致高开低走为零 | 查看原始数据质量 | 过滤掉无波动数据,或用真实波幅下限约束 |
| 批量回测中途卡住 | 某个 CSV 文件格式不正确或数据量过大 | 在循环内打印当前文件名 | 用 try/except 捕获异常,跳过问题文件 |
| 日线回测结果与预期不符 | 前复权数据未处理,停牌日参与计算 | 检查数据是否包含退市或停牌记录 | 使用前复权数据,过滤停牌日 |
| 参数优化后回测很好,实盘表现差 | 过拟合,参数只适合历史行情 | 做样本外测试和参数稳定性检验 | 减少参数网格,使用更长历史数据验证 |
在这些问题中,未来函数和数据对齐问题最容易出现,也是最影响回测可信度的。建议任何时候修改代码后,都先跑一遍小额数据集的验证脚本,确认信号和收益的日期对齐逻辑没有变化。
10. 最佳实践与迭代方向
10.1 回测框架的工程规范
刚开始写策略回测时,我习惯把所有代码写在一个文件里,后来数据源变多、参数变多之后,维护成本直线上升。现在推荐至少把代码拆成四个模块:
turtle/ ├── data.py # 数据加载与清洗 ├── indicators.py # 指标计算 ├── strategy.py # 信号生成与回测引擎 ├── backtest.py # 主程序,负责批量任务与结果输出 └── config.py # 参数配置这样做的收益是:换数据源时只改 data.py,调参数时只改 config.py,修改策略逻辑时只动 strategy.py,不会互相影响。
10.2 回测结果真实性验证
任何策略回测都建议做三件事:
- 样本内测试:用过去 70% 的数据找到合理参数。
- 样本外测试:用剩余 30% 的数据验证参数是否仍然有效。
- 参数敏感性分析:观察相邻参数组合的绩效变化是否剧烈。
如果样本外表现明显变差,说明策略可能只在特定行情中有效,海龟法则也同样存在这个问题。趋势跟踪策略在震荡市中表现往往很差,这是策略本身的属性,不是代码 bug。
10.3 后续扩展方向
这套代码已经完成了一个可用的回测闭环,继续迭代可以考虑以下方向:
- 加入手续费和滑点模型,更贴近真实交易成本。
- 加入海龟法则原版的 0.5N 分批加仓逻辑。
- 对接实时行情数据源,定时运行信号扫描。
- 加入 tkinter 或 gradio 做可视化交互界面,方便非技术用户使用。
- 结合资金管理模块,实现风险预算和动态仓位分配。
对于正在系统学习量化金融的读者,海龟法则是一个很好的起点。它足够简单,逻辑透明,没有黑箱模型,也能通过参数调整感受到量化策略开发和回测的完整流程。学会这套代码后,再去看其他趋势跟踪策略,会发现很多思路是相通的。
文章到这里,核心内容已经讲完了:策略逻辑、完整代码、批量回测、性能优化、问题排查都覆盖到了。建议把这套代码保存下来,先用模拟数据跑通流程,再换成自己熟悉的品种数据做测试。任何策略都不能保证盈利,回测通过只是第一步,后续还需要更多数据和更长时间的验证。