Amelia Vettori
2011-Jan-07 06:36 UTC
[R] Calculating Returns : (Extremely sorry for earlier incomplete mail)
Dear R forum helpers, I am extremely sorry for the receipt of my incomplete mail yesterday. There was connectivity problem at my end and so I chose to send the mail through my cell, only to realize today about the way mail has been transmitted. I am again sending my complete mail through regular channel and sincerely apologize for the inconvenience caused. ## Here is my actual mail Dear R forum helpers, I have following data trans <- data.frame(currency = c("EURO", "USD", "USD", "GBP", "USD", "AUD"), position_amt = c(10000, 25000, 20000, 15000, 22000, 30000)) date <- c("12/31/2010", "12/30/2010", "12/29/2010", "12/28/2010", "12/27/2010", "12/24/2010", "12/23/2010", "12/22/2010", "12/21/2010", "12/20/2010") USD <- c(112.05, 112.9, 110.85, 109.63, 108.08, 111.23, 112.49, 108.87, 109.33, 111.88) GBP <- c(171.52, 168.27,169.03, 169.64, 169.29, 169.47, 170.9, 168.69, 170.9, 169.96) EURO <- c(42.71, 42.68, 41.86, 44.71, 44.14, 44.58, 41.07, 42.23, 44.55, 41.12) CHF <- c(41.5, 41.47, 42.84, 43.44, 43.69, 42.3, 42.05, 41.23, 42.76, 43.79) AUD <- c(109.55, 102.52, 114.91, 122.48, 122.12, 123.96, 100.36, 110.19, 121.58, 103.46) These are the exchange rates and I am trying calculating the returns. I am giving only a small portion of actual data as I can't send this as an attachment. I am using function as I want to generalize the code for any portfolio. # __________________________________________________ # My Code trans <- read.table('transactions.csv', header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE) # reading as table. #currency <- read.table('currency.csv') #date <- currency$date #USD = currency$USD #GBP = currency$GBP #EURO = currency$EURO #CHF = currency$CHF #AUD = currency$AUD # _________________________________________________________ # CREATION of Function. I am using function as no of transactions is not constant. spot_trans = function(currency_trans) { if (currency_trans == "USD") {rate = USD} # So if I am dealing with TRANSACTION "USD", I am selecting the USD exchange rates. if (currency_trans == "GBP") {rate = GBP} if (currency_trans == "EURO") {rate = EURO} if (currency_trans == "CHF") {rate = CHF} if (currency_trans == "AUD") {rate = AUD} # ________________________________________________ # CURRENCY Rate RETURNS i.e. lob(todays rate / yesterday rate) and the data is in descending "Date" order currency_rate_returns = NULL for (i in 1:(length(rate)-1)) # if there are 10 elements, total no of returns = 9 { currency_rate_returns[i] = log(rate[i]/rate[i+1]) } currency_rate_returns return(data.frame(returns = currency_rate_returns)) } # _______________________________________________ spot_returns_table <- lapply(1:nrow(trans), function(z) with(trans[z, ], spot_trans(currency_trans=trans$currency_transacted))) spot_returns_table This generates the output as given below with 30 warnings. Also, as there are six transactions, 6 outputs are generated but the output in all pertains only to the first transacations i.e. 6 times returns are generated for the first transaction "EURO"> warnings()Warning messages: 1: In if (currency_trans == "USD") { ... : the condition has length > 1 and only the first element will be used 2: In if (currency_trans == "GBP") { ... : the condition has length > 1 and only the first element will be used 3: In if (currency_trans == "EURO") { ... : the condition has length > 1 and only the first element will be used .... and so on The output is as given below.> spot_returns_table[[1]] spot_returns 1 0.0007026584 2 0.0193997094 3 -0.0658664732 4 0.0128307894 5 -0.0099189271 6 0.0820074000 7 -0.0278529410 8 -0.0534812850 9 0.0801175328 10 -0.0710983059 [[2]] spot_returns 1 0.0007026584 2 0.0193997094 3 -0.0658664732 4 0.0128307894 5 -0.0099189271 6 0.0820074000 7 -0.0278529410 8 -0.0534812850 9 0.0801175328 10 -0.0710983059 [[3]] spot_returns 1 0.0007026584 2 0.0193997094 3 -0.0658664732 4 0.0128307894 5 -0.0099189271 6 0.0820074000 .................... .................... and so on. Kindly guide as if there is only one transaction i.e. I am dealing with only one currency, code runs excellently. Thanking in advance and once again apologize for the inconvenience caused. Amelia Vettori [[alternative HTML version deleted]]
Petr PIKAL
2011-Jan-07 10:52 UTC
[R] Odp: Calculating Returns : (Extremely sorry for earlier incomplete mail)
Hi Your code is quite complicated and I get an error spot_returns_table <- lapply(1:nrow(trans), function(z) with(trans[z, ], spot_trans(currency_trans=trans$currency_transacted))) Error in if (currency_trans == "USD") { : argument is of length zero It seems to me that you do not know what is your code doing. The warnings are from the fact that the currency_trans value you feed to spot_trans function is longer than one and if function needs an input of only one logical value. Maybe you could use debug and see what are values of your variables during computation but I believe that better is to use more convenient input objects together with *apply or aggregate or basic math could be better solution. rate1 USD GBP EURO CHF AUD 1 112.05 171.52 42.71 41.50 109.55 2 112.90 168.27 42.68 41.47 102.52 3 110.85 169.03 41.86 42.84 114.91 4 109.63 169.64 44.71 43.44 122.48 5 108.08 169.29 44.14 43.69 122.12 6 111.23 169.47 44.58 42.30 123.96 7 112.49 170.90 41.07 42.05 100.36 8 108.87 168.69 42.23 41.23 110.19 9 109.33 170.90 44.55 42.76 121.58 10 111.88 169.96 41.12 43.79 103.46 log(rate1[-1,]/rate1[-nrow(rate1),]) Is this what you want? Regards Petr r-help-bounces at r-project.org napsal dne 07.01.2011 07:36:28:> > > > > > > > > > Dear R forum helpers, > > I am extremely sorry for the receipt of my incomplete mail yesterday.There> was connectivity problem at my end and so I chose to send the mailthrough my> cell, only to realize today about the way mail has been transmitted. Iam> again sending my complete mail through regular channel and sincerelyapologize> for the inconvenience caused. > > > ## Here is my actual mail > > > Dear R forum helpers, > > I have following data > > trans <- data.frame(currency = c("EURO", "USD", "USD", "GBP", "USD","AUD"),> position_amt = c(10000, 25000, 20000, 15000, 22000, 30000)) > > date <- c("12/31/2010", "12/30/2010", "12/29/2010", "12/28/2010","12/27/> 2010", "12/24/2010", "12/23/2010", "12/22/2010", "12/21/2010","12/20/2010")> USD <- c(112.05, 112.9, 110.85, 109.63, 108.08, 111.23, 112.49, 108.87,109.33, 111.88)> GBP <- c(171.52, 168.27,169.03, 169.64, 169.29, 169.47, 170.9, 168.69,170.9, 169.96)> EURO <- c(42.71, 42.68, 41.86, 44.71, 44.14, 44.58, 41.07, 42.23, 44.55,41.12)> CHF <- c(41.5, 41.47, 42.84, 43.44, 43.69, 42.3, 42.05, 41.23, 42.76,43.79)> AUD <- c(109.55, 102.52, 114.91, 122.48, 122.12, 123.96, 100.36,110.19, 121.> 58, 103.46) > > These are the exchange rates and I am trying calculating the returns. Iam> giving only a small portion of actual data as I can't send this as an > attachment. I am using function as I want to generalize the code for anyportfolio.> > > # __________________________________________________ > > # My Code > > trans <- read.table('transactions.csv', header=TRUE, sep=",", > na.strings="NA", dec=".", strip.white=TRUE) > # reading as table. > > #currency <- read.table('currency.csv') > > #date <- currency$date > #USD = currency$USD > #GBP = currency$GBP > #EURO = currency$EURO > #CHF = currency$CHF > #AUD = currency$AUD > > # _________________________________________________________ > > # CREATION of Function. I am using function as no of transactions is notconstant.> > spot_trans = function(currency_trans) > > { > > if (currency_trans == "USD") > {rate = USD} > > # So if I am dealing with TRANSACTION "USD", I am selecting the USDexchange rates.> > if (currency_trans == "GBP") > {rate = GBP} > > if (currency_trans == "EURO") > {rate = EURO} > > if (currency_trans == "CHF") > {rate = CHF} > > if (currency_trans == "AUD") > {rate = AUD} > > # ________________________________________________ > > # CURRENCY Rate RETURNS i.e. lob(todays rate / yesterday rate) and thedata is> in descending "Date" order > > currency_rate_returns = NULL > for (i in 1:(length(rate)-1)) # if there are 10 elements, total no ofreturns = 9> > { > currency_rate_returns[i] = log(rate[i]/rate[i+1]) > } > > currency_rate_returns > > return(data.frame(returns = currency_rate_returns)) > > } > > # _______________________________________________ > > spot_returns_table <- lapply(1:nrow(trans), function(z) with(trans[z, ],> spot_trans(currency_trans=trans$currency_transacted))) > > spot_returns_table > > This generates the output as given below with 30 warnings. Also, asthere are> six transactions, 6 outputs are generated but the output in all pertainsonly> to the first transacations i.e. 6 times returns are generated for thefirst> transaction "EURO" > > > warnings() > Warning messages: > 1: In if (currency_trans == "USD") { ... : > the condition has length > 1 and only the first element will be used > 2: In if (currency_trans == "GBP") { ... : > the condition has length > 1 and only the first element will be used > 3: In if (currency_trans == "EURO") { ... : > the condition has length > 1 and only the first element will be used > > .... and so on > > The output is as given below. > > > spot_returns_table > [[1]] > spot_returns > 1 0.0007026584 > 2 0.0193997094 > 3 -0.0658664732 > 4 0.0128307894 > 5 -0.0099189271 > 6 0.0820074000 > 7 -0.0278529410 > 8 -0.0534812850 > 9 0.0801175328 > 10 -0.0710983059 > > [[2]] > spot_returns > 1 0.0007026584 > 2 0.0193997094 > 3 -0.0658664732 > 4 0.0128307894 > 5 -0.0099189271 > 6 0.0820074000 > 7 -0.0278529410 > 8 -0.0534812850 > 9 0.0801175328 > 10 -0.0710983059 > > [[3]] > spot_returns > 1 0.0007026584 > 2 0.0193997094 > 3 -0.0658664732 > 4 0.0128307894 > 5 -0.0099189271 > 6 0.0820074000 > .................... > .................... > > and so on. > > Kindly guide as if there is only one transaction i.e. I am dealing withonly> one currency, code runs excellently. > > Thanking in advance and once again apologize for the inconveniencecaused.> > Amelia Vettori > > > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html> and provide commented, minimal, self-contained, reproducible code.