1. 程式人生 > >Numpy攻略:發現冪律

Numpy攻略:發現冪律

冪律分佈:用於描述財富的不均勻性,即富翁的精英所佔的都很少。
具體步驟:
1.提取正的收益率資料:計算收盤價的對數並且對結果進行差分運算,之後從收益率資料中,選出正值。
2.獲取收益率的收益頻率:使用histogram函式,獲得收益率的出現頻率。分組計算,並返回一個包含各組計數值的陣列。
3.利用頻數值和收益率資料擬合直線:使用ployfit擬合直線
4.使用Matplotlib繪製出結果資料和擬合後的曲線
完整程式碼如下:

  import numpy
import fix_yahoo_finance as yf
yf.pdr_override()
import pandas_datareader as web
from datetime import date
import sys
import matplotlib.pyplot
#1.獲取收盤價資料
if len(sys.argv)!=3:
    print("Usage Python %s SYMBOL k"%(sys.argv[0]) )
    print("For instance python %s AAPL 1"%(sys.argv[0]))
    sys.exit()
#datetimie:日期時間函式
today=date.today()
start=(today.year-1,today.month,today.day)
quotes=web.get_data_yahoo(sys.argv[1],start,today)
close=[q[4] for q in quotes]
#提取正的收益率資料(用對數)
logreturns=numpy.diff(numpy.log(close))
pos=logreturns[longreturns>0]
#3.獲得收益出現的頻率
counts,rets=numpy.histogram(pos)
rets=rets[:-1]+(rets[1]-rets[0])/2
freqs=1.0/(counts+0.01)
freqs=numpy.log(freqs)
#4.利用頻率值和收益率資料擬合直線
p=numpy.polyfit(rets,freqs,1)
#5.圖示結果
matplotlib.pyplot.plot(rets.freqs,'o')
matplotlib.pyplot.plot(rets,p[0]*rets+p[1])
matplotlib.pyplot.show()