2017

Archive for 2017

Google Spreadsheets and ArrayFormula for XIRR Calculation

I was looking for a simple way to calculate performance of my investments over time. Popular portfolio trackers like Moneycontrol and Value Research did not meet my needs. So I decided to try out Google Spreadsheets.
Nice thing with Google Spreadsheets is its support for import and queries.
e.g. AMFI India publishes daily NAV’s on their website http://portal.amfiindia.com/spages/NAV1.txt
You can import the data programmatically and run a query on it to find desired NAV.
I can use following simple query to check the latest NAV of Birla Sunlife Frontline Equity fund, whose symbol is INF209K01YY7
=QUERY(SPLIT(QUERY(importDATA("http://portal.amfiindia.com/spages/NAV1.txt"),"SELECT * Where Col1 like '%INF209K01YY7%'"),";"), "Select Col5") 
Google Spreadsheets obviously supports data from Google Finance with its built in function GOOGLEFINANCE
e.g.
=GOOGLEFINANCE("SBIN","price")
will return latest price for State Bank of India.
You can also use Stock Exchange assigned ID’s to query the data from Google Finance
e.g.
=GOOGLEFINANCE("500510","price")
will return latest price for Larsen and Tubro.
However the most killer feature of Google Spreadsheets is its support for ArrayFormula in conjunction with XIRR.
Let me explain.
Consider following cash flow.

Cash Flow

A B C D
1 Transaction Symbol Date
2 Sell Havells 31/12/2017
3 Buy Havells 01/01/2017
4 Buy Havells 06/01/2017
We have to update the XIRR formula to include the new transaction we just added in our cash flow
=XIRR(D2:D4,C2:C4)*100

Investment Performance

Symbol XIRR
Havells 4.493
This is very cumbersome to update XIRR formula, if you have a diversified portfolio with 10+ symbols and investing on a regular basis.

Cash Flow

A B C D
1 Transaction Symbol Date
2 Sell Havells 31/12/2017
3 Buy Havells 01/01/2017
4 Buy Havells 06/01/2017
5 Sell SBI 31/12/2017
6 Buy SBI 01/01/2017
7 Buy SBI 06/01/2017
Havells =XIRR(D2:D4,C2:C4)*100
SBI =XIRR(D5:D7,C5:C7)*100

Investment Performance

Symbol XIRR
Havells 4.493
SBI 4.493
You can see for two symbols we have to keep close track of cell numbers etc to accurately calculate XIRR.
ArrayFormula provides nice workaround to simplify and automate this process of using XIRR formulas for a growing number of transactions
https://support.google.com/docs/answer/3093275?hl=en
Enables the display of values returned from an array formula into multiple rows and/or columns and the use of non-array functions with arrays.
XIRR can be easily combined with ArrayFormula like below
=ArrayFormula(XIRR((B2:B7="HAVELLS")*D2:D7,C2:C7))*100
=ArrayFormula(XIRR((B2:B7="SBI")*D2:D7,C2:C7))*100
As you can see that except the symbol name both the formulas are identical. We can remove the hard coded symbol name and refer to the cell which has symbol name.
Using ArrayFormula in the portfolio tracker has simplified maintenance of the spreadsheet and saved quite a few hours for me.


Automated Testing of webMethods Services with REST Assured

While testing REST APIs for one of my projects, I found REST Assured. It was perfect, as it took care of low level HTTP calls under the hood, and provided a high-level, easy to use framework to write tests. Not only REST Assured works really well to test webMethods flow services, you can also run these tests as part of Continuous Integration process through Gradle.

You will need following things on your machine. Make sure these are working without any issues.
  1. Java JDK 1.8 (link).  Set JAVA_HOME. And add JAVA_HOME to your PATH
  2. IntelliJ IDEA (link)
 We will write automated tests for a simple flow service that adds two numbers.



Follow following steps to create automated tests.
  1. Open IntelliJ IDEA and create a new project


  2. Add following lines in your build.gradle file
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
        testCompile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
        testCompile 'io.rest-assured:rest-assured:3.0.3'
    
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.0' //version required
    } 

  3. Create new package for our test cases

  4. Create new Java class for our tests.

    package com.dhimate.wm;
    
    import org.junit.Before;
    import org.junit.Test;
    import io.restassured.RestAssured;
    import io.restassured.response.Response;
    import java.util.HashMap;
    import static io.restassured.RestAssured.given;
    import static io.restassured.RestAssured.basic;
    import static org.hamcrest.MatcherAssert.assertThat;
    import static org.hamcrest.Matchers.equalTo;
    
    public class AddNumbersTest {
    
        @Before
        public void setUp() throws Exception {
            RestAssured.baseURI = "http://localhost:5555/invoke";
            RestAssured.authentication = basic("Administrator", "manage");
        }
    
        @Test
        public void AddNumbersTestSuccess()
        {
            String requestBody = "{" +
                        "\"num1\":\"10\"," +
                        "\"num2\":\"20\"" +
                        "}";
    
            Response response = given().
                    header("Content-Type","application/json").
                    body(requestBody).
                    put("Yogesh.flow/addNumbers");
    
            response.getBody().prettyPrint();
    
            HashMap responseBody = response.jsonPath().get("");
    
            assertThat("status code", response.getStatusCode(), equalTo(200));
            assertThat("sum", responseBody.get("sum"), equalTo("30"));
        }
    }

    Here we are just taking advantage of Integration Server's built in content handler for Content Type - 'application/json'. For the flow service available on Integration Server, we can simply pass JSON request using REST Assured framework. Integration Server will take care of converting this to IDoc and subsequently process it to return a JSON response back to your test case.

  5. Run the tests using Gradle wrapper
    Gradle wrapper provides a convenient and easy to use CLI to run your tests. Using Gradle wrapper you can quickly associate your REST Assured tests with your Continuous Integration process.

     
Good thing about using REST Assured and Hamcrest to test your webMethods flow services is, it is completely FREE.  You don't need to buy an expensive automated testing solution to test your flow services.

Further resources to read
  1. REST Assured has comprehensive documentation available to get you started.
  2. Excellent tutorial on Gradle and Hamcrest by Vogella.