- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我正在使用 quantstrat 处理的多时间框架策略的示例。这是执行多时间框架策略的正确方法还是我做错了?我还没有在 quantstrat 演示或谷歌搜索中遇到任何其他执行多时间帧的示例。
为了使策略部分保持简单(这不是有人会交易的策略)并将重点放在多时间框架方面,我将演示一个使用逐笔报价数据和 5 分钟 OHLC 数据的简单策略。策略逻辑是当分时数据上穿5分钟数据的30周期SMA时买入,当分时数据下穿同一均线时平仓。
例如:如果策略持平,则时间为13:02,5分钟数据的前一个观察到的30周期SMA为90.55(对于12:55-13:00结束的周期),以及tick数据从低于 90.55 到高于它 (90.56) 是买入,当分时数据再次收盘低于它时,它退出头寸。
为了实现这一点,我需要将刻度数据和 5 分钟、30 周期的 SMA 放入同一个对象中,以便 quantstrat 进行处理。我得到了 5 分钟的 OHLC xts 并计算了它的 30 周期 SMA。然后我将它合并到刻度数据 xts 对象中,这将给我一个包含所有刻度数据的对象,然后每 5 分钟我将获得最后观察到的 5 分钟、30 周期 SMA 的一行。
如果在 13:00 有 30 周期 SMA 值,则这是 12:55-13:00 的 5 分钟。由于 SMA 的下一次更新是 5 分钟后,我需要填充行直到观察到下一个值(在 13:05),依此类推。
这是head
刻度数据(我拥有的刻度数据不包括毫秒,但我使用 make.index.unique(clemtick)
使行变得唯一:
head(clemtick)
Price Volume
2013-01-15 09:00:00 93.90 1
2013-01-15 09:00:00 93.89 1
2013-01-15 09:00:00 93.89 1
2013-01-15 09:00:00 93.88 2
2013-01-15 09:00:00 93.89 1
2013-01-15 09:00:00 93.89 2
head
1 分钟数据(每分钟代表前一分钟的数据,例如时间戳 09:01:00 == 09:00:00 - 09:01:00 的数据):
head(clemin)
Open High Low Close Volume
2013-01-15 09:01:00 93.90 94.04 93.87 93.97 1631
2013-01-15 09:02:00 93.97 93.98 93.90 93.91 522
2013-01-15 09:03:00 93.91 93.97 93.90 93.96 248
2013-01-15 09:04:00 93.95 93.98 93.93 93.95 138
2013-01-15 09:05:00 93.95 93.96 93.91 93.92 143
2013-01-15 09:06:00 93.93 93.97 93.91 93.91 729
cle5min <- to.minutes5(clemin)
clemin.Open clemin.High clemin.Low clemin.Close clemin.Volume
2013-01-15 09:04:00 93.90 94.04 93.87 93.95 2539
2013-01-15 09:09:00 93.95 93.97 93.81 93.89 2356
2013-01-15 09:14:00 93.90 94.05 93.86 93.89 4050
2013-01-15 09:19:00 93.90 94.03 93.84 94.00 2351
2013-01-15 09:24:00 93.99 94.21 93.97 94.18 3261
2013-01-15 09:29:00 94.18 94.26 94.18 94.19 1361
to.minutes5
函数有效,即
discussed in this thread .基本上第一个时间戳 09:04:00 == OHLC 4 分钟的数据,从 09:00:00 - 09:04:00。 09:09:00 时间戳是从 09:04:00 到 09:09:00 的下一个整整 5 分钟。理想情况下,我希望每个时间戳为 5、10、15 等,但我还没有弄清楚如何做到这一点。
clemtick$sma30 <- SMA(cle5min$clemin.Close, 30)
clemtick["2013-01-15 11:28:59::2013-01-15 11:29:00"]
Price Volume SMA30
2013-01-15 11:28:59 93.87 1 NA
2013-01-15 11:28:59 93.87 1 NA
2013-01-15 11:28:59 93.88 1 NA
2013-01-15 11:29:00 93.87 1 93.92633
2013-01-15 11:29:00 93.87 1 NA
2013-01-15 11:29:00 93.88 1 NA
2013-01-15 11:29:00 93.88 1 NA
SMA30
具有重复值的列。
SMA30
的值11:29:00 是 OHLC 的 11:24:00 - 11:29:00。这个值的下一次更新要到 11:34:00,所以我需要填充行直到下一个值,因为这是逐行处理时策略将引用的内容。
clemtick <- na.locf(clemtick)
clemtick["2013-01-15 11:33:58::2013-01-15 11:34:01"]
Price Volume SMA30
2013-01-15 11:33:58 93.84 1 93.92633
2013-01-15 11:34:00 93.84 1 93.92267
2013-01-15 11:34:00 93.85 1 93.92267
2013-01-15 11:34:01 93.84 1 93.92267
require(quantstrat)
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
Sys.setenv(TZ="UTC")
symbols <- "clemtick"
currency('USD')
stock(symbols, currency="USD", multiplier=1)
account.st <- 0
strategy.st <- portfolio.st <- account.st <- "multi"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initDate <- "1980-01-01"
tradeSize <- 1000
initEq <- tradeSize*length(symbols)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st,
initDate=initDate, currency='USD', initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("Price", "sma30"), relationship="gt"),
label="golong")
add.signal(strategy.st, name="sigCrossover",
arguments=list(columns=c("Price", "sma30"), relationship="lt"),
label="exitlong")
#enter rule
add.rule(strategy.st, name="ruleSignal",
arguments=list(sigcol="golong",
sigval=TRUE,
ordertype="market",
orderside="long",
replace=TRUE,
prefer="Price",
orderqty=1),
type="enter", path.dep=TRUE, label="long")
#exit rule
add.rule(strategy.st, name = "ruleSignal",
arguments=list(sigcol="exitlong",
sigval=TRUE,
ordertype="market",
orderside="long",
replace=TRUE,
prefer="Price",
orderqty=-1),
type="exit", path.dep=TRUE, label="exitlong")
#apply strategy
t1 <- Sys.time()
out2 <- applyStrategy(strategy=strategy.st, portfolios=portfolio.st, debug=TRUE)
t2 <- Sys.time()
print(t2-t1)
head(mktdata)
nrow(mktdata)
最佳答案
以下是将多时间框架指标/信号纳入您的策略的两种方法。两者都仅使用 quantstrat 样本数据即可开箱即用。
两者都遵循相同的策略(并给出相同的结果):该策略使用 1 分钟柱线的 SMA(20) 和 SMA(10)
在 30 分钟柱上生成交易信号。进入多头头寸时
SMA(20, 1 min bar)穿过SMA(10, 30 min bar)上方。从漫长的退出
当 SMA(20, 1 min bar) 低于 SMA (10, 30 min bar) 时的位置
方法 1:在较低的时间频率内建立价格数据和指标add.indicator
调用的自定义函数. (你不能去更高的时间频率
比交易品种的原始市场数据)。
from <- "2002-10-20"
to <- "2002-10-24"
symbols <- "GBPUSD"
# Load 1 minute data stored in the quantstrat package
getSymbols.FI(Symbols = symbols,
dir=system.file('extdata',package='quantstrat'),
from=from,
to=to
)
currency(c('GBP', 'USD'))
exchange_rate('GBPUSD', tick_size=0.0001)
strategy.st <- "multiFrame"
portfolio.st <- "multiFrame"
account.st <- "multiFrame"
initEq <- 50000
rm.strat(strategy.st)
initPortf(portfolio.st, symbols = symbols)
initAcct(account.st, portfolios = portfolio.st, initEq = initEq)
initOrders(portfolio.st)
strategy(strategy.st, store = TRUE)
# Create an SMA on 20 1 minute bars:
add.indicator(strategy.st, name = "SMA",
arguments = list(x = quote(Cl(mktdata)),
n = 20),
label = "MA20")
# Define the function that add.indicator will use to create an SMA(10) on 30 minute bars:
ind30minMA <- function(x, n30min = 10) {
if (!is.OHLC(x))
stop("Must pass in OHLC data")
x.h <- to.period(x[, 1:4], period = "minutes", k = 30, indexAt = "endof")
#^ Ensure that the timestamp on the lower frequency data is at the END of the bar/candle, to avoid look forward bias.
# If you need to know what symbol you are currently processing:
# symbol <- parent.frame(n = 2)$symbol
sma.h <- SMA(Cl(x.h), n = n30min)
r <- merge(sma.h, xts(, index(x)), fill= na.locf)
#^ Carry forward the last value, no lookforward bias introduced
r <- r[index(x)]
# if you don't return the same # of rows in the argument x, then quantstrat won't work correctly. So let's check the data is OK after the merge above:
stopifnot(NROW(r) == NROW(x))
r
}
add.indicator(strategy.st, name = "ind30minMA",
arguments = list(x = quote(mktdata),
n30min = 10),
label = "MA30minbar")
add.signal(strategy.st, name = "sigCrossover",
arguments = list(columns = c("SMA.MA20", "SMA.MA30minbar"),
relationship = "gt"),
label = "FastCrossUp")
add.signal(strategy.st, name = "sigCrossover",
arguments = list(columns = c("SMA.MA20", "SMA.MA30minbar"),
relationship = "lt"),
label = "FastCrossDn")
add.rule(strategy.st,name='ruleSignal',
arguments = list(sigcol="FastCrossUp",
sigval=TRUE,
orderqty= 100,
ordertype='market',
orderside='long',
threshold=NULL),
type='enter',
label='enterL',
storefun=FALSE
)
add.rule(strategy.st,name='ruleSignal',
arguments = list(sigcol="FastCrossDn",
sigval=TRUE,
orderqty='all',
ordertype='market',
orderside='long',
threshold=NULL,
orderset='default',
replace = TRUE),
type='exit',
label='exitL'
)
applyStrategy(strategy.st, portfolio.st)
tail(mktdata)
# Open High Low Close Volume SMA.MA20 SMA.MA30minbar FastCrossUp FastCrossDn
# 2002-10-24 17:54:00 1.5552 1.5552 1.5552 1.5552 0 1.555115 1.55467 NA NA
# 2002-10-24 17:55:00 1.5552 1.5552 1.5551 1.5551 0 1.555120 1.55467 NA NA
# 2002-10-24 17:56:00 1.5551 1.5551 1.5551 1.5551 0 1.555125 1.55467 NA NA
# 2002-10-24 17:57:00 1.5551 1.5551 1.5551 1.5551 0 1.555130 1.55467 NA NA
# 2002-10-24 17:58:00 1.5551 1.5551 1.5551 1.5551 0 1.555130 1.55467 NA NA
# 2002-10-24 17:59:00 1.5551 1.5551 1.5551 1.5551 0 1.555135 1.55478 NA NA
tx <- getTxns(portfolio.st, "GBPUSD")
# Record total PL earned. This number should be identical to the result from the second approach listed below:
sum(tx$Net.Txn.Realized.PL)
# -0.03
[symbol].d
中名称的每日市场数据。 (请参阅下文了解我的意思)。显然,这些日常数据也可以从磁盘加载到内存中。我们在不同的时间频率上使用这些预先计算的数据集,而不是计算指标函数内部的柱线数据(如上面的 indDailyMA 中所做的):
library(quantstrat)
from <- "2002-10-20"
to <- "2002-10-24"
symbols <- "GBPUSD"
# Load 1 minute data stored in the quantstrat package
getSymbols.FI(Symbols = symbols,
dir=system.file('extdata',package='quantstrat'),
from=from,
to=to
)
currency(c('GBP', 'USD'))
exchange_rate('GBPUSD', tick_size=0.0001)
strategy.st <- "multiFrame"
portfolio.st <- "multiFrame"
account.st <- "multiFrame"
# Parameters:
initEq <- 50000
rm.strat(strategy.st)
initPortf(portfolio.st, symbols = symbols)
initAcct(account.st, portfolios = portfolio.st, initEq = initEq)
initOrders(portfolio.st)
strategy(strategy.st, store = TRUE)
GBPUSD <- GBPUSD[, colnames(GBPUSD) != "Volume"]
# Before running the backtest, create the lower frequency market data
GBPUSD.30m <- to.period(OHLC(GBPUSD), period = "minutes", k = 30, indexAt = "endof", name = "GBPUSD")
GBPUSD.1m.idx <- index(GBPUSD)
NROW(GBPUSD)
# 5276
# Add the lower frequency data indicators to the higher frequency data that will be processed in quantstrat. Fill forward the lower frequency moving average
GBPUSD <- merge(GBPUSD, setNames(SMA(Cl(GBPUSD.30m), n = 10), "SMA.MA30minbar"))
GBPUSD$SMA.MA30minbar <- na.locf(GBPUSD$SMA.MA30minbar)
# Note: Short hand for the above will the fill argument, which can be helpful in special cases where NAs only exist in the new data to be added:
# GBPUSD <- merge(GBPUSD, setNames(SMA(Cl(GBPUSD.30m), n = 10), "SMA.MA30minbar"), fill = na.locf)
NROW(GBPUSD)
# 5276
# After doing this merge, sometimes extra rows will appear beyond what GBPUSD (based on the original 1 min bar data)
GBPUSD <- GBPUSD[GBPUSD.1m.idx, ]
# Now GBPUSD, which will be the raw data used in applyStrategy, already contains the 30 min bar indicators.
add.indicator(strategy.st, name = "SMA",
arguments = list(x = quote(Cl(mktdata)),
n = 20),
label = "MA20")
add.signal(strategy.st, name = "sigCrossover",
arguments = list(columns = c("SMA.MA20", "SMA.MA30minbar"),
relationship = "gt"),
label = "FastCrossUp")
add.signal(strategy.st, name = "sigCrossover",
arguments = list(columns = c("SMA.MA20", "SMA.MA30minbar"),
relationship = "lt"),
label = "FastCrossDn")
add.rule(strategy.st,name='ruleSignal',
arguments = list(sigcol="FastCrossUp",
sigval=TRUE,
orderqty= 100,
ordertype='market',
orderside='long',
threshold=NULL),
type='enter',
label='enterL',
storefun=FALSE
)
add.rule(strategy.st,name='ruleSignal',
arguments = list(sigcol="FastCrossDn",
sigval=TRUE,
orderqty='all',
ordertype='market',
orderside='long',
threshold=NULL,
orderset='sysMACD',
replace = TRUE),
type='exit',
label='exitL'
)
applyStrategy(strategy.st, portfolio.st)
tail(mktdata)
# Open High Low Close SMA.MA30minbar SMA.MA20 FastCrossUp FastCrossDn
# 2002-10-24 17:54:00 1.5552 1.5552 1.5552 1.5552 1.55467 1.555115 NA NA
# 2002-10-24 17:55:00 1.5552 1.5552 1.5551 1.5551 1.55467 1.555120 NA NA
# 2002-10-24 17:56:00 1.5551 1.5551 1.5551 1.5551 1.55467 1.555125 NA NA
# 2002-10-24 17:57:00 1.5551 1.5551 1.5551 1.5551 1.55467 1.555130 NA NA
# 2002-10-24 17:58:00 1.5551 1.5551 1.5551 1.5551 1.55467 1.555130 NA NA
# 2002-10-24 17:59:00 1.5551 1.5551 1.5551 1.5551 1.55478 1.555135 NA NA
tx <- getTxns(portfolio.st, "GBPUSD")
sum(tx$Net.Txn.Realized.PL)
# -0.03
# Same result as the first approach, as we would expect
关于r - 使用 quantstrat 执行多时间框架策略的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063997/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!