海龟交易系统R

好的,我们来详细解析一下如何在 R 语言中实现经典的海龟交易系统

海龟交易系统是一个完整的趋势跟踪期货交易系统,以其机械性和规则明确性而闻名。它涵盖了从市场选择、头寸规模计算、入市、止损、离市到策略管理的方方面面。

以下是如何在 R 中构建和回测该系统的分步指南。

海龟交易系统的核心规则(R 实现基础)

在编写代码前,我们必须先将规则量化。

1. 入市信号

海龟系统使用两个系统,我们通常实现更常用的系统一

  • 系统一: 以 20 日突破为基础

    • 多头: 当价格 > 过去 20 日的最高价时,入场做多。

    • 空头: 当价格 < 过去 20 日的最低价时,入场做空。

在 R 中,我们可以使用 TTR 包中的 runMaxrunMin 函数来计算。

2. 头寸规模

这是海龟系统的核心风险管理部分。头寸规模由 N(真实波动幅度均值) 决定。

  • 计算 N(20 日 ATR):

    • TrueRange = max(high - low, high - lag(close), lag(close) - low)

    • N = SMA(TrueRange, 20)

    • 使用 TTR 包中的 ATR 函数可以轻松计算。

  • 计算头寸单位:

    • Unit = (1% of Account Equity) / (N per Point)

    • 在回测中,我们通常简化为:每次交易承担账户总价值的 1% 的风险。一个单位的美元波动 = N * 每点价值。为简化,我们可以用 Unit = (Account * 0.01) / (N * ContractSize),但在单一资产回测中,更简单的方法是固定单位或使用波动率调整的股数。

3. 离市规则
  • 多头离市: 价格 < 过去 10 日的最低价。

  • 空头离市: 价格 > 过去 10 日的最高价。

4. 止损规则
  • 多头止损: 入场价 - 2 * N

  • 空头止损: 入场价 + 2 * N


R 语言实现代码示例

我们将使用 quantmodTTR 包来获取数据和计算指标,使用 PerformanceAnalytics 包来分析结果。

r

复制代码
# 加载必要的包
library(quantmod)
library(TTR)
library(PerformanceAnalytics)

# 1. 获取数据(例如:苹果股票)
getSymbols("AAPL", from = "2010-01-01", to = "2020-12-31")
data <- AAPL

# 2. 计算海龟系统所需的指标
# 计算20日最高和最低(用于入市)
data$High_20 <- runMax(Hi(data), n = 20)
data$Low_20 <- runMin(Lo(data), n = 20)

# 计算10日最高和最低(用于离市)
data$High_10 <- runMax(Hi(data), n = 10)
data$Low_10 <- runMin(Lo(data), n = 10)

# 计算真实波动幅度均值(N)
atr <- ATR(HLC(data), n = 20)
data$N <- atr[, "atr"] # 提取ATR列
data$N[is.na(data$N)] <- 0 # 将NA替换为0

# 3. 初始化交易信号列
data$Position <- 0   # 持仓状态: 0 = 无仓, 1 = 多头, -1 = 空头
data$Entry_Price <- NA # 入场价格
data$Stop_Loss <- NA   # 止损价格

# 4. 创建交易信号(循环处理每一天)
for(i in 21:nrow(data)) {
  
  # 获取前一天的持仓状态
  current_position <- data$Position[i-1]
  
  # 情况A: 当前无持仓
  if(current_position == 0) {
    # 多头入场信号: 收盘价上破20日最高
    if(Cl(data)[i] > data$High_20[i-1]) {
      data$Position[i] <- 1
      data$Entry_Price[i] <- Cl(data)[i]
      data$Stop_Loss[i] <- Cl(data)[i] - 2 * data$N[i]
    }
    # 空头入场信号: 收盘价下破20日最低
    else if(Cl(data)[i] < data$Low_20[i-1]) {
      data$Position[i] <- -1
      data$Entry_Price[i] <- Cl(data)[i]
      data$Stop_Loss[i] <- Cl(data)[i] + 2 * data$N[i]
    }
    # 无信号,保持空仓
    else {
      data$Position[i] <- 0
    }
  }
  
  # 情况B: 当前持有多头
  else if(current_position == 1) {
    # 检查离市信号: 收盘价下破10日最低
    if(Cl(data)[i] < data$Low_10[i-1]) {
      data$Position[i] <- 0
      data$Entry_Price[i] <- NA
      data$Stop_Loss[i] <- NA
    }
    # 检查止损信号: 收盘价下破止损位
    else if(Cl(data)[i] < data$Stop_Loss[i-1]) {
      data$Position[i] <- 0
      data$Entry_Price[i] <- NA
      data$Stop_Loss[i] <- NA
    }
    # 否则,保持多头持仓,并更新移动止损(只向上移动)
    else {
      data$Position[i] <- 1
      data$Entry_Price[i] <- data$Entry_Price[i-1]
      # 止损位只能向上移动,不能向下
      data$Stop_Loss[i] <- max(data$Stop_Loss[i-1], Cl(data)[i] - 2 * data$N[i])
    }
  }
  
  # 情况C: 当前持有空头
  else if(current_position == -1) {
    # 检查离市信号: 收盘价上破10日最高
    if(Cl(data)[i] > data$High_10[i-1]) {
      data$Position[i] <- 0
      data$Entry_Price[i] <- NA
      data$Stop_Loss[i] <- NA
    }
    # 检查止损信号: 收盘价上破止损位
    else if(Cl(data)[i] > data$Stop_Loss[i-1]) {
      data$Position[i] <- 0
      data$Entry_Price[i] <- NA
      data$Stop_Loss[i] <- NA
    }
    # 否则,保持空头持仓,并更新移动止损(只向下移动)
    else {
      data$Position[i] <- -1
      data$Entry_Price[i] <- data$Entry_Price[i-1]
      # 止损位只能向下移动,不能向上
      data$Stop_Loss[i] <- min(data$Stop_Loss[i-1], Cl(data)[i] + 2 * data$N[i])
    }
  }
}

# 5. 计算策略收益率
# 策略收益: 持仓 * 资产的日收益率
data$Returns <- ROC(Cl(data)) * lag(data$Position, 1)
# 资产本身的收益率(作为基准)
data$Benchmark_Returns <- ROC(Cl(data))

# 6. 性能分析(只使用有数据的部分)
results_data <- na.omit(data['2010-02-01/2020-12-31'])

charts.PerformanceSummary(merge(results_data$Returns, results_data$Benchmark_Returns), main = "海龟交易系统 vs 买入持有")

代码关键点解释:

  1. 指标计算: 使用 runMax/MinATR 函数预计算所有需要的阈值。

  2. 状态跟踪: 使用 Position, Entry_Price, 和 Stop_Loss 列来跟踪虚拟交易者的状态。这是回测复杂系统所必需的。

  3. 信号逻辑: 循环中的 if-else 结构严格遵循海龟规则,优先处理离市和止损,然后再考虑入场。

  4. 移动止损: 止损位在持仓期间是动态的,并且对于多头只会上移,对于空头只会下移,这锁定了利润。

  5. 收益率计算: ROC 函数计算收益率,乘以 lag(Position) 表示根据前一天的信号在当天开盘时交易。

进阶改进

这个基础版本可以进一步优化:

  • 头寸规模: 在循环中加入账户权益和单位计算,实现真正的基于波动率的头寸管理。

  • 系统二: 加入 55 日突破的系统二入市规则。

  • 加仓: 实现海龟的 pyramiding(金字塔加仓)规则,在趋势中每 0.5N 有利变动时增加一个单位。

  • 多资产组合: 将代码封装成函数,对多个资产进行回测,并统一进行资金管理。

  • 交易成本:Returns 计算中减去买卖差价或佣金。

通过以上代码和分析,您就拥有了一个在 R 中实现和验证海龟交易系统的坚实基础。

相关推荐
歪歪1003 小时前
C#如何在数据可视化工具中进行数据筛选?
开发语言·前端·信息可视化·前端框架·c#·visual studio
王哈哈^_^3 小时前
【数据集】【YOLO】【目标检测】口罩数据集,口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
文火冰糖的硅基工坊4 小时前
[人工智能-大模型-83]:模型层技术 - 前向预测:神经网络是如何产生涌现智能的?背后的本质是什么?
人工智能·深度学习·神经网络
taxunjishu4 小时前
西门子 1500 PLC 依托 Ethernet/ip 转 Modbus RTU联合发那科机器人优化生产流程
人工智能·区块链·工业物联网·工业自动化·总线协议
Captaincc4 小时前
AI 能帮你写代码,但把代码变成软件,还是得靠人
前端·后端·程序员
一介书生-0074 小时前
2025-10-27 Java AI学习路线
java·人工智能·学习
rengang664 小时前
AI辅助需求分析:AI大模型将自然语言需求转化为技术规格
人工智能·需求分析·ai编程·1024程序员节·ai智能体编程
子不语1804 小时前
深度学习——IDE之Jupyter
人工智能·深度学习·jupyter
AI小云5 小时前
【Python高级编程】类和实例化
开发语言·人工智能·python