python numpy学习笔记(5)

这次主要计算真实波动平均值,简单移动曲线,指数移动平均线和布林带。

1.计算真实波动平均值

主要介绍的是maxium函数,maxium函数可以找到两个数组中对应元素的最大值。

#ATR(真实波动幅度均值)的计算
N = 20  # 需要计算的天数
h = HighData[-N:]   # 读取最近N天的最高价
l = LowData[-N:]    # 读取最近N天的最低价
previousclose = CloseData[-(N+1):-1]    #读取最近N天的前一天的收盘价
truerange_1 = maximum(h - l, previousclose - l)     # 前两个数组中的最大值
truerange_2 = maximum(previousclose - l, previousclose - l)     # 后两个数组中的最大值
truerange = maximum(truerange_1, truerange_2)   # 所有的最大值
# 对于每一天的价格,找到最高价与最低价,最高价与前一天收盘价,前一天收盘价与最高价,三个差值中最大的那个差值
atr = zeros(N)  # 建立一个长度为N的数组
atr[0] = mean(truerange)    # truerange 的均值
for i in range(1,N):
    atr[i] = (N-1) * atr[i-1] + truerange[i]
    atr[i] /= N
# ((N-1) * PATR+TR) / N  此处PTAR代表前一个交易日的真实波动值,TR代表当日的真实波动值,此处计算的是之后的移动平均值

这里值得注意的就是maximum函数的用法,两个序列对应项的最大值,然后重新赋给一个新序列。


2.计算简单移动平均线

移动平均线,Moving Average,简称MA,原本的意思是移动平均,由于我们将其制作成线形,所以一般称之为移动平均线,简称均线。它是将某一段时间的收盘价之和除以该周期。

此处可以用收盘价与权重的卷积计算。


close = CloseData   # 读入收盘价数据
weights = ones(N) / N    # 等权重
sma = convolve(weights, close)[N-1: -N+1]    # 卷积
t = arange(N-1,len(close))  # 从N-1到close实际大小的数组
plot(t, close[N-1:], lw=1.0)    # 收盘价画图
plot(t, sma, lw=2.0)    # 简单移动平均线的图
show()


值得注意的是卷积操作。


3.计算指数移动平均线

EXPMA(Exponential Moving Average)译指数平滑移动平均线,乃为因应移动平均线被视为落后指标的缺失而发展出来的,为解决一旦价格已脱离均线差值扩大,而平均线未能立即反应,EXPMA可以减少类似缺点。


weights = exp(linspace(-1.0, 0, N))
weights /= weights.sum()
sma = convolve(weights, close)[N-1: -N+1]    # 卷积
t = arange(N-1,len(close))  # 从N-1到close实际大小的数组
plot(t, close[N-1:], lw=1.0)    # 收盘价画图
plot(t, sma, lw=2.0)    # 简单移动平均线的图
show()
这里值得注意的是linspace将-1到0分成N份。

而exp这是e的几次方。


4.布林带的计算

布林带(Bollinger Band)是由三条线组成,在中间的通常为 20 天平均线,而在上下的两条线则分别为Up 线和 Down 线,算法是首先计出过去 20 日收巿价的标准差 SD(Standard Deviation) ,通常再乘 2 得出 2 倍标准差, Up 线为 20 天平均线加 2 倍标准差, Down 线则为 20 天平均线减 2 倍标准差。


deviation = []
C = len(close)
for i in range(N - 1, C):
    if i + N < C:
        dev = close[i:i + N]
    else:
        dev = close[-N]     # 找到20天内的数据
    averages = zeros(N)
    averages.fill(sma[i-N-1])   # 用fill将所求那天的简单移动平均线上的数据找到
    dev = dev - averages
    dev = dev ** 2
    dev = sqrt(mean(dev))   # 计算标准差
    deviation .append(dev)  # 加入到deviation数组中

deviation = 2 * array(deviation)    # 两倍标准偏差
upperBB = sma + deviation   # 上界为高简单移动曲线高两倍标准偏差距离
lowerBB = sma - deviation   # 下界为高简单移动曲线低两倍标准偏差距离

c_slice = close[N-1:]       # 成交价
between_bands = where((c_slice < upperBB) & (c_slice > lowerBB))
print lowerBB[between_bands]
print close[between_bands]
print upperBB[between_bands]
between_bands = len(ravel(between_bands))
print "Ratio between bands",float(between_bands)/len(c_slice)

t = arange(N - 1, C)
plot(t, c_slice, lw=1.0)
plot(t, sma, lw=1.5)
plot(t, upperBB, lw=2.0)
plot(t, upperBB, lw=2.0)
show()
利用fill函数可以将一个数填充整个数组。


所有的源代码:

# -*- coding:utf-8 -*-
from numpy import *
from datetime import *
from matplotlib.pyplot import *

def datestr2num(s):
    return datetime.strptime(s, "%Y/%m/%d").date().weekday()
# 日期转化成星期几的函数

def summarize(a, o, h, l, c):
    mondy_open = o[a[0]]
    week_high = max(take(h,a))
    week_low = min(take(l,a))
    friday_close = c[a[-1]]
    return ("APPL", mondy_open, week_high, week_low, friday_close)
#将周数据汇总,找到周数据的开盘价,最高价,最低价,收盘价

DateData, OpenData, HighData, LowData, CloseData, ADJCloseData, VolumeData \
    = loadtxt('AAPL.csv', delimiter=',', usecols=(0, 1, 2, 3, 4, 5, 6), converters={0: datestr2num}, unpack=True)
# usecols 是读取0—6行,converters是将第0行的数据通过调用datestr2num 函数转化成日期类型,unpack是分拆
Avg_OpenData = mean(OpenData)  # 开盘价的算数平均数
VMAP = average(CloseData, weights=VolumeData)  # 成交价与成交量的加权平均数
Max_HighData = max(HighData)  # 历史最高价的最大值
Low_LowData = min(LowData)  # 历史最低价的最小值
Ptp_CloseData = ptp(CloseData)  # 成交价的极差
Median_CloseData = median(CloseData)  # 成交价的中位数
Var_CloseData = var(CloseData)  # 成交价的方差
Population_Variance_CloseData = nansum(((CloseData - mean(CloseData)) ** 2)) / (len(CloseData) - 1)
# 由概率论知识可得,样本的无偏估计量为离差平方和除以样本估计量-1

Rate_Return = diff(CloseData) / CloseData[:-1]  # 股票收益率的计算
StandardDeviation_Rate_Return = std(Rate_Return)  # 收益率的标准差
LogRate_Return = diff(log(CloseData))  # 对数收益率
Index_Position = where(Rate_Return > 0)  # 收益率大于0的索引
Volatility_Annual = (std(LogRate_Return) / mean(LogRate_Return)) / sqrt(1.0 / 252.0)
# 股票的年波动率,对数收益率的标准差除以对数收益率的均值,再除以交易天数(252天)倒数的平方根

# 成交量加权平均数的计算
VWAP_weekday = zeros(5)  # 创建一个5个行向量的数组
for i in range(5):
    indices = where(DateData == i)  # 获取DateData的索引号
    prices = take(CloseData, indices)   # 从CloseData中得到索引为indices的值
    volume = take(VolumeData, indices)   # 从中VolumeData中得到索引为indices的值
    VWAP_weekday[i] = average(prices,weights=volume)  # prices的加权平均值,权重为成交量
    #print "weekday", i+1, "average price is", VWAP_weekday[i]
#print"the weekday ",argmax(VWAP_weekday)+1, "has the max price", max(VWAP_weekday)
# argmax 可以提取最大数据对应的索引值,max找到那个数据
#print "the weekday ", argmin(VWAP_weekday)+1, "has the min price", min(VWAP_weekday)
# argmin 可以提取最小数据对应的索引值,min找到那个数据

open = OpenData[:16]
high = HighData[:16]
low = LowData[:16]
close = CloseData[:16]
dates = DateData[:16]
# 读取前三周的数据,存储于各个数组中

first_mondy = ravel(where(dates == 0))[0]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,第一个星期一正好是数组下标为0的变量
last_fridy = ravel(where(dates == 4))[-1]
# 用where找到相应的数组下标,进而生成一个二维数组,ravel展平数组,最后一个星期五正好是数组下标为-1的变量
week_indices = arange(first_mondy,last_fridy+1)
# 将第一个星期一与最后一个星期五中的所有的日期构成一个序列
week_indices = split(week_indices, 3)
# 将序列平均切片成三部分
week_summary = apply_along_axis(summarize, 1, week_indices, open, high, low, close)
# 调用app_along_axis函数,对于将week_indices, open, high, low, close都传进summarize中,进行处理
#print week_summary
#savetxt("weeksummary.csv", week_summary, delimiter=",", fmt="%s")

#ATR(真实波动幅度均值)的计算
N = 20  # 需要计算的天数
h = HighData[-N:]   # 读取最近N天的最高价
l = LowData[-N:]    # 读取最近N天的最低价
previousclose = CloseData[-(N+1):-1]    #读取最近N天的前一天的收盘价
truerange_1 = maximum(h - l, previousclose - l)     # 前两个数组中的最大值
truerange_2 = maximum(previousclose - l, previousclose - l)     # 后两个数组中的最大值
truerange = maximum(truerange_1, truerange_2)   # 所有的最大值
# 对于每一天的价格,找到最高价与最低价,最高价与前一天收盘价,前一天收盘价与最高价,三个差值中最大的那个差值
atr = zeros(N)  # 建立一个长度为N的数组
atr[0] = mean(truerange)    # truerange 的均值
for i in range(1,N):
    atr[i] = (N-1) * atr[i-1] + truerange[i]
    atr[i] /= N
# ((N-1) * PATR+TR) / N  此处PTAR代表前一个交易日的真实波动值,TR代表当日的真实波动值,此处计算的是之后的移动平均值

# 计算简单移动平均线。定义:第N日的简单移动平均线:N日收市价之和/N
# 即可表示为收盘价与等权重的卷积
close = CloseData   # 读入收盘价数据
weights = ones(N) / N    # 等权重
sma = convolve(weights, close)[N-1: -N+1]    # 卷积
t = arange(N-1,len(close))  # 从N-1到close实际大小的数组
plot(t, close[N-1:], lw=1.0)    # 收盘价画图
plot(t, sma, lw=2.0)    # 简单移动平均线的图
show()

'''weights = exp(linspace(-1.0, 0, N))
weights /= weights.sum()
sma = convolve(weights, close)[N-1: -N+1]    # 卷积
t = arange(N-1,len(close))  # 从N-1到close实际大小的数组
plot(t, close[N-1:], lw=1.0)    # 收盘价画图
plot(t, sma, lw=2.0)    # 简单移动平均线的图
show()'''

deviation = []
C = len(close)
for i in range(N - 1, C):
    if i + N < C:
        dev = close[i:i + N]
    else:
        dev = close[-N]     # 找到20天内的数据
    averages = zeros(N)
    averages.fill(sma[i-N-1])   # 用fill将所求那天的简单移动平均线上的数据找到
    dev = dev - averages
    dev = dev ** 2
    dev = sqrt(mean(dev))   # 计算标准差
    deviation .append(dev)  # 加入到deviation数组中

deviation = 2 * array(deviation)    # 两倍标准偏差
upperBB = sma + deviation   # 上界为高简单移动曲线高两倍标准偏差距离
lowerBB = sma - deviation   # 下界为高简单移动曲线低两倍标准偏差距离

c_slice = close[N-1:]       # 成交价
between_bands = where((c_slice < upperBB) & (c_slice > lowerBB))
print lowerBB[between_bands]
print close[between_bands]
print upperBB[between_bands]
between_bands = len(ravel(between_bands))
print "Ratio between bands",float(between_bands)/len(c_slice)

t = arange(N - 1, C)
plot(t, c_slice, lw=1.0)
plot(t, sma, lw=1.5)
plot(t, upperBB, lw=2.0)
plot(t, upperBB, lw=2.0)
show()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值