Forum Discussion

mjfigg's avatar
mjfigg
Frequent Visitor
9 years ago
Solved

Rolling XIRR Calculation

Hello there,   I am trying to build a rolling IRR calculation for an investment return report. No mater what I try, I cannot seem to get PBI to return a value for my formula. Can anyone help.   R...
  • mjfigg's avatar
    mjfigg
    9 years ago

    Hi v-ljerr-msft,

     

    Thank you very much for your help! 

     

    The formula works great, although I have made a few tweaks to include:

     - a terminal value (from the [equity repayment/(investment) on sale] column) to be calculated at the end of each period and calculated in the XIRR calc (i.e. if I sold the investment now, what would my XIRR be), and

     - a check to ensure that there is at least one positive cashflow (another requirement of the XIRR formula along with the first periof being negative).

     

    see my code as follows fyi.... 

    ROLLING XIRR = 
    VAR countpos =
        CALCULATE(
            COUNT('INVESTMENT RETURNS'[totalcashflow]),
                FILTER(ALL('INVESTMENT RETURNS'), 'INVESTMENT RETURNS'[totalcashflow]>0 && EARLIER ('INVESTMENT RETURNS'[Index] ) >= 'INVESTMENT RETURNS'[Index] && 'INVESTMENT RETURNS'[Name] = EARLIER ( 'INVESTMENT RETURNS'[Name] )
                  )
               )
    
    VAR minIndex =
        CALCULATE (
            MIN ( 'INVESTMENT RETURNS'[Index] ),
            FILTER (
                ALL ( 'INVESTMENT RETURNS' ),
                'INVESTMENT RETURNS'[Name] = EARLIER ( 'INVESTMENT RETURNS'[Name] )
            )
        )
    VAR firstValue =
        CALCULATE (
            MIN ( 'INVESTMENT RETURNS'[FREE CASHFLOW FOR PERIOD (excl. sale)] ),
            FILTER (
                ALL ( 'INVESTMENT RETURNS' ),
                'INVESTMENT RETURNS'[Name] = EARLIER ( 'INVESTMENT RETURNS'[Name] )
                    && 'INVESTMENT RETURNS'[Index] = minIndex
            )
        )
    RETURN
        IF (
            'INVESTMENT RETURNS'[Index] > minIndex
                && firstValue < 0
                && countpos >= 1 ,
                XIRR (
                    UNION( 
                        SUMMARIZE( 
                            FILTER(ALL ( 'INVESTMENT RETURNS' ), EARLIER ('INVESTMENT RETURNS'[Index] ) >= 'INVESTMENT RETURNS'[Index] && 'INVESTMENT RETURNS'[Name] = EARLIER ( 'INVESTMENT RETURNS'[Name] ))
                            ,'INVESTMENT RETURNS'[Index],
                            "DATE1",MAX('INVESTMENT RETURNS'[DATE]),
                            "CASHFLOW",MAX('INVESTMENT RETURNS'[FREE CASHFLOW FOR PERIOD (excl. sale)])
                                ),
                        SUMMARIZE(
                            FILTER(ALL ( 'INVESTMENT RETURNS' ), EARLIER ('INVESTMENT RETURNS'[Index] ) = 'INVESTMENT RETURNS'[Index] ),
                            'INVESTMENT RETURNS'[Index],
                            "DATE1",MAX('INVESTMENT RETURNS'[DATE]),
                            "CASHFLOW",MAX('INVESTMENT RETURNS'[EQUITY REPAYMENT/(INVESTMENT) ON SALE])
                                )
                    ),
                    [CASHFLOW],
                    [DATE1]
                )
        )

    Thanks again for all your help. Much appreciated.

     

    MJ