[关闭]
@Channelchan 2017-03-08T19:44:52.000000Z 字数 2784 阅读 26172

StatsModels 偏峰与峰态

未分类


偏峰(Skewness)

一个对称的分布偏峰(skewness)的值为 0.
正倾斜偏峰分布意味 mean > median > mode。
负倾斜偏峰分布意味 mean < median < mode.

  1. import tushare as ts
  2. import pandas as pd
  3. import scipy.stats as stats
  4. import matplotlib.pyplot as plt
  5. import numpy as np

s是指shape=sigma, loc是mu。
lognorm.pdf(x, s, loc, scale)

  1. # Generate xvalues for which we will plot the distribution
  2. #Percent point function (inverse of cdf - percentiles)
  3. x = np.linspace(stats.lognorm.ppf(0.01, .7, loc=-.1), stats.lognorm.ppf(0.99, .7, loc=-.1), 150)
  4. # Negatively skewed distribution
  5. lognormal = stats.lognorm.pdf(x, .7)
  6. plt.plot(x, lognormal, label='Skew < 0')
  7. # Positively skewed distribution
  8. plt.plot(x, lognormal[::-1], label='Skew > 0')
  9. plt.legend()
  10. plt.show()

1


读取000001股票的skewnes值

  1. data = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D',autype='qfq')
  2. data.index = pd.to_datetime(data['date'],format='%Y-%m-%d')
  3. data['returns'] = data['close'].pct_change()[1:]
  4. returns = data['returns'].dropna()
  5. print 'Skew:', stats.skew(returns)
  6. print 'Mean:', np.mean(returns)
  7. print 'Median:', np.median(returns)
  8. plt.hist(returns, 30)
  9. plt.show()

2

Skew: -0.589166660049
Mean: -1.11957279761e-05
Median: 0.000939739222366


Kurtosis

  1. xs = np.linspace(-6,6,300)
  2. normal = stats.norm.pdf(xs)
  3. # Plot some example distributions
  4. plt.plot(xs, stats.laplace.pdf(xs), label='Leptokurtic')
  5. print 'Excess kurtosis of leptokurtic distribution:', (stats.laplace.stats(moments='k'))
  6. plt.plot(xs, normal, label='Mesokurtic (normal)')
  7. print 'Excess kurtosis of mesokurtic distribution:', (stats.norm.stats(moments='k'))
  8. plt.plot(xs,stats.cosine.pdf(xs), label='Platykurtic')
  9. print 'Excess kurtosis of platykurtic distribution:', (stats.cosine.stats(moments='k'))
  10. plt.legend()
  11. plt.show()

3

Excess kurtosis of leptokurtic distribution: 3.0
Excess kurtosis of mesokurtic distribution: 0.0
Excess kurtosis of platykurtic distribution: -0.593762875598


获取000001股票的超值峰度

  1. print "Excess kurtosis of returns: ", stats.kurtosis(returns)

Excess kurtosis of returns: 3.95204544689
'''大于三属于尖顶峰度'''


用JarqueBera检验是否正态分布

return (JB, JBpv, skew, kurtosis)

  1. data = ts.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D',autype='qfq')
  2. data.index = pd.to_datetime(data['date'],format='%Y-%m-%d')
  3. data['percentage']=data['close'].pct_change()
  4. returns = data['percentage'][1:]
  5. _, pvalue, _, _ = jarque_bera(returns)
  6. if pvalue > 0.05:
  7. print 'The returns are likely normal.'
  8. else:
  9. print 'The returns are likely not normal.'

The returns are likely not normal.


一个正收益的策略收益率峰度计算

例子对000001股票从12年到16年的15分钟数据,用均线交叉的策略,获取了收益数据。
数据可从微云下载:

  1. import pandas as pd
  2. import scipy.stats as stats
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. r = pd.read_excel('performance.xls')
  6. r.index = r[u'最后成交时间']
  7. r = r[r[u'买卖'] == u'卖']
  8. r['equity'] = r[u'累积盈利']+100000
  9. returns = r[u'盈利']/r['equity']
  10. print(returns)
  11. plt.hist(returns)
  12. print 'Skew:', stats.skew(returns)
  13. print 'Mean:', np.mean(returns)
  14. print 'Median:', np.median(returns)
  15. print 'kurtosis:', stats.kurtosis(returns)
  16. plt.show()

4

Skew: 2.98409620906
Mean: 0.00258093135289
Median: -0.00318133586001
kurtosis: 12.7743488626

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注