当前位置: 首页 > news >正文

海龟交易系统R

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

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

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

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

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

1. 入市信号

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

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

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

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

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

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 语言实现代码示例

我们将使用 quantmod 和 TTR 包来获取数据和计算指标,使用 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] <- 1data$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] <- -1data$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] <- 0data$Entry_Price[i] <- NAdata$Stop_Loss[i] <- NA}# 检查止损信号: 收盘价下破止损位else if(Cl(data)[i] < data$Stop_Loss[i-1]) {data$Position[i] <- 0data$Entry_Price[i] <- NAdata$Stop_Loss[i] <- NA}# 否则,保持多头持仓,并更新移动止损(只向上移动)else {data$Position[i] <- 1data$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] <- 0data$Entry_Price[i] <- NAdata$Stop_Loss[i] <- NA}# 检查止损信号: 收盘价上破止损位else if(Cl(data)[i] > data$Stop_Loss[i-1]) {data$Position[i] <- 0data$Entry_Price[i] <- NAdata$Stop_Loss[i] <- NA}# 否则,保持空头持仓,并更新移动止损(只向下移动)else {data$Position[i] <- -1data$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/Min 和 ATR 函数预计算所有需要的阈值。

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

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

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

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

进阶改进

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

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

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

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

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

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

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

http://www.dtcms.com/a/528021.html

相关文章:

  • 【攻防实战】Redis未授权RCE联动metasploit打穿三层内网(上)
  • 织梦网站图片修改不了wordpress模板开发 2016
  • .Net Framework 3.5下载安装教程(附安装包)
  • pycharm远程提交Git
  • PLM实施专家宝典:离散制造企业工程变更的“流程金融”方案
  • Orleans分布式系统架构详细分析
  • 建设网站的价钱深圳宝安上市公司网站建设报价
  • F034 vue+neo4j 体育知识图谱系统|体育文献知识图谱vue+flask知识图谱管理+d3.js可视化
  • 【day10】分治
  • 【Go】C++转Go:数据结构练习(一)排序算法
  • 每天学习一个新注解——@SafeVarargs
  • valgrind交叉编译android版本
  • 公司网站开发设计题目来源怎么写佛山免费建站怎样
  • 构建AI智能体:七十四、探索AI新纪元:扣子平台让想法到智能应用的极简之旅
  • P2119 [NOIP 2016 普及组] 魔法阵
  • 数据结构13:排序
  • 网站搭建 里短信wordpress acf破解版
  • 【C/C++】数据在内存中的存储
  • 我们项目中如何运用vueuse
  • 【开发者导航】集成多引擎与离线查询的macOS开源翻译工具:Easydict
  • 龙岗客户 IBM x3650 M5服务器system board fault故障,上门快修分享
  • TENGJUN-TYPE-C 24PIN(JX24-BPS015-A)连接器深度技术解析
  • 10.23作业
  • 深入剖析 Vue Router History 路由刷新页面 404 问题:原因与解决之道
  • FreeP2W:一个PDF转Word的CLI工具
  • .NET - .NET Aspire的Command-Line和GitHub Copilot
  • 10月25日
  • 【电玩电脑杂志】超级整理合集PDF
  • 怎样做某个网站有更新的提醒成都网络优化网站
  • 计算机视觉:python车牌识别检测系统 YOLOv8 深度学习pytorch技术 LPRNet车牌识别算法 CCPD2020数据集 ✅