2017-07-13 14 views
1

私はRのQuantstratパッケージでバックテスト戦略を実行しようとしています。楽器は小麦先物で、米国セントで引用されています。契約サイズは5000ブッシェルです。私は次のコードを追加しました。R:Quantstrat TxnFees乗数

future(symbols, 
     currency = "USD", 
     tick_size = 0.25, 
     multiplier = 50) 

モデルを実行している場合しかし、取引手数料がブロッターパッケージas shown in this code on githubで計算されている方法を見て私に促され、利益が小さすぎると損失を描くように思われます。

#' @param ConMult Contract/instrument multiplier for the Symbol if it is not defined in an instrument specification 

これは私が.txnfees <- -10を指定すると、課税料は50 * -10 = -500、私は-0.2であることをTxnFeesを指定する必要があり、その場合であることを意味しています。注文ごとに設定金額を指定するにはどうすればよいですか?

答えて

3

は直接関係なく、貿易量の、-10に等しい貿易取引コストを行いますruleSignalで.txnfees <- -10を設定し、あなたの質問に答えるために。 FinancialInstrumentで定義された契約の乗数は、取引コストの計算に直接影響しません。ここでは、あなたが...あなたがが期待背景の

最初のビットを達成するに取り掛かることができる方法である:取引コストは、あなたが正しく識別したquantstrat backtests、で出番blotteraddTxnのソースコードです。 TxnFeesを(正ではない)数値として、または手数料の計算方法を定義する関数の名前である文字列として渡すことができます。注意深く見ると、TxnQty, TxnPrice, SymbolはすべてTxnFee関数に渡される引数です。 (

quantstratで
if (is.function(TxnFees)) { 
     txnfees <- TxnFees(TxnQty, TxnPrice, Symbol) 
    } else { 
     txnfees<- as.numeric(TxnFees) 
    } 

ruleSignalへの引数はTxnFees引数を介した取引費用を含め(とruleSignaladd.ruleへの引数である) しかし、あなたはカスタム関数に渡すことができます。つまりaddTxnにコードのこの部分を参照してください。その名前をruleSignalへの引数の文字列として指定します)、お好きな方法で取引手数料をモデル化します。

あなたがリンクしている同じブロッターソースファイルを見ると、トランザクションコスト関数の例があります(ブロッター単体テストを見てください)。

以下は
pennyPerShare <- function(TxnQty, ...) { 
    return(abs(TxnQty) * -0.01) 
} 

あなたが取引量の関数である手数料をモデル化することができる方法の他、完全に再現可能な例であり、単にデモンストレーションのために、私はstockオブジェクトから契約乗数引数を使用し、代わりにfutureオブジェクトのが、明らかに同じ種類のロジックがあらゆる楽器タイプに適用されます。以下の例では、取引ごとに取引金額の1.5%に相当する手数料が取引費用として請求されます。おそらく、この手数料をTxnPriceの機能にすることもできます。これは、この機能の別の引数です。

#--------------------------------------------------------------- 
# Define the transaction cost function 
txnFUN <- function(TxnQty, TxnPrice, Symbol, pct = 0.015) { 
    multiStock <- getInstrument(Symbol)$multiplier 
    # Do something with multiStock, here it is equal to 1, so it's effectively meaningless but shows how you could go about using it. 

    fees <- abs(TxnQty) * pct * multiStock 
    # Fees are a negative deduction for the trade: 
    if (fees > 0) fees <- -fees 

    fees 
} 

#------------------------------------------------------------------------------------- 


library(quantstrat) 


suppressWarnings(rm("order_book.RSI",pos=.strategy)) 
suppressWarnings(rm("account.RSI","portfolio.RSI",pos=.blotter)) 
suppressWarnings(rm("account.st","portfolio.st","stock.str","stratRSI","startDate","initEq",'start_t','end_t')) 


strategy.st <- "RSI" 

stratRSI <- strategy(strategy.st, store = TRUE) 


add.indicator(strategy = strategy.st, name = "RSI", arguments = list(price = quote(getPrice(mktdata))), label="RSI") 
add.signal(strategy = strategy.st, name="sigThreshold",arguments = list(threshold=70, column="RSI",relationship="gt", cross=TRUE),label="RSI.gt.70") 

add.signal(strategy = strategy.st, name="sigThreshold",arguments = list(threshold=30, column="RSI",relationship="lt",cross=TRUE),label="RSI.lt.30") 


add.rule(strategy = strategy.st, name='ruleSignal', arguments = list(sigcol="RSI.lt.30", sigval=TRUE, orderqty= 100, TxnFees="txnFUN", ordertype='market', orderside='long', pricemethod='market', replace=FALSE, osFUN=osMaxPos), type='enter', path.dep=TRUE) 
add.rule(strategy = strategy.st, name='ruleSignal', arguments = list(sigcol="RSI.gt.70", sigval=TRUE, orderqty='all', TxnFees="txnFUN", ordertype='market', orderside='long', pricemethod='market', replace=FALSE), type='exit', path.dep=TRUE) 


currency("USD") 
symbols = c("SPY") 
stock.str = symbols 

    startDate <- "1987-01-01" 
    getSymbols(stock.str,from=startDate, to= Sys.Date()) 

for(symbol in symbols){ 
    stock(symbol, currency="USD",multiplier=1) 
} 
SPY <- SPY["2015/"] 


startDate='2005-12-31' 
initEq=100000 
port.st<-'RSI' 

initPortf(port.st, symbols=symbols) 
initAcct(port.st, portfolios=port.st, initEq=initEq) 
initOrders(portfolio=port.st) 
for(symbol in symbols){ addPosLimit(port.st, symbol, startDate, 300, 3) } 

applyStrategy(strategy=strategy.st , portfolios=port.st, parameters=list(n=2)) 

updatePortf(Portfolio=port.st,Dates=paste('::',as.Date(Sys.time()),sep='')) 

取引量との関係で期待通りの料金であることを確認します。

tail(getTxns(port.st, "SPY"), 15) 
#      Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL 
# 2017-03-28 20:00:00 -100 234.3969  -1.5 -23439.69  234.3969   178.6209 
# 2017-04-05 20:00:00  100 234.2974  -1.5 23429.74  234.2974    -1.5000 
# 2017-04-11 20:00:00  100 232.8943  -1.5 23289.43  232.8943    -1.5000 
# 2017-04-20 20:00:00 -200 233.4515  -3.0 -46690.31  233.4515   -31.8605 
# 2017-05-14 20:00:00  100 239.1338  -1.5 23913.38  239.1338    -1.5000 
# 2017-05-15 20:00:00 -100 238.9149  -1.5 -23891.49  238.9149   -23.3933 
# 2017-05-17 20:00:00  100 235.6210  -1.5 23562.10  235.6210    -1.5000 
# 2017-05-22 20:00:00 -100 238.8851  -1.5 -23888.51  238.8851   324.9084 
# 2017-06-12 20:00:00  100 243.3632  -1.5 24336.32  243.3632    -1.5000 
# 2017-06-13 20:00:00 -100 243.0547  -1.5 -24305.47  243.0547   -32.3502 
# 2017-06-27 20:00:00  100 243.4900  -1.5 24349.00  243.4900    -1.5000 
# 2017-06-29 20:00:00  100 241.8000  -1.5 24180.00  241.8000    -1.5000 
# 2017-07-05 20:00:00 -200 240.5500  -3.0 -48110.00  240.5500   -422.0002 
# 2017-07-06 20:00:00  100 242.1100  -1.5 24211.00  242.1100    -1.5000 
# 2017-07-12 20:00:00 -100 244.4200  -1.5 -24442.00  244.4200   229.4997