私はosMaxPos
quantstrat をもう少しよく理解しようとして調べましたが、2 行のコードが混乱していて、タイプミスだと思います。
ソースコードはこのリンクで見つけることができますif(orderqty+pos>PosLimit[,"MaxPos"]) orderqty <- PosLimit[,"MinPos"]-pos
簡単に言うと、2 つのタイプミスは次のとおりですif (orderqty+pos < PosLimit[, "MinPos"]) orderqty <- PosLimit[,"MinPos"]-pos
。2. ソース コードの 226 行目は ですorderqty <- pos
が、コードは意図されていたと思います。orderqty <- -pos
近い将来、R-Forge トラッカーでこの質問に対する回答が得られる可能性があります。そうでない場合は、誰かがスタックオーバーフローを通じて私を助けてくれることを願っています。次の簡単な例を通して、2 番目のタイプミスを証明しようとしました。
この例は、ソース コードの一部を取り、いくつかの偽のデータを実行して、2 番目のタイプミスが実際に存在することを示しています。しかし、私はトレーディングと R に慣れていないので、完全に間違っている可能性があります。誰かが私を見てくれませんか、ありがとう。
# #### run a simplifed strategy to get values for pos and PosLimit
# portfolio <- "test"
# symbol <- "JQR_DAY"
# timestamp <- as.Date("2013-09-09")
# # get position quantity of timestamp
# pos <- getPosQty(portfolio, symbol, timestamp)
# # get positionlimits on timestamp
# PosLimit <- getPosLimit(portfolio, symbol, timestamp)
#### to make this example reproducible, I created pos and PosLimit values as following:
pos <- -4000
PosLimit <- xts(t(c(4000, 4, -4000, 4)), order.by = as.Date("2000-09-09"))
colnames(PosLimit) <- c("MaxPos", "LongLevels", "MinPos", "ShortLevels")
orderside <- "short" # existing positions are shorting
ruletype <- "risk" # ruletype is "risk"
# senario1: flatten all short positions
# orderqty <- "all"
# in the end, orderqty will be 4000 to be able to close all short positions
# senario2: orderqty is not enough to close all short positions
# orderqty <- 2000 # orderqty will be finally set as 2000
# senario3: orderqty is more than enough to close all short positions
orderqty <- 5000 # orderqty should be finally set as 4000,
# but it turns out to be -4000
# if using orderqty <- -pos, orderqty will be 4000
####################################################################
#### simplified code to perform buy_cover_short
####################################################################
# if orderside is short and orderqty > 0 to exit shorting
# if orderqty == "all", orderqty > 0 is true
if (orderqty > 0 & orderside == "short") {
# orderside == "short" suggests pos < 0
# if ruletype = risk
if (ruletype == "risk") {
# if orderqty = all
if (orderqty == "all")
# return -pos
orderqty <- (-1 * pos)
# meaning exit all shorting positions
# if orderqty != all, return orderqty itself
# only exit order quantity of short positions
else orderqty <- orderqty
}
# if orderqty > 0 but orderqty < |pos|
if ((orderqty + pos) <= 0) {
# return orderqty itself
# meaning leaving some shorting position alive
orderqty <- orderqty
}
# if orderqty + pos > 0
# meaning orderqty > -pos
# meaning orderqty > |pos|
else {
# it is a typo error ???????????????????
#flatten position, don't cross through zero
orderqty <- pos # orderqty <- -pos
}
}