使用quantstrat构建Donchian Channel触发多单信号的R交易策略
使用quantstrat搭建基于唐奇安通道的量化交易策略
我来帮你把这个策略代码整理、完善并按要求格式化,这样你能清晰地复现整个逻辑流程:
1. 环境与基础参数设置
首先初始化quantstrat运行环境,统一时区、设置基准货币、回测时间范围和初始资金:
library(quantstrat) Sys.setenv(TZ = "UTC") # 统一时区避免时间序列处理的时区冲突 # 基础参数配置 currency(USD) init_date <- "2014-12-31" start_date <- "2015-01-01" end_date <- "2017-12-31" init_equity <- 100000 adjustment <- TRUE # 开启行情复权
2. 获取回测标的数据
补全你代码中缺失的参数,从Yahoo Finance获取QQQ的复权行情数据:
# 获取QQQ 2015-2017年的历史行情 getSymbols(Symbols = "QQQ", src = "yahoo", index.class = "POSIXct", from = start_date, to = end_date, adjust = adjustment)
3. 计算唐奇安通道高点
这里默认使用20周期的唐奇安通道(你可以根据策略需求修改n参数调整周期):
# 计算唐奇安通道的上轨(高点) donchian_high <- DonchianChannel(QQQ, n = 20)$high
4. 定义核心交易信号逻辑
按照你的要求:当收盘价大于0.85倍的唐奇安通道高点时,生成多单开仓信号:
# 生成多单信号逻辑 signal_long <- Cl(QQQ) > 0.85 * donchian_high # 转换为quantstrat兼容的信号格式(1表示触发开多,0表示无信号) signal_long <- xts(ifelse(signal_long, 1, 0), index(QQQ)) colnames(signal_long) <- "long_entry"
5. 整合到quantstrat策略框架
把信号和交易规则整合到quantstrat的回测框架中,完成策略初始化、规则定义和回测运行:
# 定义策略、账户、组合的名称 strategy_name <- "Donchian0.85_Long_Strategy" portfolio_name <- "Donchian0.85_Portfolio" account_name <- "Donchian0.85_Account" # 清除已有同名策略(避免重复初始化报错) rm.strat(strategy_name) rm.strat(portfolio_name) rm.strat(account_name) # 初始化组合、账户和订单系统 initPortf(portfolio_name, symbols = "QQQ", initDate = init_date) initAcct(account_name, portfolios = portfolio_name, initDate = init_date, initEq = init_equity) initOrders(portfolio_name, initDate = init_date) strategy(strategy_name, store = TRUE) # 添加信号规则:识别符合条件的开仓点 add.signal(strategy_name, name = "sigThreshold", arguments = list(column = "Close", threshold = 0.85 * donchian_high, relationship = "gt", # 大于阈值 cross = FALSE), # 无需穿越,只要大于即可 label = "long_entry_signal") # 添加开仓规则:触发信号时执行市价多单 add.rule(strategy_name, name = "ruleSignal", arguments = list(sigcol = "long_entry_signal", sigval = TRUE, orderqty = 100, # 每次开仓100股,可根据资金调整 ordertype = "market", orderside = "long", pricemethod = "market", replace = FALSE), type = "enter", label = "Enter_Long_Position") # 运行回测 backtest_result <- applyStrategy(strategy_name, portfolios = portfolio_name) # 更新账户和组合的绩效数据 updatePortf(portfolio_name) updateAcct(account_name) updateEndEq(account_name) # 可视化回测结果并输出绩效统计 chart.Posn(portfolio_name, Symbol = "QQQ") print(tradeStats(portfolio_name))
内容的提问来源于stack exchange,提问作者Ramon
相关产品推荐
相关产品推荐

