0

我是 SQL 新手,我认为我并没有真正完全掌握它。

我第二个选择的项目,在日期之后,给了我 (∑r*mv)/(∑mv),这是投资组合的加权回报。接下来的两SUM列尝试根据我选择的值对回报进行加权。

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' 

无论如何,我是否 mv 在整个生命周期内手动更改设置值(例如 200000),以便我可以看到不同加权投资组合的表现如何。这应该是动态的和可重用的,所以如果我想一遍又一遍地在数据库中创建一个新列是不可行的。我的 SQL 尝试似乎都没有得到正确的答案。

本练习的目的是创建综合投资组合,以显示如果在投资组合的生命周期内对不同资产类别赋予不同的权重,投资组合的表现将如何。我希望这是有道理的。

例如,我将使用静态假设值(200000)代替mv(头寸的市场价值)来衡量投资组合中的资产

该表是Sum(mv*retmtd)/Sum(mv)正确的返回

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

这就是我希望其他查询检索的内容

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

有没有办法通过 SQL 做到这一点?

4

2 回答 2

0

我找到了这个问题的解决方案,可能对偶然发现这个问题的任何人都有用。

通过将其包装在另一个查询中并在包装查询中仅使用 case 语句,您可以修改数据,然后进行所需的数据计算......

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
于 2013-07-17T08:55:44.950 回答
0

enter code here有什么办法可以mv手动将值设置为200000 ...

是——键入200000而不是mv

您是否正在考虑参数?

IE:

        DECLARE @mv_ftse int
        DECLARE @mv_ust2 int
        DECLARE @mv_sp500 int
        SET @mv_ftse = 600000
        SET @mv_ust2 = 200000
        SET @mv_sp500 = 200000

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

    SUM(DISTINCT retmtd*
        CASE asset
        WHEN 'SP500' then @mv_sp500
        WHEN 'UST2' then @mv_ust2
        WHEN 'FTSE' then @mv_ftse
        END)/1000000,
...
于 2013-07-12T15:11:49.473 回答