Search code examples
sqlsql-serverfinanceportfolio

Temporarily replacing values in SQL or subbing in values via SQL


I'm new to SQL and dont think I truly grasp it fully.

My second selected item,after date, gives me (∑r*mv)/(∑mv) which is the weighted returns of the portfolio. The next two SUM columns are attempt to weight the returns based on my selected values.

SELECT 
date, 
Sum(mv*retmtd)/Sum(mv),

SUM(DISTINCT retmtd*
        CASE asset
        WHEN 'SP500' then 200000
        WHEN 'UST2' then 200000
        WHEN 'FTSE' then 600000
        END)/1000000,

SUM( retmtd*
        CASE 
        WHEN asset ='SP500' AND mv IS NOT NULL then 200000
        WHEN asset ='UST2' AND mv IS NOT NULL then 200000
        WHEN asset ='FTSE' AND mv IS NOT NULL then 600000
        END)/
      SUM(  CASE 
        WHEN asset ='SP500' AND mv IS NOT NULL then 200000
        WHEN asset ='UST2' AND mv IS NOT NULL then 200000
        WHEN asset ='FTSE' AND mv IS NOT NULL then 600000
        END) 

FROM [dbo].[AssetRet]

WHERE
asset IN ('SP500','UST2','FTSE')
AND
date >=  '12/31/2000' 

Is there anyway that I change set the value of mv manually (to say 200000) over the lifetime so I can see how different weighted portfolios would have performed. This is supposed to be dynamic and reusable so going creating a new column in the database is unfeasible if I want to do this over and over. None of my SQL attempts seems to get the correct answer.

The purpose of this exercise is to create synthetic portfolios that would show how a portfolio would have performed if different weights had been given to different asset classes during their life in the portfolio. I hope this makes sense.

e.g instead of mv (market value of the position) being used to weigh that asset in the portfolio I would use a static hypothesized value (200000)

This table is what Sum(mv*retmtd)/Sum(mv) returns which is correct

Date      SP500     UST2     FTSE     MV     MV     MV       RESULT
3/31/10   0.34                        19878                  0.34
6/30/10   -0.11     0.12              19954  840712          0.116
6/30/13   -0.48     -1.30    -0.76    9914   934892 384193   -1.135

And this what I want the other querys to retrieve

Date      SP500     UST2     FTSE     MV     MV     MV       RESULT
3/31/10   0.34                        200000                 0.34
6/30/10   -0.11     0.12              200000 200000          0.006
6/30/13   -0.48     -1.30    -0.76    200000 200000 600000   -0.809

Is there a way to do this via SQL?


Solution

  • I found a solution to this problem that may be of use to anyone that stumbles across this question.

    By wrapping it in another query and using just a case statement in the wrapped query you can modify the data and then do the required data calculations...

    SELECT 
    x.date, 
    Sum(x.hyp_mv* x.retmtd)/Sum(x.hyp_mv) as weightedreturns
    
    FROM
    
        (
        SELECT 
        date,
        asset,
        retmtd,
    
        (CASE asset
         WHEN 'SP500' then 200000
         WHEN 'UST2' then 200000
         WHEN 'FTSE' then 600000
         END) as hyp_mv
    
        FROM [dbo].[AssetRet]
    
        WHERE
        asset IN ('SP500','UST2','FTSE')
        AND
        date >=  '12/31/2000' 
        )x
    
    GROUP BY
    x.date
    
    ORDER BY
    x.date