Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Difficulty interpreting Skewness and Kurtosis Results

    I am looking for guidance on interpreting my results from running a rsktest. Below are my results when I test, for context I am testing portfolio returns across different industries.

    This is my interpretation of the results and I was hoping someone could correct me if I am wrong.

    Null hypothesis: The returns are normally distributed.
    • If both Pr(Skewness) and Pr(Kurtosis) are > .05 we fail to reject the null hypothesis.
    • If both Pr(Skewness) and Pr(Kurtosis) are < .05 we reject the null hypothesis.
    • If Pr(Skewness) is < .05 and Pr(Kurtosis) > .05 then we reject on the basis of skewness and fail to reject on the basis of kurtosis.
    • If Pr(Skewness) is > .05 and Pr(Kurtosis) < .05 then we fail to reject on the basis of skewness and reject on the basis of kurtosis.
    I am unsure on those last two points but I think the first two are correct.

    In the explanation in the Stata.com manual they mention a 12% level, where is the 12% coming from? The Prob > chi2 ? https://www.stata.com/manuals13/rsktest.pdf

    An example from the image, For Agric we can reject the null hypothesis that it is normally distrbuted as Pr(Skewness) is < .05 and likewise for Pr(Kurtosis). For Food we fail to reject the null hypothesis on the basis of skewness but we could on the basis of kurtosis?

    Click image for larger version

Name:	Screenshot 2020-10-12 130753.png
Views:	2
Size:	238.9 KB
ID:	1576694

    Any input greatly appreciated.
    Tom.

  • #2
    This post raises for me questions on several levels.

    My interpretation is that use of the test hinges on what you care about.

    What precisely is the purpose of testing normality? What you would do differently depending on the test result? Would your purposes be better served by looking at the magnitudes of skewness and kurtosis? Or a portfolio of normal quantile plots?

    What's the sample size? Sometimes a significant result may just mean that the sample size is large enough to detect it, but it's not important, while an insignificant result conversely could be important but that's uncertain because the sample size is so small.

    Why this test? It's essentially idiosyncratic and although the details are well documented in the Stata manual, I wouldn't fancy trying to explain it to anyone who didn't know Stata (although the manual entry is accessible to everyone).

    If I had to apply a test I would apply a Doornik-Hansen. test.

    More to come on a command to report skewness and kurtosis graphically.

    Comment


    • #3
      Originally posted by Nick Cox View Post
      This post raises for me questions on several levels.

      My interpretation is that use of the test hinges on what you care about.

      What precisely is the purpose of testing normality? What you would do differently depending on the test result? Would your purposes be better served by looking at the magnitudes of skewness and kurtosis? Or a portfolio of normal quantile plots?

      What's the sample size? Sometimes a significant result may just mean that the sample size is large enough to detect it, but it's not important, while an insignificant result conversely could be important but that's uncertain because the sample size is so small.

      Why this test? It's essentially idiosyncratic and although the details are well documented in the Stata manual, I wouldn't fancy trying to explain it to anyone who didn't know Stata (although the manual entry is accessible to everyone).

      If I had to apply a test I would apply a Doornik-Hansen. test.

      More to come on a command to report skewness and kurtosis graphically.
      Thanks for the reply.

      1. The purpose of testing for normality is to show that the returns are not normally distributed, this is theoretically true for all portfolio/stock returns. I am considering looking at the magnitudes of skewness and kurtosis, however, I feel there may be some interesting points to infer from these tests. Not shown in that image (Will attach below) but Gold which I fail to reject on both Skewness and Kurtosis has a very high P value for both tests this is interesting and may be because gold is considered a stable asset and has low volatility, so in good times it won't rise as much as others and in bad times won't fall as much either and so its returns seem more normally distributed. Unfortunately, I do not know what a portfolio of normal quantile plots is and don't recall it being mentioned in my course so I would presume I can disregard it but I'll look it up out of curiosity as it may be relevant.

      2. The sample size is 192 months of data.

      3. I searched for ways to test/check the skewness and kurtosis and it was the first one that came up and as it tested it relative to the normal distribution it seemed perfect for what I needed it for as the main element of this part of the project is to show that returns are not normally distributed. I was using hist <variable_name>, normal and kdensity <variable_name> but I thought it were a bit crude to simply state that visually it doesn't look like the normal distribution.

      4. I'll look up the Doornik-Hansen test and see what it says and see is it relevant.

      Thanks for the reply!

      Click image for larger version

Name:	Goldstats.png
Views:	1
Size:	116.0 KB
ID:	1576740

      Comment


      • #4
        Unfortunately, I do not know what a portfolio of normal quantile plots is and don't recall it being mentioned in my course so I would presume I can disregard it but I'll look it up out of curiosity as it may be relevant.
        Thank you for being willing to disregard my suggestion. Portfolio here is just a fancy word for looking at a set of individual normal quantile plots That is made easier by multqplot from the Stata Journal:

        Code:
        . search multqplot, sj
        
        Search of official help files, FAQs, Examples, and Stata Journals
        
        SJ-19-3 gr0053_1  . . . . . . . . . . . . . . .  Software update for multqplot
                (help multqplot if installed) . . . . . . . . . . . . . . .  N. J. Cox
                Q3/19   SJ 19(3):748--751
                help file for multqplot to draw multiple quantile plots has
                been expanded
        
        SJ-12-3 gr0053  . Speaking Stata: Axis practice, or what goes where on a graph
                (help multqplot if installed) . . . . . . . . . . . . . . .  N. J. Cox
                Q3/12   SJ 12(3):549--561
                discusses variations on what goes on each axis of a two-way
                plot; provides multiple quantile plots
        Your variables have a family resemblance, which isn't true of this example:

        Code:
        sysuse auto, clear
        multqplot price-foreign, trscale(invnormal(@)) yla(#5) xla(-2/2)
        25 variables at once might work just about. This example shows 11.
        Click image for larger version

Name:	multqplot.png
Views:	1
Size:	77.0 KB
ID:	1576768


        The sample size is 192 months of data.
        As I should have pointed out earlier, all these tests (?any exceptions) are based on the idea that values are independent. I doubt you'll get good P-values without considering the data generation process.

        I wrote a quick script to produce a report on skewness and kurtosis. Here's the code

        Code:
        *! 1.0.0 NJC 12 Oct 2020
        * report on skewness and kurtosis
        program skreport, sort
            version 8.2
            syntax varlist(numeric) [if] [in] [, LISTopts(str asis) * ]
            
            quietly {
                marksample touse
                count if `touse'
                if r(N) == 0 exit 2000
                if r(N) == 1 exit 2001
        
                tempvar skewness kurtosis which
                gen `skewness' = .
                gen `kurtosis' = .
                gen `which' = ""
        
                local nv : word count `varlist'
                if `nv' > _N {
                    preserve
                    set obs `nv'
                }
        
                local i = 0
        
                foreach v of local varlist {
                    local ++i
                
                    su `v' if `touse', detail
                    replace `skewness' = r(skewness) in `i'
                    replace `kurtosis' = r(kurtosis) in `i'
                
                    local show : var label `v'
                    if `"`show'"' == "" local show "`v'"
                    replace `which' = `'"`show'"' in `i'
                }
            }
        
            sort `skewness' `kurtois'
            format `skewness' `kurtosis' %4.3f
        
            char `which'[varname] " "
            char `skewness'[varname] "skewness"
            char `kurtosis'[varname] "kurtosis"
            list `which' `skewness' `kurtosis' if `which' != "", ///
            noobs subvarname `listopts'
        
            quietly count if `skewness' <  . | `kurtosis' < .
            if r(N) == 0 exit 0
        
            graph dot (asis) `skewness' `kurtosis' ,                 ///
            linetype(line) lines(lc(gs12) lw(vthin))                 ///
            over(`which', sort(1))                                  ///
            marker(1, ms(Oh) mc(orange))                             ///
            marker(2, ms(Sh) mc(blue))                               ///
            yli(3, lc(blue) lw(thin)) ysc(alt)                       ///
            legend(order(1 "skewness" 2 "kurtosis") pos(12))         ///
            ymla(0 " ", labsize(medium) grid glc(orange) glw(thin)) ///
            `options'
        end
        Here are some sample results:

        Code:
        sysuse auto, clear
        . skreport price-foreign, list(sep(0))
        
          +----------------------------------------------+
          |                          skewness   kurtosis |
          |----------------------------------------------|
          |           Length (in.)     -0.076      2.000 |
          |     Repair Record 1978     -0.057      2.678 |
          |  Trunk space (cu. ft.)     -0.044      2.159 |
          |     Turn Circle (ft.)       0.071      2.228 |
          |          Weight (lbs.)      0.118      2.073 |
          |         Headroom (in.)      0.197      2.144 |
          |             Gear Ratio      0.279      2.109 |
          | Displacement (cu. in.)      0.581      2.354 |
          |               Car type      0.850      1.723 |
          |          Mileage (mpg)      0.995      3.997 |
          |                  Price      1.688      5.032 |
          +----------------------------------------------+
        Although a plot of kurtosis versus skewness is often a good idea, it needs marker labels to make sense, and that gets messy. This alternative exploits the facts that skewness and kurtosis have no units and often differ by about 3: Variables are automatically sorted -- as in the table above -- by skewness and then kurtosis. See also moments from SSC.
        Click image for larger version

Name:	skreport.png
Views:	1
Size:	34.7 KB
ID:	1576769

        Last edited by Nick Cox; 12 Oct 2020, 13:52.

        Comment


        • #5
          A variation on #4 is to use measures based on L-moments for which see (e.g) https://en.wikipedia.org/wiki/L-moment and lmoments from SSC.


          Click image for larger version

Name:	lmoments.png
Views:	1
Size:	36.7 KB
ID:	1576793


          Note that a Gaussian (normal) has a L-kurtosis value of about 0.1226.

          Comment

          Working...
          X