Sample from aggregate portfolio distribution versus individual asset distributions

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
1
down vote

favorite












Suppose I have three assets $x_1,x_2,x_3$ in a portfolio with weights $W=beginbmatrix w_1 \ w_2 \ w_3 endbmatrix $, expected returns $R=beginbmatrix mu_1 \ mu_2 \ mu_3 endbmatrix$, and a covariance matrix $V$.



The expected return of my portfolio is $mu_p=W^TR$ and the variance of my portfolio is $sigma^2_p=W^TVW$.



I would like to run Monte Carlo simulations on my portfolio using a normal distribution.



I can do this either by:



  1. Sampling from the distribution of portfolio returns $N(mu_p,sigma^2_p)$.

  2. Sample from the three individual asset returns and use those three returns to compute my overall portfolio return.

First, how would I accomplish the second approach (would I be sampling from a multivariate normal distribution)?



Second, are these two approaches equivalent as long as I assume that the weights $W$ of my portfolio remain the same?










share|improve this question

























    up vote
    1
    down vote

    favorite












    Suppose I have three assets $x_1,x_2,x_3$ in a portfolio with weights $W=beginbmatrix w_1 \ w_2 \ w_3 endbmatrix $, expected returns $R=beginbmatrix mu_1 \ mu_2 \ mu_3 endbmatrix$, and a covariance matrix $V$.



    The expected return of my portfolio is $mu_p=W^TR$ and the variance of my portfolio is $sigma^2_p=W^TVW$.



    I would like to run Monte Carlo simulations on my portfolio using a normal distribution.



    I can do this either by:



    1. Sampling from the distribution of portfolio returns $N(mu_p,sigma^2_p)$.

    2. Sample from the three individual asset returns and use those three returns to compute my overall portfolio return.

    First, how would I accomplish the second approach (would I be sampling from a multivariate normal distribution)?



    Second, are these two approaches equivalent as long as I assume that the weights $W$ of my portfolio remain the same?










    share|improve this question























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      Suppose I have three assets $x_1,x_2,x_3$ in a portfolio with weights $W=beginbmatrix w_1 \ w_2 \ w_3 endbmatrix $, expected returns $R=beginbmatrix mu_1 \ mu_2 \ mu_3 endbmatrix$, and a covariance matrix $V$.



      The expected return of my portfolio is $mu_p=W^TR$ and the variance of my portfolio is $sigma^2_p=W^TVW$.



      I would like to run Monte Carlo simulations on my portfolio using a normal distribution.



      I can do this either by:



      1. Sampling from the distribution of portfolio returns $N(mu_p,sigma^2_p)$.

      2. Sample from the three individual asset returns and use those three returns to compute my overall portfolio return.

      First, how would I accomplish the second approach (would I be sampling from a multivariate normal distribution)?



      Second, are these two approaches equivalent as long as I assume that the weights $W$ of my portfolio remain the same?










      share|improve this question













      Suppose I have three assets $x_1,x_2,x_3$ in a portfolio with weights $W=beginbmatrix w_1 \ w_2 \ w_3 endbmatrix $, expected returns $R=beginbmatrix mu_1 \ mu_2 \ mu_3 endbmatrix$, and a covariance matrix $V$.



      The expected return of my portfolio is $mu_p=W^TR$ and the variance of my portfolio is $sigma^2_p=W^TVW$.



      I would like to run Monte Carlo simulations on my portfolio using a normal distribution.



      I can do this either by:



      1. Sampling from the distribution of portfolio returns $N(mu_p,sigma^2_p)$.

      2. Sample from the three individual asset returns and use those three returns to compute my overall portfolio return.

      First, how would I accomplish the second approach (would I be sampling from a multivariate normal distribution)?



      Second, are these two approaches equivalent as long as I assume that the weights $W$ of my portfolio remain the same?







      monte-carlo statistics modern-portfolio-theory






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 23 at 14:31









      cpage

      819




      819




















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          For the first case, you would directly sample $n$ random normals $x$ and compute:
          $$R^p_i = mu_p + sigma_p x_i, i in [1,n]$$



          For the second case, you can sample $n$ x $3$ independent normals, compute the Cholesky decomposition matrix $C$ of $V$, which is the matrix $C$ such that $V=C^t C$, and get $n$ samples of vectors $X$ of size 3.



          The return $R_i$ for random draw $i$ is given by:
          $$R_i = mu_p + C . X_i, i in [1,n]$$
          You can check for high values of $n$ the convergence towards the limit values:
          $$E(R_i) = R$$
          $$Cov(R_i) = V$$
          The portfolio return is then computed as:
          $$R^p_i = W.T R_i$$
          and you can check it converges towards the same mean and variance $mu_p$, $sigma_p^2$ for a large enough $n$.



          The two approaches are mathematically equivalent as a linear combination of independent normals is normally distributed. This works so long as the random normal variables generated are iid gaussian normals.



          With numpy, iid normals can be generated with np.random.normal. As pointed out below, np.random.multivariate_normal can be used to generate the multivariate gaussian vector.






          share|improve this answer


















          • 1




            How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
            – cpage
            Nov 23 at 16:16











          • good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
            – Sebapi
            Nov 24 at 9:52


















          up vote
          0
          down vote













          Basically what @sebapi said.
          "The two approaches are equivalent so long as the random normal variables generated are iid gaussian normals."



          Q: How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?



          A: You might use scipy.stats.multivariate_normal (rv = multivariate_normal(mean=None, cov=1, allow_singular=False))






          share|improve this answer




















            Your Answer





            StackExchange.ifUsing("editor", function ()
            return StackExchange.using("mathjaxEditing", function ()
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
            );
            );
            , "mathjax-editing");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "204"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            noCode: true, onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fquant.stackexchange.com%2fquestions%2f42750%2fsample-from-aggregate-portfolio-distribution-versus-individual-asset-distributio%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            2
            down vote



            accepted










            For the first case, you would directly sample $n$ random normals $x$ and compute:
            $$R^p_i = mu_p + sigma_p x_i, i in [1,n]$$



            For the second case, you can sample $n$ x $3$ independent normals, compute the Cholesky decomposition matrix $C$ of $V$, which is the matrix $C$ such that $V=C^t C$, and get $n$ samples of vectors $X$ of size 3.



            The return $R_i$ for random draw $i$ is given by:
            $$R_i = mu_p + C . X_i, i in [1,n]$$
            You can check for high values of $n$ the convergence towards the limit values:
            $$E(R_i) = R$$
            $$Cov(R_i) = V$$
            The portfolio return is then computed as:
            $$R^p_i = W.T R_i$$
            and you can check it converges towards the same mean and variance $mu_p$, $sigma_p^2$ for a large enough $n$.



            The two approaches are mathematically equivalent as a linear combination of independent normals is normally distributed. This works so long as the random normal variables generated are iid gaussian normals.



            With numpy, iid normals can be generated with np.random.normal. As pointed out below, np.random.multivariate_normal can be used to generate the multivariate gaussian vector.






            share|improve this answer


















            • 1




              How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
              – cpage
              Nov 23 at 16:16











            • good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
              – Sebapi
              Nov 24 at 9:52















            up vote
            2
            down vote



            accepted










            For the first case, you would directly sample $n$ random normals $x$ and compute:
            $$R^p_i = mu_p + sigma_p x_i, i in [1,n]$$



            For the second case, you can sample $n$ x $3$ independent normals, compute the Cholesky decomposition matrix $C$ of $V$, which is the matrix $C$ such that $V=C^t C$, and get $n$ samples of vectors $X$ of size 3.



            The return $R_i$ for random draw $i$ is given by:
            $$R_i = mu_p + C . X_i, i in [1,n]$$
            You can check for high values of $n$ the convergence towards the limit values:
            $$E(R_i) = R$$
            $$Cov(R_i) = V$$
            The portfolio return is then computed as:
            $$R^p_i = W.T R_i$$
            and you can check it converges towards the same mean and variance $mu_p$, $sigma_p^2$ for a large enough $n$.



            The two approaches are mathematically equivalent as a linear combination of independent normals is normally distributed. This works so long as the random normal variables generated are iid gaussian normals.



            With numpy, iid normals can be generated with np.random.normal. As pointed out below, np.random.multivariate_normal can be used to generate the multivariate gaussian vector.






            share|improve this answer


















            • 1




              How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
              – cpage
              Nov 23 at 16:16











            • good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
              – Sebapi
              Nov 24 at 9:52













            up vote
            2
            down vote



            accepted







            up vote
            2
            down vote



            accepted






            For the first case, you would directly sample $n$ random normals $x$ and compute:
            $$R^p_i = mu_p + sigma_p x_i, i in [1,n]$$



            For the second case, you can sample $n$ x $3$ independent normals, compute the Cholesky decomposition matrix $C$ of $V$, which is the matrix $C$ such that $V=C^t C$, and get $n$ samples of vectors $X$ of size 3.



            The return $R_i$ for random draw $i$ is given by:
            $$R_i = mu_p + C . X_i, i in [1,n]$$
            You can check for high values of $n$ the convergence towards the limit values:
            $$E(R_i) = R$$
            $$Cov(R_i) = V$$
            The portfolio return is then computed as:
            $$R^p_i = W.T R_i$$
            and you can check it converges towards the same mean and variance $mu_p$, $sigma_p^2$ for a large enough $n$.



            The two approaches are mathematically equivalent as a linear combination of independent normals is normally distributed. This works so long as the random normal variables generated are iid gaussian normals.



            With numpy, iid normals can be generated with np.random.normal. As pointed out below, np.random.multivariate_normal can be used to generate the multivariate gaussian vector.






            share|improve this answer














            For the first case, you would directly sample $n$ random normals $x$ and compute:
            $$R^p_i = mu_p + sigma_p x_i, i in [1,n]$$



            For the second case, you can sample $n$ x $3$ independent normals, compute the Cholesky decomposition matrix $C$ of $V$, which is the matrix $C$ such that $V=C^t C$, and get $n$ samples of vectors $X$ of size 3.



            The return $R_i$ for random draw $i$ is given by:
            $$R_i = mu_p + C . X_i, i in [1,n]$$
            You can check for high values of $n$ the convergence towards the limit values:
            $$E(R_i) = R$$
            $$Cov(R_i) = V$$
            The portfolio return is then computed as:
            $$R^p_i = W.T R_i$$
            and you can check it converges towards the same mean and variance $mu_p$, $sigma_p^2$ for a large enough $n$.



            The two approaches are mathematically equivalent as a linear combination of independent normals is normally distributed. This works so long as the random normal variables generated are iid gaussian normals.



            With numpy, iid normals can be generated with np.random.normal. As pointed out below, np.random.multivariate_normal can be used to generate the multivariate gaussian vector.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 24 at 9:46

























            answered Nov 23 at 15:09









            Sebapi

            462




            462







            • 1




              How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
              – cpage
              Nov 23 at 16:16











            • good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
              – Sebapi
              Nov 24 at 9:52













            • 1




              How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
              – cpage
              Nov 23 at 16:16











            • good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
              – Sebapi
              Nov 24 at 9:52








            1




            1




            How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
            – cpage
            Nov 23 at 16:16





            How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?
            – cpage
            Nov 23 at 16:16













            good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
            – Sebapi
            Nov 24 at 9:52





            good question from @cpage on a 5x5 historical covariance matrix, I get 0.27s for 1e6 samples from np.random.multivariate_normal and 5.3s using np.random.normal with a loop in python. The samples have similar statistics but different values.
            – Sebapi
            Nov 24 at 9:52











            up vote
            0
            down vote













            Basically what @sebapi said.
            "The two approaches are equivalent so long as the random normal variables generated are iid gaussian normals."



            Q: How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?



            A: You might use scipy.stats.multivariate_normal (rv = multivariate_normal(mean=None, cov=1, allow_singular=False))






            share|improve this answer
























              up vote
              0
              down vote













              Basically what @sebapi said.
              "The two approaches are equivalent so long as the random normal variables generated are iid gaussian normals."



              Q: How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?



              A: You might use scipy.stats.multivariate_normal (rv = multivariate_normal(mean=None, cov=1, allow_singular=False))






              share|improve this answer






















                up vote
                0
                down vote










                up vote
                0
                down vote









                Basically what @sebapi said.
                "The two approaches are equivalent so long as the random normal variables generated are iid gaussian normals."



                Q: How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?



                A: You might use scipy.stats.multivariate_normal (rv = multivariate_normal(mean=None, cov=1, allow_singular=False))






                share|improve this answer












                Basically what @sebapi said.
                "The two approaches are equivalent so long as the random normal variables generated are iid gaussian normals."



                Q: How does this compare to using docs.scipy.org/doc/numpy-1.15.1/reference/generated/…?



                A: You might use scipy.stats.multivariate_normal (rv = multivariate_normal(mean=None, cov=1, allow_singular=False))







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 23 at 18:32









                TomDecimus

                514




                514



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Quantitative Finance Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fquant.stackexchange.com%2fquestions%2f42750%2fsample-from-aggregate-portfolio-distribution-versus-individual-asset-distributio%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown






                    Popular posts from this blog

                    How to check contact read email or not when send email to Individual?

                    Displaying single band from multi-band raster using QGIS

                    How many registers does an x86_64 CPU actually have?