在研究了下面两个链接中使用的矢量化方法之后,我尝试创建一个简单的交易策略模板(代码如下所示),该模板可以在R中矢量化,以获得比基于循环的结构更快的速度。我在向量化方面遇到了困难,因为必须维护和构建变量状态,例如:
1)我使用的信号对于长和短并不是相互排斥的(就像在简单的MA交叉系统中一样)。
2)一旦被触发,信号可能会漂移,直到它得到相反的指示(例如RSI在80以上做空,在20以下做多)。
3)位置会保持多个周期,因此不会出现在每个信号灯进入或信号灯为假后退出的情况(我希望在停止和倒车或SAR系统中只能进入一次)。
我认为这是一个简单的示例系统,但它比这里列出的示例要复杂一些:
http://blog.fosstrading.com/2011/03/how-to-backtest-strategy-in-r.html
Cumulative Return in Trading Strategy Test
系统逻辑摘要:当zscore低于(高于) -2 (2)时,系统开始持平,然后以要价(bid)价格做多(做空)。该系统跟踪性能统计数据,如“交易”、“胜利”、已结清损益(为简单起见,省略了其他)。在系统运行后,系统还会为绘图保留一个运行中的“权益”。
# assume vectors bid, ask, and zscore containing those price series respectively
# pos = current position where 1 == long, -1 == short, 0 == flat
# entryP = entry price, pnl = open pnl, cpnl = closed pnl
pos = 0; entryP = 0.0; pnl = 0; cpnl = 0; trades = 0; wins = 0
ub = length(bid)
equity = rep(0, ub)
for (i in 10000:ub) {
pnl = 0
if (pos > 0) pnl = bid[i] - entryP
if (pos < 0) pnl = entryP - ask[i]
if (zscore[i] > 2.0 && pos != -1) { # go short
if (pos > 0) { # exit long and record pnl
cpnl = cpnl + pnl
if (pnl > 0) wins = wins + 1
trades = trades + 1
pnl = 0
}
pos = -1
entryP = bid[i]
} else if (zscore[i] < -2.0 && pos != 1) { # go long
if (pos < 0) { # exit short and record pnl
cpnl = cpnl + pnl
if (pnl > 0) wins = wins + 1
trades = trades + 1
pnl = 0
}
pos = 1
entryP = ask[i]
}
equity[i] = cpnl + pnl
}
# assume close-out of final position
cpnl = cpnl + pnl
if (pnl > 0) wins = wins + 1
if (pos != 0) trades = trades + 1
# plot equity chart and report performance stats
plot(equity, t='l', lwd=3)
cpnl;trades; cpnl / trades; wins/trades
有可能在R中向量化这个简单的基于循环的均值回归交易系统吗?
发布于 2013-04-19 10:04:06
“我在向量化方面遇到了困难,因为必须维护变量状态”
这就是所有的总结。如果你在任何迭代中的结果依赖于之前的迭代,你就不能避免循环。
https://stackoverflow.com/questions/16095609
复制相似问题