【问题标题】:R: Quantstrat how to make a transaction for complete equity in portfolio?R:Quantstrat 如何为投资组合中的完整股权进行交易?
【发布时间】:2013-10-21 12:13:21
【问题描述】:

我还在玩 Guy Yollins quantstrat 的例子。在本例中,当 SPY 穿过其 10 日均线时,他买入 1000 股。由于我们定义了初始权益,是否可以始终购买整个投资组合的数量而不仅仅是 900 股? 'all' 对输入不起作用,只是对出口..

if (!exists('.blotter')) .blotter <- new.env()
if (!exists('.strategy')) .strategy <- new.env()
if (!exists('.instrument')) .instrument <- new.env()
currency("USD")
stock("SPY",currency="USD",multiplier=1)
ls(envir=FinancialInstrument:::.instrument)


initDate <- '1997-12-31'
startDate <- '1998-01-01'
endDate <- '2013-07-31'
initEq <- 1e6
Sys.setenv(TZ="UTC")
getSymbols('SPY', from=startDate, to=endDate, adjust=T)
SPY=to.monthly(SPY, indexAt='endof')
SPY$SMA10m <- SMA(Cl(SPY), 10)

# inz portfolio, account
qs.strategy <- "qsFaber"
rm.strat(qs.strategy) # remove strategy etc. if this is a re-run
initPortf(qs.strategy,'SPY', initDate=initDate)
initAcct(qs.strategy,portfolios=qs.strategy, initDate=initDate, initEq=initEq)


initOrders(portfolio=qs.strategy,initDate=initDate)
# instantiate a new strategy object
strategy(qs.strategy,store=TRUE)
add.indicator(strategy = qs.strategy, name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), n=10), label="SMA10")
add.signal(qs.strategy,name="sigCrossover",
           arguments = list(columns=c("Close","SMA10"),relationship="gt"),
           label="Cl.gt.SMA")
add.signal(qs.strategy,name="sigCrossover",
           arguments = list(columns=c("Close","SMA10"),relationship="lt"),
           label="Cl.lt.SMA")

add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Cl.gt.SMA", sigval=TRUE, orderqty=900,
                          ordertype='market', orderside='long', pricemethod='market'),
         type='enter', path.dep=TRUE)
add.rule(qs.strategy, name='ruleSignal',
         arguments = list(sigcol="Cl.lt.SMA", sigval=TRUE, orderqty='all',
                          ordertype='market', orderside='long', pricemethod='market'),
         type='exit', path.dep=TRUE)


out <- applyStrategy(strategy=qs.strategy , portfolios=qs.strategy)
updatePortf(qs.strategy)
updateAcct(qs.strategy)
updateEndEq(qs.strategy)

myTheme<-chart_theme()
myTheme$col$dn.col<-'lightblue'
myTheme$col$dn.border <- 'lightgray'
myTheme$col$up.border <- 'lightgray'
# plot performance
chart.Posn(qs.strategy, Symbol = 'SPY', Dates = '1998::',theme=myTheme)
plot(add_SMA(n=10,col=4, on=1, lwd=2))

【问题讨论】:

    标签: r quantstrat


    【解决方案1】:

    您不能在条目上使用orderqty="all",因为"all" 指的是当前头寸大小(即,当您想要退出整个头寸时)。

    可以购买等于可用投资组合总资产的金额,但您必须定义自定义定单大小函数。并且该函数必须标记该账簿(使用updatePortf)以确定可用股权的数量。

    【讨论】:

    • 感谢您的回答。你有一个例子的链接如何做到这一点?
    • @MichiZH:不,我没有。
    • 但是任何提示我如何获得可以在这些规则中使用的当前净值?我的意思是这样一个自定义定单规模函数需要访问当前净值...
    • @MichiZH:我已经告诉过你了。使用updatePorf 标记图书。
    • 抱歉,我还是 R 新手,尤其是 quantstrat、quantmod 等,学习曲线非常陡峭。抱歉第一次没看懂,还不知道怎么实现。
    【解决方案2】:

    这是一个实现你想要的玩具示例。

    你需要引入一个定单大小函数。

    查看函数ruleSignal 的参数(例如formals(ruleSignal)?ruleSignal)。

    您会看到有一个参数osFUN,您可以在其中编写自定义函数来确定您如何订购尺寸。

    您修改add.rule 中的适当参数以引入定单(在入场交易中)。

    osFUN_all_eq <- 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)
        # 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(trunc(equity / ClosePrice))
        UnitSize <- osMaxPos(data, timestamp, UnitSize, ordertype, orderside, portfolio, symbol, ruletype, digits=0)
        UnitSize
    }
    
    
    
    
    
    library(quantstrat)
    
    currency("USD")
    stock("SPY",currency="USD",multiplier=1)
    
    
    initDate <- '1997-12-31'
    startDate <- '1998-01-01'
    endDate <- '2013-07-31'
    initEq <- 1e6
    Sys.setenv(TZ="UTC")
    getSymbols('SPY', from=startDate, to=endDate, adjust=T)
    SPY=to.monthly(SPY, indexAt='endof')
    SPY$SMA10m <- SMA(Cl(SPY), 10)
    
    
    qs.strategy <- "qsFaber"
    rm.strat(qs.strategy) # remove strategy etc. if this is a re-run
    initPortf(qs.strategy,'SPY', initDate=initDate)
    initAcct(qs.strategy,portfolios=qs.strategy, initDate=initDate, initEq=initEq)
    
    
    initOrders(portfolio=qs.strategy,initDate=initDate)
    # instantiate a new strategy object
    strategy(qs.strategy,store=TRUE)
    
    
    # Specify the max quantity you could hold in the SPY instrument.  Here we simply assume 1e5 units. You could reduce this number to limit the exposure
    max_qty_traded <- 1e5
    addPosLimit(qs.strategy, "SPY", timestamp = startDate, maxpos = max_qty_traded)
    
    add.indicator(strategy = qs.strategy, name = "SMA",
                  arguments = list(x = quote(Cl(mktdata)), n=10), label="SMA10")
    add.signal(qs.strategy,name="sigCrossover",
               arguments = list(columns=c("Close","SMA10"),relationship="gt"),
               label="Cl.gt.SMA")
    add.signal(qs.strategy,name="sigCrossover",
               arguments = list(columns=c("Close","SMA10"),relationship="lt"),
               label="Cl.lt.SMA")
    
    add.rule(qs.strategy, name='ruleSignal',
             arguments = list(sigcol="Cl.gt.SMA",
                              sigval=TRUE,
                              orderqty = 1, # the acutal orderqty size becomes redundant when supplying a function to the argument `osFUN`
                              osFUN = osFUN_all_eq,
                              ordertype='market', orderside='long', pricemethod='market'),
             type='enter', path.dep=TRUE)
    
    
    add.rule(qs.strategy, name='ruleSignal',
             arguments = list(sigcol="Cl.lt.SMA",
                              sigval=TRUE,
                              orderqty='all', # flatten all open long positions
                              ordertype='market',
                              orderside='long',
                              pricemethod='market'),
                              type='exit',
             path.dep=TRUE)
    
    
    # supply initEq parameter and its value, which pass through to `osFUN`
    out <- applyStrategy(strategy=qs.strategy , portfolios=qs.strategy, initEq=initEq)
    updatePortf(qs.strategy)
    updateAcct(qs.strategy)
    updateEndEq(qs.strategy)
    
    myTheme<-chart_theme()
    myTheme$col$dn.col<-'lightblue'
    myTheme$col$dn.border <- 'lightgray'
    myTheme$col$up.border <- 'lightgray'
    # plot performance
    chart.Posn(qs.strategy, Symbol = 'SPY', Dates = '1998::',theme=myTheme)
    plot(add_SMA(n=10,col=4, on=1, lwd=2))
    

    在定单大小函数中应考虑以下几点:

    1) 如果您已经有一个未平仓头寸,您是否希望允许在特定一侧“堆叠”/金字塔式的头寸?例如,如果您只想拥有一个职位,而您没有进一步贡献,您可以在您的 osFUN 中包含getPosQty(qs.strategy, "SPY", timestamp),如果当前持有的职位不是 0,则返回 0。

    2) 您想要最大交易规模吗?这可以使用addPosLimit() 来处理,就像上面这个例子中所做的那样。

    【讨论】:

      【解决方案3】:

      我知道这个问题是很久以前发布的,但请查看包“IKTrading”和定单大小功能“osMaxDollar”。这是关于该主题的博客文章;当您使用此定单大小功能时,您可以设置每笔交易的美元价值和总头寸。

      https://quantstrattrader.wordpress.com/2014/08/29/comparing-atr-order-sizing-to-max-dollar-order-sizing/

      【讨论】:

        猜你喜欢
        • 2019-08-23
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2021-01-11
        • 2017-03-09
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        相关资源
        最近更新 更多