/ / Quantstrat:Ordersize関数 - r、bitcoin、quantstrat、バックテスト

Quantstrat:Ordersize関数 - r、ビットコイン、クオンタット、バックテスト

私はRに新しいが、私はどのようにカスタムordersize関数を使用するには、quantstratを取得します。この考え方は、常にB&H戦略に匹敵するようにBitcoinに利用可能なすべての株式を投資することです。再現可能なコードを提供しました。最初はうまくいっているようですが、注文書を見ると問題が発生します。たぶん、価格は終値との間にある程度の不一致があるかもしれませんが、Quantstratは利用可能な資本に応じてBitcoinの金額を注文しません。 例えば。 (= "2016-12-31"から "2018-01-01"まで) "2017-01-30"では、quantstratは最初に920.730042で10万米ドルのビットコインを購入し、orderqtyは10.8609467963901です。 "2017-03-20"では、最初の投資額は1047.51001であるため、avaible株は(10.8609467963901 x 1047.51001)= 11376.9504873になるはずであり、これを注文する必要があります(11376.9504873 / 1129.869995)= 10.0692562309 BTC BTCUSD = 1129.869995のときは「2017-04-04」。代わりに10.3482135951968 BTCが注文されます。誰かが正しい方向に私を指差してくれますか?

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

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

回答:

回答№1は0

ordersize関数を調整してこの問題を修正しました。

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
}