0

在研究了以下两个链接中使用的矢量化方法后,我尝试创建一个简单的交易策略模板(代码如下所示),该模板可以在 R 中进行矢量化,以实现比基于循环的结构更快的速度。我很难矢量化,因为必须维护和构建变量状态,例如:

1)我使用的信号对于多头和空头并不相互排斥(如在简单的 MA 交叉系统中)。

2) 一旦触发,信号会一直徘徊,直到得到相反的指示(例如 RSI 在 80 以上做空,在 20 以下做多类型系统)。

3) 头寸被持有多个时期,因此不是每个信号都进入或在信号为假后退出的情况(我希望能够像在停止和反转或 SAR 系统中那样只进入一次)。

我认为这是一个简单的示例系统,但它比此处列出的示例要复杂一些:

http://blog.fosstrading.com/2011/03/how-to-backtest-strategy-in-r.html

交易策略测试中的累积回报

系统逻辑总结:当 zscore 低于(高于)-2 (2) 时,系统开始持平然后在卖出(买入)价格做多(做空)。系统会跟踪绩效统计数据,例如“交易”、“获胜”、关闭的损益(为简单起见,其他省略)。该系统还保持一个运行“公平”,以便在系统运行后进行绘图。

# 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 中矢量化这个简单的基于循环的均值回归交易系统?

4

1 回答 1

3

“我很难矢量化,因为必须保持可变状态”

这总结了一切。如果您在任何迭代中的结果取决于先前的迭代,则无法避免循环。

于 2013-04-19T02:04:05.947 回答