R 多电流策略-吸墨器和;量子战略
我想在这条线上反弹 基本上,我正在使用quantstrat对一项策略进行回溯测试,我拥有多种货币的工具,但我希望以美元进行汇总报告(即账户和投资组合以美元计) 为了简化起见,假设我在布伦特期货(欧元)上对一个简单的20-120 MA交叉策略进行回溯测试,但我希望我的PnL是美元 我会尽量提供所有必要的信息,因为约书亚·乌尔里希对可复制的例子要求严格,他是对的 导入csv文件和清除数据的我的功能 所以我导入了数据,设置了仪器,我可以运行通常的quantstrat代码R 多电流策略-吸墨器和;量子战略,r,quantstrat,blotter,financialinstrument,R,Quantstrat,Blotter,Financialinstrument,我想在这条线上反弹 基本上,我正在使用quantstrat对一项策略进行回溯测试,我拥有多种货币的工具,但我希望以美元进行汇总报告(即账户和投资组合以美元计) 为了简化起见,假设我在布伦特期货(欧元)上对一个简单的20-120 MA交叉策略进行回溯测试,但我希望我的PnL是美元 我会尽量提供所有必要的信息,因为约书亚·乌尔里希对可复制的例子要求严格,他是对的 导入csv文件和清除数据的我的功能 所以我导入了数据,设置了仪器,我可以运行通常的quantstrat代码 symbols <-
symbols <- c("BRENT")
Sys.setenv(TZ="GMT")
rm(list = ls(.blotter), envir = .blotter)
#Set up environment
if (!exists('.blotter')) .blotter <- new.env()
if(!exists('.strategy')) .strategy <- new.env()
if(!exists('.instrument')) .instrument <- new.env()
start.date <- min(index(symbols))+50 #1ere date du jeu de donnée
end.date <- Sys.Date()-5 #dernière date du jeu de donnée
initial.capital <- 0 #Capital de départ
MAcrossover <- strategy("MAcrossover")
portfolio.st <- account.st <- strat.st <- "MAcrossover"
initPortf(portfolio.st, #nom du book
symbols = symbols, #list des instruments
currency='USD')
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
# initDate = init.date, #date de départ du compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st,
symbols = symbols)
strategy("MAcrossover",store = TRUE)
#Parametres
ma1 <- 20
ma2 <- 120
maxpos <- 1
tradesize <- 1
#position limit
addPosLimit("MAcrossover", symbols, maxpos = maxpos, timestamp = start(BRENT)-1)
#preparation indicateurs
for(symbol in symbols){
x=get(symbol)
x$MA1 <- SMA(Cl(x),n=ma1)
x$MA2 <- SMA(Cl(x),n=ma2)
assign(symbol,x)
}
#Signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "long") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "short") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitlong") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitshort") #label de la colonne du signal
#Rules
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=tradesize, #taille de l'ordre
osFUN = osMaxPos,
prefer = "Close",
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "enterlongcrossover") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "exitlongcrossover") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=-tradesize,#taille de l'ordre
replace = FALSE,
prefer = "Close",
osFUN = osMaxPos,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Entershort") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "exitshortcrossover") #label si exécution
out <- applyStrategy("MAcrossover", portfolios = portfolio.st)
updatePortf("MAcrossover")
updateAcct("MAcrossover")
updateEndEq("MAcrossover")
我在2002-03-07的643.45得到一个PnL
当我用货币=美元来设定未来布伦特原油时
我在2002-03-07的580得到一个PnL
这不符合逻辑。隐含的欧元兑美元汇率为(580/643)=0.90,而正确汇率为0.8822
所以我的问题是
-我们能处理几种货币吗?
-如果是,我错在哪里
提前多谢了
尼古拉斯
currency(c("USD","EUR",))
exchange_rate(c("EURUSD"),"USD")
future("BRENT",currency = "EUR",tick_size = 0.01,multiplier = 1000)
symbols <- c("BRENT")
Sys.setenv(TZ="GMT")
rm(list = ls(.blotter), envir = .blotter)
#Set up environment
if (!exists('.blotter')) .blotter <- new.env()
if(!exists('.strategy')) .strategy <- new.env()
if(!exists('.instrument')) .instrument <- new.env()
start.date <- min(index(symbols))+50 #1ere date du jeu de donnée
end.date <- Sys.Date()-5 #dernière date du jeu de donnée
initial.capital <- 0 #Capital de départ
MAcrossover <- strategy("MAcrossover")
portfolio.st <- account.st <- strat.st <- "MAcrossover"
initPortf(portfolio.st, #nom du book
symbols = symbols, #list des instruments
currency='USD')
initAcct(account.st, #nom du compte
portfolios = portfolio.st, #nom du portfeuille rattaché au compte
# initDate = init.date, #date de départ du compte
currency = "USD", #devise du compte
initEq = initial.capital) #capital de départ du compte
initOrders(portfolio.st,
symbols = symbols)
strategy("MAcrossover",store = TRUE)
#Parametres
ma1 <- 20
ma2 <- 120
maxpos <- 1
tradesize <- 1
#position limit
addPosLimit("MAcrossover", symbols, maxpos = maxpos, timestamp = start(BRENT)-1)
#preparation indicateurs
for(symbol in symbols){
x=get(symbol)
x$MA1 <- SMA(Cl(x),n=ma1)
x$MA2 <- SMA(Cl(x),n=ma2)
assign(symbol,x)
}
#Signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "long") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "short") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="lt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitlong") #label de la colonne du signal
add.signal("MAcrossover", #nom de la strategie
name="sigCrossover", #type de signal
arguments = list(columns =c("MA1","MA2"), #liste des colonnes pour déterminer le signal
relationship="gt"), #type de relation du signal (sup ou égal, sup, inférieur etc..)
label = "exitshort") #label de la colonne du signal
#Rules
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=tradesize, #taille de l'ordre
osFUN = osMaxPos,
prefer = "Close",
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "enterlongcrossover") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="long"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "exitlongcrossover") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="short", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty=-tradesize,#taille de l'ordre
replace = FALSE,
prefer = "Close",
osFUN = osMaxPos,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "enter", #ouverture ou fermeture de pose
label = "Entershort") #label si exécution
add.rule("MAcrossover", #nom de la strategie
name = "ruleSignal", #
arguments = list(sigcol ="long", #nom de la colonne à vérifier
sigval = TRUE, #Application de la règle si signal
orderqty="all", #taille de l'ordre
replace = FALSE,
ordertype = "market", #type d'ordre
orderside ="short"), #sens
type = "exit", #ouverture ou fermeture de pose
label = "exitshortcrossover") #label si exécution
out <- applyStrategy("MAcrossover", portfolios = portfolio.st)
updatePortf("MAcrossover")
updateAcct("MAcrossover")
updateEndEq("MAcrossover")
future("BRENT",currency = "EUR",tick_size = 0.01,multiplier = 1000)