[R-SIG-Finance] Blotter Question related to addAcctTxn and updateAcct

alexios ghalanos alexios at 4dscape.com
Thu Nov 6 17:18:19 CET 2014


Hi,

I have a question on the calculations used in updateAcct in relation to 
the addAcctTxn function. It would appear to me that the summation of 
capital account transactions in updateAcct is wrong, and I provide a 
reproducible example below with the code fragment which I believe is 
related to this.

###############################################################################
# reproducible example:
Sys.setenv(TZ='UTC')
library(blotter)
require(FinancialInstrument)
require(quantmod)
ibm = getSymbols("IBM",auto.assign=FALSE)
index(ibm)<-as.POSIXct(index(ibm))
if(!exists(".instrument")) .instrument <<- new.env()
if(!exists(".blotter")) .blotter <<- new.env()
# Define a currency and a stock
currency("USD")
stock("ibm", currency="USD", multiplier=1)
initPortf('p', symbols="ibm", 
currency="USD",initDate=as.POSIXct("2007-01-04"))
initAcct(name="a", portfolios="p",  initDate = as.POSIXct("2007-01-04"), 
initEq=10000, currency="USD")

# Day 1:
addTxn("p", "ibm",  TxnDate=as.POSIXct("2007-01-05"), TxnQty=50, 
TxnPrice=97.42, TxnFees = -0.05*50)
# create an account interest charge
addAcctTxn(Account="a", TxnDate=as.POSIXct("2007-01-05"), TxnType = 
"Interest", Amount=-10)
# update
updatePortf("p",Dates=as.POSIXct("2007-01-05"))
updateAcct(name="a",Dates=as.POSIXct("2007-01-05"))
updateEndEq(Account="a",Dates=as.POSIXct("2007-01-05"))
getAccount("a")$summary
# 2007-01-05
# Net.Performance = 
getAccount("a")$summary$Gross.Trading.PL["2007-01-05"] + 
getAccount("a")$summary$Txn.Fees["2007-01-05"]+getAccount("a")$summary$Interest["2007-01-05"]
# End.Eq = getAccount("a")$summary$End.Eq["2007-01-04"] + 
as.numeric(Net.Performance)
# Equal to 10000-txn.free-interest = 9987.5 (ok)

# Day 2:
# create another interest charge:
addAcctTxn(Account="a", TxnDate=as.POSIXct("2007-01-08"), TxnType = 
"Interest", Amount=-10)
updatePortf("p",Dates=as.POSIXct("2007-01-08"))
updateAcct(name="a",Dates=as.POSIXct("2007-01-08"))
updateEndEq(Account="a",Dates=as.POSIXct("2007-01-08"))
getAccount("a")$summary
# Note that the interest is not -10 but -20 (it has been summed over all 
previous days)
# 2007-01-08
# Net.Performance = 
getAccount("a")$summary$Gross.Trading.PL["2007-01-08"] + 
getAccount("a")$summary$Txn.Fees["2007-01-08"]+getAccount("a")$summary$Interest["2007-01-08"]
# i.e. 50*(98.90-97.42) - 20
# End.Eq = getAccount("a")$summary$End.Eq["2007-01-05"] + 
as.numeric(Net.Performance)

However, interest of -10 was already subtracted from the Ending Equity 
already on 2007-01-05.

In the code for updateAcct I notice 3 things (lines 111:139 in the 
github repo)
########################################################################
# Code extract
Additions = {
result = if(on=="none")
as.xts(sum(Account$Additions[paste("::",obsDates, sep="")]), 
order.by=index(table))
#
# Note 1: The use of '::' means add all transactions upto 
obsDates...should it not be just 'paste(obsDates, sep="")'
# since on="none" means that obsLength<=1 (on line 93)
#
else{
if(length(Account$Additions[obsDates])>0) # catch empty sets
period.apply(Account$Additions[obsDates], 
endpoints(Account$Additions[obsDates], on=on), sum) # aggregates 
multiple account txns
else
xts(rep(0,obsLength),order.by=obsDates)
}
},
Withdrawals = {
result = if(on=="none")
as.xts(sum(Account$Withdrawals[paste("::",obsDates, sep="")]), 
order.by=index(table))
else{
if(length(Account$Additions[obsDates])>0) # catch empty sets
#
# Note 2: Should this not be Account$Withdrawals?
#
period.apply(Account$Withdrawals[obsDates], 
endpoints(Account$Withdrawals[obsDates], on=periodicity(table)$units), sum)
else
xts(rep(0,obsLength),order.by=obsDates)
}
},
Interest = {
result = if(on=="none")
as.xts(sum(Account$Interest[paste("::",obsDates, sep="")]),, 
order.by=index(table))
else{
if(length(Account$Additions[obsDates])>0) # catch empty sets
#
# Note 3: Should this not be Account$Interest?
#
period.apply(Account$Interest[obsDates], 
endpoints(Account$Interest[obsDates], on=periodicity(table)$units), sum)
else
xts(rep(0,obsLength),order.by=obsDates)
}
},
###############################################################################

Apologies if I've completely misunderstood the use of some functionality.

Best,

Alexios

 > sessionInfo()

R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
LC_COLLATE=English_United Kingdom.1252
LC_CTYPE=English_United Kingdom.1252
LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C 

LC_TIME=English_United Kingdom.1252

attached base packages:
stats
graphics
grDevices
utils
datasets
methods
base

other attached packages:
blotter_0.8.19
devtools_1.5
PerformanceAnalytics_1.1.0
FinancialInstrument_1.1.9
quantmod_0.4-0
TTR_0.22-0
Defaults_1.1-1
xts_0.9-7
zoo_1.7-11

loaded via a namespace (and not attached):
digest_0.6.4
evaluate_0.5.5
grid_3.1.1
httr_0.4
lattice_0.20-29
memoise_0.2.1
parallel_3.1.1
RCurl_1.95-4.3
stringr_0.6.2
tools_3.1.1
whisker_0.3-2



More information about the R-SIG-Finance mailing list