Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算
成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图、周线图、月线图甚至是5分钟、30分钟、60分钟图中绘制。
股票市场成交量的变化反映了资金进出市场的情况,成交量是判断市场走势的重要指标。一般情况下,成交量大且价格上涨的股票,趋势向好。成交量持续低迷时,一般出现在熊市或股票整理阶段,市场交易不活跃。成交量是判断股票走势的重要依据,对分析主力行为提供了重要的依据。投资者对成交量异常波动的股票应当密切关注。
OBV(On-Balance Volume,净额成交量或叫能量潮指标)是最简单的股价指标之一,它可以由当日收盘价、前一天的收盘价以及当日成交量计算得出。以前一日为基期计算当日的OBV值(可以认为基期的OBV值为0)。若当日收盘价高于前一日收盘价,则本日OBV等于基期OBV加上日成交量。若当日收盘价低于前一日收盘价,则本日OBV等于基期OBV减去当日成交量。若当日收盘价相比前一日没有变化,则当日成交量以0计算。
一、OBV计算
鉴于上述计算方法,需要在成交量前面乘上一个由收盘价变化决定的正负号(收盘价低于前一交易日收盘价,负号,收盘价高于前一交易日收盘价,正号)。在本篇中,学习该问题的两种解决方法,一种是使用NumPy中的 sign 函数,另一种是使用NumPy的piecewise 函数。
1) 把数据分别加载到收盘价和成交量的数组中:
close,vol = np.loadtxt('data036.csv',delimiter=',', usecols=(5,6),converters={1:datestr2num},unpack=True)
data036.csv中的第6列和第7列分别为收盘价和当日成交量。
前篇介绍过numpy.diff()可以计算相邻的差(即上述收盘价close的差值),并利用这个差值, 用sign 函数计算正负号
changes = np.diff(close)
signs = np.sign(changes)
print ("Signs", signs)
运行结果:
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. -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....
2)也可以使用 piecewise 函数来获取数组元素的正负。 piecewise函数可以分段给定取值。使用合适的返回值和对应的条件调用该函数:
pieces = np.piecewise(changes, [changes < 0, changes > 0], [-1, 1])
print("Pieces", pieces)
3)判断是否 sign 函数和piecewise 函数计算结果是否一致用array_equal()函数:
print ("Arrays equal?", np.array_equal(signs, pieces))
运行结果:
Arrays equal? True
4)由于diff()y计算的结果是相邻数据相减,因此得到419个数据,较从文件中导入的数据420个少一位,因此无法计算首日的OBV值
obv_values = vol[1:] * signs #计算obv值
print("obv values:",obv_values[:20]) #打印前20个obv值
完成代码如下:
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
import sys,os def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday() close,vol = np.loadtxt('data036.csv',delimiter=',', usecols=(5,6),converters={1:datestr2num},unpack=True)
#new_close = np.loadtxt('data999.csv',delimiter=',', usecols=(5,),converters={1:datestr2num},unpack=True) changes = np.diff(close)
signs = np.sign(changes)
print ("Signs", signs[:20])#打印前20个signs值 pieces = np.piecewise(changes, [changes < 0, changes > 0], [-1, 1])
print("Pieces", pieces[:20])#打印前20个pieces值
print ("Arrays equal?", np.array_equal(signs, pieces)) obv_values = vol[1:] * signs #计算obv值
print("obv values:",obv_values[:20]) #打印前20个obv值
运行结果:
二、 计算单个交易日的利润
1)读入数据
将所有交易数据(开盘价、收盘价、最高价、最低价,成交量等)加载到对应的数组中
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
import sys,os def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday() opens,highs,lows,closes,vols = np.loadtxt('data036.csv',delimiter=',', usecols=(2,3,4,5,6),converters={1:datestr2num},unpack=True) #开盘价、最高价、最低价、收盘价、成交量数组。
2)调用 vectorize 函数并给定calc_profit 函数作为参数:
(1)先定义一个计算利润的函数:这个函数,是以开盘价买入,以当日收盘价卖出,所获得的利润即买入和卖出的差价。事实上,计算相对利润更为直观。
def calc_profit(opens, highs, lows, closes):
buy = opens * 1
if lows < buy < highs :
return (closes - buy)/buy
else:
return 0
(2)调用 vectorize 函数并给定calc_profit 函数作为参数
func = np.vectorize(calc_profit)
profits=func(opens,highs,lows,closes) print ("Profits", profits)
3)选择非零利润的交易日,并计算平均值:
real_trades = profits[profits != 0]
print ("Number of trades", len(real_trades), round(100.0 * len(real_trades)/len(closes), 2),"%")
print ("Average profit/loss %", round(np.mean(real_trades) * 100, 2))
当然也可以分别计算盈利和亏损:
real_trades = profits[profits > 0]
print ("Number of trades", len(real_trades), round(100.0 * len(real_trades)/len(closes), 2),"%")
print ("平均盈利: %", round(np.mean(real_trades) * 100, 2)) loss_trades = profits[profits < 0]
print ("Number of trades", len(loss_trades), round(100.0 * len(loss_trades)/len(closes), 2),"%")
print ("平均亏损 %", round(np.mean(loss_trades) * 100, 2))
实际运行结果:
三、数据平滑
噪声数据很难处理,因此需要对其进行平滑处理,除前篇介绍的计算移动平均线的方法,还可以使用NumPy中的一个函数来平滑数据。hanning 函数是一个加权余弦的窗函数。
1)调用 hanning 函数计算权重,生成一个长度为 N 的窗口(在这个示例中 N 取8)
N=8
weights = np.hanning(N) #调用hanning 函数计算权重,生成一个长度为8的窗口
print("Weights", weights)
运行结果:
Weights [0. 0.1882551 0.61126047 0.95048443 0.95048443 0.61126047 0.1882551 0. ]
2)用 convolve 函数计算closes的股票收益率,以归一化处理后的 weights 作为参数
closes_returns = np.diff(closes) / closes[ : -1] #计算收盘价相邻差价
smooth_closes = np.convolve(weights/weights.sum(), closes_returns) [N-1:-N+1]#利用权重,计算数据平滑
opens_returns = np.diff(opens) / opens[ : -1] #计算开盘价相邻差价
smooth_opens = np.convolve(weights/weights.sum(), opens_returns) [N-1:-N+1]
3)用 Matplotlib 绘图
t = np.arange(N - 1, len(closes_returns))
plt.plot(t, closes_returns[N-1:], lw=1.0)
plt.plot(t, smooth_closes, lw=2.0)
plt.plot(t, opens_returns[N-1:], lw=1.0)
plt.plot(t, smooth_opens, lw=2.0)
plt.show()
运行结果:
4)
如上图中的折线有交叉,这些交叉点可能就是股价趋势的转折点,至少可以表明closes和opens之间的股价关系发生了变化,这些转折点可能会经常出现,可以利用它们预测未来的股价走势。
使用多项式拟合平滑后两组数据,解出的两个多项式取值相等时(即在哪些地方存在交叉点),这等价于先对两个多项式函数作差,然后对所得的多项式函数求根。使用 polysub 函数对多项式作差如下:
t = np.arange(N - 1, len(closes_returns))
poly_closes = np.polyfit(t, smooth_closes,N) #求收盘价的多项式
poly_opens = np.polyfit(t, smooth_opens, N) #求收盘价的多项式
poly_sub = np.polysub(poly_closes, poly_opens) #polysub函数对多项式作差,
xpoints = np.roots(poly_sub) #对所得的多项式函数求根
print("Intersection points:", xpoints)
运行结果:
Intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
97.72837787 51.03724424 18.28586259]
5)用 isreal 函数来判断数组元素是否为实数,用 select 函数选出它们。 select 函数可根据一组给定的条件,从一组元素中挑选出符合条件的元素并返回数组。
得到的实数交叉点、再去掉其中为0的元素。 trim_zeros 函数可以去掉一维数组中开头和末尾为0的元素。
reals = np.isreal(xpoints) #用isreal 函数来判断数组元素是否为实数
print ("Real number:", reals) xpoints = np.select([reals], [xpoints]) #select 函数根据一组给定条件,
xpoints = xpoints.real # 从一组元素中挑选出符合条件的元素并返回数组
print("Real intersection points:", xpoints)
print("Sans 0s:", np.trim_zeros(xpoints))#trim_zeros 函数可以去掉一维数组中开头和末尾为0的元素
运行结果如下:
Intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
97.72837787 51.03724424 18.28586259]
Real number: [ True True True True True True True True]
Real intersection points: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
97.72837787 51.03724424 18.28586259]
Sans 0s: [403.82451866 354.50031142 289.94335284 213.44012464 185.82581983
97.72837787 51.03724424 18.28586259]
完整代码如下:
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday() opens,highs,lows,closes,vols = np.loadtxt('data036.csv',delimiter=',', usecols=(2,3,4,5,6),converters={1:datestr2num},unpack=True)
#开盘价、最高价、最低价、收盘价、成交量数组。
N=8
weights = np.hanning(N) #调用hanning 函数计算权重,生成一个长度为8的窗口
print("Weights:", weights)
closes_returns = np.diff(closes) / closes[ : -1] #计算收盘价相邻差价
smooth_closes = np.convolve(weights/weights.sum(), closes_returns) [N-1:-N+1]#利用权重,计算数据平滑
opens_returns = np.diff(opens) / opens[ : -1] #计算开盘价相邻差价
smooth_opens = np.convolve(weights/weights.sum(), opens_returns) [N-1:-N+1]
t = np.arange(N - 1, len(closes_returns)) #多项式拟合平滑后的数据
t = np.arange(N - 1, len(closes_returns))
poly_closes = np.polyfit(t, smooth_closes,N) #求收盘价的多项式
poly_opens = np.polyfit(t, smooth_opens, N) #求收盘价的多项式
poly_sub = np.polysub(poly_closes, poly_opens) #polysub函数对多项式作差,
xpoints = np.roots(poly_sub) #对所得的多项式函数求根
print("Intersection points:", xpoints) reals = np.isreal(xpoints) #用isreal 函数来判断数组元素是否为实数
print ("Real number:", reals)
xpoints = np.select([reals], [xpoints]) #select 函数根据一组给定条件,
xpoints = xpoints.real # 从一组元素中挑选出符合条件的元素并返回数组
print("Real intersection points:", xpoints)
print("Sans 0s:", np.trim_zeros(xpoints))#trim_zeros 函数可以去掉一维数组中开头和末尾为0的元素 plt.plot(t, closes_returns[N-1:], lw=1.0)
plt.plot(t, smooth_closes, lw=2.0)
plt.plot(t, opens_returns[N-1:], lw=1.0)
plt.plot(t, smooth_opens, lw=2.0)
plt.show()
Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算的更多相关文章
- Python数据分析--Numpy常用函数介绍(4)--Numpy中的线性关系和数据修剪压缩
摘要:总结股票均线计算原理--线性关系,也是以后大数据处理的基础之一,NumPy的 linalg 包是专门用于线性代数计算的.作一个假设,就是一个价格可以根据N个之前的价格利用线性模型计算得出. 前一 ...
- Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数
摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...
- Python数据分析--Numpy常用函数介绍(6)--Numpy中矩阵和通用函数
在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat . matrix 以及 bmat 函数来创建矩阵. 一.创建矩阵 mat 函数创 ...
- Python数据分析--Numpy常用函数介绍(9)--Numpy中几中常见的图形
在NumPy中,所有的标准三角函数如sin.cos.tan等均有对应的通用函数. 一.利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波器上显示出利萨茹曲线 ...
- Python数据分析--Numpy常用函数介绍(2)
摘要:本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数.学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数. ...
- Python数据分析--Numpy常用函数介绍(3)
摘要:先汇总相关股票价格,然后有选择地对其分类,再计算移动均线.布林线等. 一.汇总数据 汇总整个交易周中从周一到周五的所有数据(包括日期.开盘价.最高价.最低价.收盘价,成交量等),由于我们的数据是 ...
- Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg
numpy.linalg 模块包含线性代数的函数.使用这个模块,可以计算逆矩阵.求特征值.解线性方程组以及求解行列式等.一.计算逆矩阵 线性代数中,矩阵A与其逆矩阵A ^(-1)相乘后会得到一个单位矩 ...
- numpy常用函数学习
目录numpy常用函数学习点乘法线型预测线性拟合裁剪.压缩和累乘相关性多项式拟合提取符号数组杂项点乘法该方法为数学方法,但是在numpy使用的时候略坑.numpy的点乘为a.dot(b)或numpy. ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
随机推荐
- Python使用函数模拟“汉诺塔”过程
运行效果: 源代码: 1 # -*- coding:utf-8 -*- 2 ##汉诺塔游戏开始 3 _times=0 #用于统计移动次数 4 def hannuota(nlist,mfrom,mpas ...
- JavaScript实现简单轮播图动画
运行效果: 源代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&quo ...
- TINY语言采用递归下降分析法编写语法分析程序
目录 自顶向下分析方法 TINY文法 消左提左.构造first follow 基本思想 python构造源码 运行结果 参考来源:聊聊编译原理(二) - 语法分析 自顶向下分析方法 自顶向下分析方法: ...
- python中faker模块的使用
Faker 安装 pip install Faker 基本使用 from faker import Faker #创建对象,默认生成的数据为为英文,使用zh_CN指定为中文 fake = Faker( ...
- 从实例学习 Go 语言、"并发内容" 学习笔记及心得体会、Go指南
第一轮学习 golang "并发内容" 学习笔记,Go指南练习题目解析.使用学习资料 <Go-zh/tour tour>.记录我认为会比较容易忘记的知识点,进行补充,整 ...
- Pytest系列(一)初次了解
在之前,我分享过unittest系列,后来有很多人问我,能不能出pytest的教程,正好最近在整理pytest相关的资料,那么,就趁着这个机会,去和大家分享一下pytest系列. pytest是一个非 ...
- BurpSuite下提示embedded browser initialisation failed(嵌入式浏览器初始化失败)的解决方法
BurpSuite可谓是渗透测试过程经常使用的神器之一,但使用中经常会碰到奇奇怪怪的问题,比如有时抓http包,发送到Repeater(中继器,也叫重发器)模块后,在右边Render模块下,却无法看到 ...
- vue--vuex 中 Modules 详解
前言 在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理.于是Vuex中就存在了另 ...
- zookeeper篇-watch命令
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 每个路径节点都有一个watcher监控,当该节点数据改变时(CRUD), ...
- 新华三Gen10服务器ILO 5 安装中文语言包
ILO 5 安装中文语言包 在官网下载语言包文件,并解压 选择firmware&OS software,点击右侧的update firmware 选择本地文件,浏览到语言包里面的lpk文件,点 ...