计算OBV(On-Balance Volume,净额成交量或叫能量潮指标)
(1) 把BHP数据分别加载到收盘价和成交量的数组中:
c, v=np.loadtxt('BHP.csv', delimiter=',', usecols=(6, 7), unpack=True)
为了判断计算中成交量前的正负号,我们先使用diff函数计算收盘价的变化量。diff函数可以
计算数组中两个连续元素的差值,并返回一个由这些差值组成的数组:
change = np.diff(c)
print "Change", change
收盘价差值的计算结果如下:
Change [ 1.92 -1.08 -1.26 0.63 -1.54 -0.28 0.25 -0.6 2.15 0.69 -1.33 1.16
1.59 -0.26 -1.29 -0.13 -2.12 -3.91 1.28 -0.57 -2.07 -2.07 2.5 1.18
-0.88 1.31 1.24 -0.59]
(2) NumPy中的sign函数可以返回数组中每个元素的正负符号,数组元素为负时返回-1,为
正时返回1,否则返回0。对change数组使用sign函数:
signs = np.sign(change)
print "Signs", signs
change数组中各元素的正负符号如下所示:
Signs [ 1. -1. -1. 1. -1. -1. 1. -1. 1. 1. -1. 1. 1. -1. -1. -1. -1. -1. -1. -1. -1.
1. 1. 1. -1. 1. 1. -1.]
另外,我们也可以使用piecewise函数来获取数组元素的正负。顾名思义,piecewise①函
数可以分段给定取值。使用合适的返回值和对应的条件调用该函数:
pieces = np.piecewise(change, [change < 0, change > 0], [-1, 1])
print "Pieces", pieces
再次输出数组元素的正负,结果如下:
Pieces [ 1. -1. -1. 1. -1. -1. 1. -1. 1. 1. -1. 1. 1. -1. -1. -1. -1. -1. -1. -1. -1.
1. 1. 1. -1. 1. 1. -1.]
(3) OBV值的计算依赖于前一日的收盘价,所以在我们的例子中无法计算首日的OBV值:
print "On balance volume", v[1:] * signs
计算结果如下:
[2620800. -2461300. -3270900. 2650200. -4667300. -5359800. 7768400.
-4799100. 3448300. 4719800. -3898900. 3727700. 3379400. -2463900.
-3590900. -3805000. -3271700. -5507800. 2996800. -3434800. -5008300.
-7809799. 3947100. 3809700. 3098200. -3500200. 4285600. 3918800.
-3632200.]
1 import numpy as np 2 c, v=np.loadtxt('BHP.csv', delimiter=',', usecols=(6, 7), unpack=True) 3 change = np.diff(c) 4 print "Change", change 5 signs = np.sign(change) 6 print "Signs", signs 7 pieces = np.piecewise(change, [change < 0, change > 0], [-1, 1]) 8 print "Pieces", pieces 9 print "Arrays equal?", np.array_equal(signs, pieces) 10 print "On balance volume", v[1:] * signs
文章来源:《Numpy学习指南》