海龟交易系统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 中实现和验证海龟交易系统的坚实基础。

相关推荐
m0_6501082436 分钟前
多模态大模型 VS. 图像视频生成模型浅析
人工智能·技术边界与协同·mllm与生成模型·技术浅谈
ai_xiaogui39 分钟前
Mac苹果版Krita AI一键安装教程:AIStarter+ComfyUI零基础部署全流程(X86/ARM双架构)
arm开发·人工智能·macos·comfyui·一键部署·ai绘画教程·kritaai
lapiii3581 小时前
[智能体设计模式] 第11章:目标设定与监控模式
人工智能·设计模式
这张生成的图像能检测吗1 小时前
(论文速读)WFF-Net:用于表面缺陷检测的可训练权重特征融合卷积神经网络
人工智能·深度学习·神经网络·缺陷检测·图像分割
努力的小郑1 小时前
今晚Cloudflare一哆嗦,我的加班计划全泡汤
前端·后端·程序员
shayudiandian2 小时前
RNN与LSTM详解:AI是如何“记住”信息的?
人工智能·rnn·lstm
美人鱼战士爱学习2 小时前
2025 Large language models for intelligent RDF knowledge graph construction
人工智能·语言模型·知识图谱
jz_ddk2 小时前
[算法] 算法PK:LMS与RLS的对比研究
人工智能·神经网络·算法·信号处理·lms·rls·自适应滤波
qinyia2 小时前
使用Wisdom SSH的AI多会话功能进行批量命令执行和跨服务器智能运维
运维·人工智能·ssh
YisquareTech2 小时前
如何实现智能补货?EDI与ERP集成打造零售库存的“自动闭环”
大数据·人工智能·零售·伊士格科技·erp集成