熟悉 NumPy 常用函數(shù)

熟悉 NumPy 常用函數(shù)

# 來源:NumPy Biginner's Guide 2e ch3

讀寫文件

import numpy as np

# eye 用于創(chuàng)建單位矩陣
i2 = np.eye(2)
print i2
'''
[[ 1.  0.]
[ 0.  1.]]
'''

# 將數(shù)組以純文本保存到 eye.txt 中
np.savetxt("eye.txt", i2)
'''
eye.txt:
1.000000000000000000e+00 0.000000000000000000e+00
0.000000000000000000e+00 1.000000000000000000e+00
'''

# 還可以讀進(jìn)來
print np.loadtxt('eye.txt')
[[ 1.  0.]
 [ 0.  1.]]

讀取 CSV

'''
data.csv:
AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
分別為:
名稱,日期糕非,空朽肥,開盤,最高衡招,最低,收盤州刽,成交量
'''

# delimiter 是分隔符,設(shè)置為 ','
# usecols 設(shè)置需要取的列辨绊,這里只選擇了收盤和成交量
# unpack 設(shè)置為 True房待,返回的數(shù)組是以列為主
# 可以分別將收盤和成交量賦給 c 和 v
c, v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)

均值

import numpy as np

c, v = np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)

# 計算成交量加權(quán)均價
# average 用于計算均值
# weights 參數(shù)指定權(quán)重
vwap = np.average(c, weights=v)
print "VWAP =", vwap
# VWAP = 350.589549353

# mean 函數(shù)也能用于計算均值
print "mean =", np.mean(c)
# mean =  351.037666667

# 計算時間時間加權(quán)均價
t = np.arange(len(c))
print "twap =", np.average(c, weights=t)
# twap = 352.428321839

最大最小值

import numpy as np

# 這次讀入了最高價和最低價
h, l = np.loadtxt('data.csv', delimiter=',', usecols=(4,5), unpack=True)

# 計算歷史最高價和最低價
print "highest =", np.max(h)
# highest = 364.9
print "lowest =", np.min(l)
# lowest = 333.53

# ptp 函數(shù)用于計算極差
print "Spread high price", np.ptp(h)
# Spread high price 24.86
print "Spread low price", np.ptp(l)
# Spread low price 26.97

簡單統(tǒng)計

import numpy as np

# 讀入收盤價
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)

# 計算中位數(shù)
print "median =", np.median(c)
# median = 352.055

# 手動計算中位數(shù)
# 首先排個序
sorted_close = np.msort(c)
print "sorted =", sorted_close
# 然后取中間元素
N = len(c)
print "middle =", sorted[(N - 1)/2]
# middle = 351.99
# 由于我們的數(shù)組長度是偶數(shù)
# 中位數(shù)應(yīng)該是中間兩個數(shù)的均值
# print "average middle =", (sorted[N /2] + sorted[(N - 1) / 2]) / 2
# average middle = 352.055

# 方差
print "variance =", np.var(c)
# variance = 50.1265178889

# 手動計算方差
print "variance from definition =", np.mean((c - c.mean())**2)
# variance from definition = 50.1265178889

股票收益

import numpy as np

# 簡單收益
# 當(dāng)天收盤價減去前一天收盤價桑孩,再除以前一天收盤價
# returns = np.diff( arr ) / arr[ : -1]

# 我們計算一下標(biāo)準(zhǔn)差(方差的平方根)
print "Standard deviation =", np.std(returns)
# Standard deviation = 0.0129221344368

# 對數(shù)收益
# 當(dāng)天收盤價的對數(shù)前前一天收盤價的對數(shù)
logreturns = np.diff( np.log(c) )

# 計算收益為正的下標(biāo)
# where 將布爾索引變成位置索引
posretindices = np.where(returns > 0)
print "Indices with positive returns", posretindices
# Indices with positive returns (array([ 0,  1,  4,  5,  6,  7,  9, 10, 11, 12, 16, 17, 18, 19, 21, 22, 23, 25, 28]),)

# 年化波動
annual_volatility = np.std(logreturns)/np.mean(logreturns)
annual_volatility = annual_volatility / np.sqrt(1./252.) 
print annual_volatility

# 月化波動
print "Monthly volatility", annual_volatility * np.sqrt(1./12.)

處理日期

import numpy as np
from datetime import datetime

# 將日期映射為星期
# Monday 0
# Tuesday 1
# Wednesday 2
# Thursday 3
# Friday 4
# Saturday 5
# Sunday 6
def datestr2num(s):
    return datetime.strptime(s, "%d-%m-%Y").date().weekday()

# 讀取星期和收盤價流椒,converters 將日期映射成星期
dates, close = np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1: datestr2num}, unpack=True)
print "Dates =", dates
# Dates = [ 4.  0.  1.  2.  3.  4.  0.  1.  2.  3.  4.  0.  1.  2.  3.  4.  1.  2.  4.  0.  1.  2.  3.  4.  0.  1.  2.  3.  4.]

# 計算一周中每一天的均值
averages = np.zeros(5)

for i in range(5):
    indices = np.where(dates == i) 
    prices = np.take(close, indices)
    avg = np.mean(prices)
    print "Day", i, "prices", prices, "Average", avg
    averages[i] = avg
'''
Day 0 prices [[ 339.32  351.88  359.18  353.21  355.36]] Average 351.79
Day 1 prices [[ 345.03  355.2   359.9   338.61  349.31  355.76]] Average 350.635
Day 2 prices [[ 344.32  358.16  363.13  342.62  352.12  352.47]] Average 352.136666667
Day 3 prices [[ 343.44  354.54  358.3   342.88  359.56  346.67]] Average 350.898333333
Day 4 prices [[ 336.1   346.5   356.85  350.56  348.16  360.    351.99]] Average 350.022857143
'''

# 計算星期幾最高,星期幾最低
top = np.max(averages)
print "Highest average", top
# Highest average 352.136666667
print "Top day of the week", np.argmax(averages)
# Top day of the week 2

bottom = np.min(averages)
print "Lowest average", bottom
# Lowest average 350.022857143
print "Bottom day of the week", np.argmin(averages
# Bottom day of the week 4

真實波動幅度均值(ATR)


# 真實波動幅度(TR)定義為以下三個度量的最大值
# 1. 當(dāng)天最高價減當(dāng)天最低價
# 2. 當(dāng)天最高價減前一天的收盤價的絕對值
# 3. 前一天收盤價減當(dāng)天最低價的絕對值

import numpy as np
import sys

# 讀入最高價惯裕、最低價绣硝、收盤價
h, l, c = np.loadtxt('data.csv', delimiter=',', usecols=(4, 5, 6), unpack=True)

# 讀入數(shù)據(jù)數(shù)量
N = int(sys.argv[1])
# 獲取最近 N 天的最高價和最低價
h = h[-N:]
l = l[-N:]

print "len(h)", len(h), "len(l)", len(l)
print "Close", c

# 由于需要前一天的收盤價鹉胖,所以往天移動一天
previousclose = c[-N -1: -1]

print "len(previousclose)", len(previousclose)
print "Previous close", previousclose
# maximum 逐元素獲得最大值
truerange = np.maximum(h - l, h - previousclose, previousclose - l) 

print "True range", truerange

# 計算 ATR
atr = np.zeros(N)

# 第一個 ATR 通過均值來計算
atr[0] = np.mean(truerange)

# 計算之后每一個 ATR
# atr[i] = ((N - 1) * atr[i - 1] + tr[i]) / N
for i in range(1, N):
   atr[i] = (N - 1) * atr[i - 1] + truerange[i]
   atr[i] /= N

print "ATR", atr

簡單滑動均值

# 每一天的簡單滑動均值
# 就是當(dāng)天與前 (N - 1) 天的均值
# 其中 N 是窗口大小
import numpy as np
import sys
from matplotlib.pyplot import plot
from matplotlib.pyplot import show

N = int(sys.argv[1])

# 使用 ones 函數(shù)創(chuàng)建大小為 N 的數(shù)組
# 并除以 N 來創(chuàng)建權(quán)重
weights = np.ones(N) / N
print "Weights", weights
# 假設(shè) N 為 5:
# Weights [ 0.2  0.2  0.2  0.2  0.2]

# 讀入收盤價
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)

# 調(diào)用 convolve 函數(shù)來計算滑動平均
sma = np.convolve(weights, c)[N-1:-N+1]

# 繪制函數(shù)圖像
# 要注意橫軸從 (N - 1) 開始
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, sma, lw=2.0)
show()

注:

np.convolve計算離散卷積甫菠,定義為:

離散卷積其實就是系數(shù)數(shù)組的多項式乘法。例如計算[1, 2, 0, 3][1, -2, 5]的卷積:

結(jié)果為[1, 1, 13, -6, 15]拂苹。

指數(shù)滑動均值

import numpy as np
import sys
from matplotlib.pyplot import plot
from matplotlib.pyplot import show

x = np.arange(5)
# exp 計算 e 的 x 次方
print "Exp", np.exp(x)
# Exp [  1.           2.71828183   7.3890561   20.08553692  54.59815003]
# linspace 使用起始值痰洒、終止值和數(shù)量,返回等間隔的數(shù)組
print "Linspace", np.linspace(-1, 0, 5)
# Linspace [-1.   -0.75 -0.5  -0.25  0.  ]

N = int(sys.argv[1])

# 計算權(quán)重
weights = np.exp(np.linspace(-1., 0., N))
weights /= weights.sum()
print "Weights", weights
# 假設(shè) N 為 5:
# Weights [ 0.11405072  0.14644403  0.18803785  0.24144538  0.31002201]

# 讀入收盤價
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
# 使用 convolve 計算指數(shù)滑動均值
ema = np.convolve(weights, c)[N-1:-N+1]

# 繪制函數(shù)圖像
t = np.arange(N - 1, len(c))
plot(t, c[N-1:], lw=1.0)
plot(t, ema, lw=2.0)
show()

布林帶

import numpy as np
import sys
from matplotlib.pyplot import plot
from matplotlib.pyplot import show

# 讀取窗口大小
N = int(sys.argv[1])

# 這是簡單滑動平均的權(quán)重
weights = np.ones(N) / N
print "Weights", weights

# 讀取收盤價
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
# 計算簡單滑動平均
sma = np.convolve(weights, c)[N-1:-N+1]

# 手動計算滑動標(biāo)準(zhǔn)差
deviation = []
C = len(c)

for i in range(N - 1, C):
    # 對于每一天
    # 滑動標(biāo)準(zhǔn)差是當(dāng)天與前 (N - 1) 天的標(biāo)準(zhǔn)差
    # 和滑動均值類似,原書這里有誤
    dev = c[i - (N - 1): i + 1]
    
    averages = np.zeros(N)
    # 這里的 fill 將數(shù)組元素全部變?yōu)橹付ㄖ?    # 相當(dāng)于 averages.flat = sma[i - (N - 1)]
    # 但是比它快
    averages.fill(sma[i - (N - 1)])
    # 也可以直接寫 dev -= sma[i - (N - 1)]
    dev = dev - averages 
    dev = dev ** 2
    dev = np.sqrt(np.mean(dev))
    deviation.append(dev)

deviation = 2 * np.array(deviation)
print len(deviation), len(sma)
# 上布林帶是簡單滑動均值加上兩倍滑動標(biāo)準(zhǔn)差
# 下布林帶是簡單滑動均值減去兩倍滑動標(biāo)準(zhǔn)差
upperBB = sma + deviation
lowerBB = sma - deviation

c_slice = c[N-1:]
between_bands = np.where((c_slice < upperBB) & (c_slice > lowerBB))

print lowerBB[between_bands]
print c[between_bands]
print upperBB[between_bands]
between_bands = len(np.ravel(between_bands))
print "Ratio between bands", float(between_bands)/len(c_slice)

# 繪制收盤價嗅绰、簡單滑動均值
# 上布林帶和下布林帶的圖像
# 要注意橫軸從 N - 1 開始
t = np.arange(N - 1, C)
plot(t, c_slice, lw=1.0)
plot(t, sma, lw=2.0)
plot(t, upperBB, lw=3.0)
plot(t, lowerBB, lw=4.0)
show()

使用線性模型預(yù)測收盤價

import numpy as np
import sys

N = int(sys.argv[1])

# 讀入收盤價
c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)

# 取后 N 天的收盤價,并倒序
b = c[-N:]
bbx = b[::-1]
print "bbx", bbx
# bbx [ 351.99  346.67  352.47  355.76  355.36]

# 構(gòu)建 NxN 的二維數(shù)組
A = np.zeros((N, N), float)
print "Zeros N by N", A
'''
A = np.zeros((N, N), float)
print "Zeros N by N", A
Zeros N by N [[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]
'''

# A[i] 是倒數(shù)第 i 天的前 N 天的收盤價
for i in range(N):
   A[i, ] = c[-N - 1 - i: - 1 - i]

print "A", A
'''
A [[ 360.    355.36  355.76  352.47  346.67]
 [ 359.56  360.    355.36  355.76  352.47]
 [ 352.12  359.56  360.    355.36  355.76]
 [ 349.31  352.12  359.56  360.    355.36]
 [ 353.21  349.31  352.12  359.56  360.  ]]
'''

# 根據(jù)每一天前 N 天收盤價來預(yù)測當(dāng)天收盤價
# np.linalg.lstsq 是最小二乘法的多元線性回歸
# A 是輸入屬性的數(shù)據(jù)集翠语,行是記錄财边,列是屬性
# b 是輸出屬性的數(shù)組
# x 是系數(shù)數(shù)組,x = (A^T A)^(-1) A^T b
(x, residuals, rank, s) = np.linalg.lstsq(A, b)

print x, residuals, rank, s
# [ 0.78111069 -1.44411737  1.63563225 -0.89905126  0.92009049] [] 5 [  1.77736601e+03   1.49622969e+01   8.75528492e+00   5.15099261e+00   1.75199608e+00]

# 通過后 N 天收盤價來預(yù)測下一天的收盤價
print np.dot(b, x)
# 357.939161015

剪切和壓縮數(shù)組

import numpy as np

a = np.arange(5)
print "a =", a
# a = [0 1 2 3 4]

# clip 用于剪切數(shù)組
# 小于最小值的元素會替換成最小值
# 大于最大值的元素會替換成最大值
print "Clipped", a.clip(1, 2)
# Clipped [1 1 2 2 2]

a = np.arange(4)
print a
# [0 1 2 3]

# compress 用于過濾元素
# 等價于 a[a > 2]
print "Compressed", a.compress(a > 2)
# Compressed [3]

計算階乘

import numpy as np

b = np.arange(1, 9)
print "b =", b
# b = [1 2 3 4 5 6 7 8]

# prod 用于求出各元素乘積
print "Factorial", b.prod()
# Factorial 40320

# cumprod 求出累積連乘
# P[i] = a[0] * ... * a[i]
print "Factorials", b.cumprod()
# Factorials [    1     2     6    24   120   720  5040 40320]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍夭,一起剝皮案震驚了整個濱河市憨募,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珠漂,老刑警劉巖尾膊,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冈敛,死亡現(xiàn)場離奇詭異待笑,居然都是意外死亡抓谴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門椎侠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來措拇,“玉大人慎宾,你說我怎么就攤上這事∪纾” “怎么了汹碱?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稚新。 經(jīng)常有香客問我,道長褂删,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任缅帘,我火速辦了婚禮难衰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铃诬。我一直安慰自己苍凛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布宣肚。 她就那樣靜靜地躺著悠栓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惭适。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天往枷,我揣著相機(jī)與錄音凄杯,去河邊找鬼。 笑死戒突,一個胖子當(dāng)著我的面吹牛膊存,可吹牛的內(nèi)容都是我干的导而。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窑多,長吁一口氣:“原來是場噩夢啊……” “哼洼滚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起千康,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铲掐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后豪椿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體携栋,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年鸯隅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柱彻。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡跟畅,死狀恐怖溶推,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庇忌,我是刑警寧澤舰褪,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布疏橄,位于F島的核電站略就,受9級特大地震影響晃酒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贝次,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一蛔翅、第九天 我趴在偏房一處隱蔽的房頂上張望敲茄。 院中可真熱鬧山析,春花似錦、人聲如沸秆剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钾挟。三九已至,卻和暖如春处渣,著一層夾襖步出監(jiān)牢的瞬間蛛砰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工荠诬, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留位仁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓聂抢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親有决。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容