On 09/30/2009 09:51 AM, Abhijit Bera wrote:
Hi Romain

I got what ur saying. Good idea. First I convert the data into a
timeseries and return object using C, then I pass it onto an R function
which I have written, I call the R function from my C code, it evaluates
and then I process the values returned by it in my C code. Much simpler
that way. So, I can do away with all these confusing constructs. :)

What about performance? You think I will see a difference if I follow a
C only approach of creating all the objects?

Essentially you are not using a C only approach, even in your original example, since you call functions from fPortfolio (btw, R has to look down the search path each time to find the function, so you can make this more efficient, ...)

It might even be faster like this since you only need to parse the R functions once, so you pay the (not so expensive btw) price of parsing once.

Combine this with an approach that caches the references to the functions, so you only pay the price of searching through R search path once, and you're set.

Anyway, chances are the code from fPorfolio you call will be what costs the most, after all that is what is actually working here. Before converting your R script to C, did you do some profiling to identify what takes the most time ?

Romain

Regards

Abhijit

On Wed, Sep 30, 2009 at 12:45 PM, Abhijit Bera <abhib...@gmail.com
<mailto:abhib...@gmail.com>> wrote:

    Hi

    I'm pulling financial datasets from a DB, converting it to a
    timeseries object then creating a returns object out of it.

    I plan to embed R into an application, which is why I'm taking this
    route of using C.

    Regards

    Abhijit


    On Wed, Sep 30, 2009 at 12:07 PM, Romain Francois
    <romain.franc...@dbmail.com <mailto:romain.franc...@dbmail.com>> wrote:

        On 09/30/2009 08:51 AM, Abhijit Bera wrote:


            Hi

            Thanks all of you for your suggestions. I will put up my
            code shortly based
            on your suggestions.

            I wonder how the parsing and eval will work when most of my
            data comes in
            from an external source like a DB?  Probably it would be
            more efficient to
            make an object? Hmmmm... maybe it has to be a mix of parsing
            and eval?


        What's in the database ? Is this the data or the R code ? What's
        wrong with writing your own set of R functions and evaluate
        calls to these functions instead of basically replicate this in
        C or C++ or whatever.

        Dirk's code certainly is nicer, but would you really do it like
        that in real life ?

        Romain


            Yes, the lang4 c idea sucks. mkstring is better.

            Regards

            Abhijit


            On Tue, Sep 29, 2009 at 11:55 PM, Dirk
            Eddelbuettel<e...@debian.org <mailto:e...@debian.org>>  wrote:


                This is so much fun.  The C code posted wasn't exactly
                legible.  So here is
                a
                new C++ variant that I just committed to the RInside SVN
                as a new example.
                And it mine works (against RInide and Rcpp as on CRAN):

                e...@ron:~/svn/rinside/pkg/inst/examples>  ./rinside_sample4
                Package 'sn', 0.4-12 (2009-03-21). Type 'help(SN)' for
                summary information
                Using the GLPK callable library version 4.37

                Title:
                  MV Feasible Portfolio
                  Estimator:         covEstimator
                  Solver:            solveRquadprog
                  Optimize:          minRisk
                  Constraints:       LongOnly

                Portfolio Weights:
                SBI SPI SII LMI MPI ALT
                0.1 0.1 0.1 0.1 0.3 0.3

                Covariance Risk Budgets:
                    SBI     SPI     SII     LMI     MPI     ALT
                -0.0038  0.1423  0.0125 -0.0058  0.4862  0.3686

                Target Return and Risks:
                  mean     mu    Cov  Sigma   CVaR    VaR
                0.0548 0.0548 0.4371 0.4371 1.0751 0.6609

                Description:
                  Tue Sep 29 13:43:36 2009 by user:
                             SBI        -0.00380065
                             SPI           0.142261
                             SII          0.0125242
                             LMI        -0.00576251
                             MPI           0.486228
                             ALT           0.368551
                e...@ron:~/svn/rinside/pkg/inst/examples>

                The final few lines are C++ accessing the result,
                earlier in the code I
                assign the weight vector from C++ as you desired from C.
                  All with error
                checking / exception handling and what have in under 60
                lines of (IMHO more
                readable) code -- see below.

                Dirk

                // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4;
                  tab-width: 8; -*-
                //
                // Another simple example inspired by an r-devel mail by
                Abhijit Bera
                //
                // Copyright (C) 2009 Dirk Eddelbuettel and GPL'ed

                #include "RInside.h"                    // for the
                embedded R via RInside
                #include "Rcpp.h"                       // for the R /
                Cpp interface used
                for transfer
                #include<iomanip>

                int main(int argc, char *argv[]) {

                    try {
                        RInside R(argc, argv);          // create an
                embedded R instance
                        SEXP ans;

                        std::string txt =
                "suppressMessages(library(fPortfolio))";
                        if (R.parseEvalQ(txt))          // load library,
                no return value
                            throw std::runtime_error("R cannot evaluate
                '" + txt + "'");

                        txt = "lppData<- 100 * LPP2005.RET[, 1:6]; "
                "ewSpec<- portfolioSpec(); "
                "nAssets<- ncol(lppData); ";
                        if (R.parseEval(txt, ans))      // prepare problem
                            throw std::runtime_error("R cannot evaluate
                '" + txt + "'");

                        const double dvec[6] = { 0.1, 0.1, 0.1, 0.1,
                0.3, 0.3 }; // choose
                any weights you want
                        const std::vector<double>  w(dvec,&dvec[6]);

                        R.assign( w, "weightsvec");     // assign STL
                vector to R's
                'weightsvec' variable

                        txt = "setWeights(ewSpec)<- weightsvec";
                        if (R.parseEvalQ(txt))          // evaluate
                assignment
                            throw std::runtime_error("R cannot evaluate
                '" + txt + "'");

                        txt = "ewPortfolio<- feasiblePortfolio(data =
                lppData, spec =
                ewSpec, constraints = \"LongOnly\"); "
                "print(ewPortfolio); "
                "vec<- getCovRiskBudgets(ewportfo...@portfolio)";
                        if (R.parseEval(txt, ans))      // assign
                covRiskBudget weights to
                ans
                            throw std::runtime_error("R cannot evaluate
                '" + txt + "'");
                        RcppVector<double>  V(ans);      // convert SEXP
                variable to an
                RcppMatrix

                        R.parseEval("names(vec)", ans); // assign
                columns names to ans
                        RcppStringVector names(ans);

                        for (int i=0; i<names.size(); i++) {
                          std::cout<<  std::setw(16)<<  names(i)<< "\t"
                <<  std::setw(11)<<  V(i)<< "\n";
                        }

                    } catch(std::exception&  ex) {
                        std::cerr<< "Exception caught: "<<  ex.what()<<
                  std::endl;
                    } catch(...) {
                        std::cerr<< "Unknown exception caught"<<  std::endl;
                    }

                    exit(0);
                }

--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/ztCu : RGG #158:161: examples of package IDPmisc
|- http://tr.im/yw8E : New R package : sos
`- http://tr.im/y8y0 : search the graph gallery from R

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to