首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quantstrat: Ordersize函数

Quantstrat: Ordersize函数
EN

Stack Overflow用户
提问于 2018-04-24 14:32:25
回答 1查看 387关注 0票数 1

我是R的新手,我正在尝试弄清楚如何让quantstrat与自定义的ordersize函数一起工作。我们的想法是始终将所有可用股本投资于比特币,以便与B&H策略相媲美。我已经提供了可重现的代码。起初,它似乎工作得很好,但当我查看我的订单簿时,问题出现了。也许他们的收盘价有些不匹配,但quantstrat并没有根据可用股本订购比特币的数量。例如,(from= "2016-12-31“to= "2018-01-01")在"2017-01-30”,quantstrat首先以920.730042美元的价格购买了价值10000美元的比特币,订单数量为10.8609467963901。在"2017-03-20“,它以1047.51001的价格出售初始投资,因此可用股本现在应该是(11376.9504873 x 1047.51001)= 11376.9504873,我预计quantstrat应该订购(11376.9504873/ 1129.869995)= 10.0692562309 BTC,当BTCUSD = 1129.869995时,它再次在”10.8609467963901-04-04“购买。取而代之的是订购了10.3482135951968个BTC。有人能给我指个方向吗?

代码语言:javascript
复制
Order.Qty                    Order.Price    Order.Type Order.Side 
2017-01-30 "10.8609467963901" "920.730042"   "market"   "long"     NA             
2017-03-20 "all"              "1047.51001"   "market"   "long"     NA             
2017-04-04 "10.3482135951968" "1129.869995"  "market"   "long"     NA             
2017-06-27 "all"              "2577.73999"   "market"   "long"     NA             
2017-07-23 "9.36005714412325" "2763.42041"   "market"   "long"     NA             
2017-09-12 "all"              "3870.289551"  "market"   "long"     NA             
2017-09-28 "7.68025279952473" "4172.790527"  "market"   "long"     NA             
2017-12-27 "all"              "15416.633789" "market"   "long"     NA 

代码语言:javascript
复制
library("quantstrat")
init.portf <- "2016-12-31"
.from <- init.portf
.to <-"2018-01-01"

Sys.setenv(TZ="UTC")
initEq <- 10000

getSymbols("BTCUSD=X", src = "yahoo", from= .from, to= .to)
BTCUSD <- `BTCUSD=X`
currency(c("USD", "BTC"))
exchange_rate("BTCUSD", currency = "USD")

trend1.strat <- "TrendStrat1"
rm.strat(trend1.strat)

strategy(name=trend1.strat,store=TRUE)

add.indicator(strategy=trend1.strat,name="SMA",
arguments=list(x=quote(Cl(mktdata)),n=5),label="FastSMA")

add.indicator(strategy=trend1.strat,name="SMA",
arguments=list(x=quote(Cl(mktdata)),n=20),label="SlowSMA")

add.signal(strategy=trend1.strat,name="sigCrossover",
arguments=list(columns=c("FastSMA","SlowSMA"),
relationship="gt"),label="BuySignal")

add.signal(strategy=trend1.strat,name="sigCrossover",
arguments=list(columns=c("FastSMA","SlowSMA"),
relationship="lt"),label="SellSignal")

osInvestAll <- function (data, timestamp, orderqty, ordertype, 
orderside, equity, portfolio, symbol, ruletype, ..., initEq) {

     datePos <- format(timestamp,"%Y-%m-%d")
     updatePortf(Portfolio=portfolio,Symbol=symbol,
     Dates=paste0(start(data),"/", datePos))

     trading_pl <- sum(.getPortfolio(portfolio)$summary$Net.Trading.PL)
     equity <- initEq + trading_pl
     ClosePrice <- getPrice(data, prefer = "Close")[datePos]
     UnitSize <- as.numeric((equity / ClosePrice))

     UnitSize
}

add.rule(strategy=trend1.strat,name='ruleSignal',
arguments=list(sigcol="BuySignal",sigval=TRUE,ordertype='market',
orderside='long', osFUN = osInvestAll, prefer = 
"Close"),type='enter',label="EnterRule",enabled=T)

add.rule(strategy=trend1.strat,name='ruleSignal',
arguments=list(sigcol="SellSignal",sigval=TRUE,orderqty='all',
ordertype='market',orderside='long', prefer 
="Close"),type='exit',label="ExitRule",enabled=T)

trend1.portf <- "TrendPort1"
rm.strat(trend1.portf)

initPortf(name=trend1.portf,symbols="BTCUSD",initDate=init.portf)

initAcct(name=trend1.strat,portfolios=trend1.portf,
initDate=init.portf,initEq= initEq)

initOrders(portfolio=trend1.portf,initDate=init.portf)

applyStrategy(strategy=trend1.strat,portfolios=trend1.portf, initEq = 
initEq)

updatePortf(Portfolio=trend1.portf)

updateAcct(name=trend1.strat)

updateEndEq(Account=trend1.strat)

trend1.book <- getOrderBook(portfolio=trend1.portf)
trend1.book
EN

回答 1

Stack Overflow用户

发布于 2018-05-01 00:36:18

通过调整ordersize函数修复此问题:

代码语言:javascript
复制
osInvestAll <- function (data, timestamp, orderqty, ordertype, 
orderside, equity, portfolio, symbol, ruletype, ..., initEq) {
datePos <- format(timestamp,"%Y-%m-%d %H:%M:%OS")

datePos <- strptime(c(datePos), format = "%Y-%m-%d %H:%M:%OS", tz = 
"UTC") + 86400 #for daily data

updatePortf(Portfolio=portfolio,Symbol=symbol,Dates=paste0(start(data), 
"/", datePos))
# After updating portfolio profit, we can extract the Net.Trading.PL 
earned up to datePos.
trading_pl <- sum(.getPortfolio(portfolio)$summary$Net.Trading.PL)
# The total equity in the strategy for this symbol (and this symbol 
only in isolation always, as this is how quantstrat by default works 
with applyStrategy)
equity <- initEq + trading_pl
ClosePrice <- getPrice(data, prefer = "Close")[datePos]
UnitSize <- as.numeric((equity / ClosePrice))
UnitSize1 <- round(UnitSize, digits = 8)
UnitSize1
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49994856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档