海龟交易系统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 买入持有")代码关键点解释:
指标计算: 使用
runMax/Min和ATR函数预计算所有需要的阈值。状态跟踪: 使用
Position,Entry_Price, 和Stop_Loss列来跟踪虚拟交易者的状态。这是回测复杂系统所必需的。信号逻辑: 循环中的
if-else结构严格遵循海龟规则,优先处理离市和止损,然后再考虑入场。移动止损: 止损位在持仓期间是动态的,并且对于多头只会上移,对于空头只会下移,这锁定了利润。
收益率计算:
ROC函数计算收益率,乘以lag(Position)表示根据前一天的信号在当天开盘时交易。
进阶改进
这个基础版本可以进一步优化:
头寸规模: 在循环中加入账户权益和单位计算,实现真正的基于波动率的头寸管理。
系统二: 加入 55 日突破的系统二入市规则。
加仓: 实现海龟的 pyramiding(金字塔加仓)规则,在趋势中每 0.5N 有利变动时增加一个单位。
多资产组合: 将代码封装成函数,对多个资产进行回测,并统一进行资金管理。
交易成本: 在
Returns计算中减去买卖差价或佣金。
通过以上代码和分析,您就拥有了一个在 R 中实现和验证海龟交易系统的坚实基础。
