本文所用文件的百度云链接:
链接:https://pan.baidu.com/s/15-qbrbtRs4frup24Y1i5og
提取码:pm2c
算数平均值
算数平均值表示对真值的无偏估计.
S = [s1, s2, s3 .... sn]
m = (s1+s2+s3+ .... +sn) / n
# 求array数组的均值
np.mean(array)
案例: 绘制30日收盘价的均线.
# 绘制均线
mean = np.mean(closing_prices)
mp.hlines(mean, dates[0], dates[-1],
color='orangered', label='Mean(ClosingP)')
加权平均值
S = [s1, s2, s3 ... sn] # 样本
W = [w1, w2, w3 ... wn] # 权重
A = (s1w1 + s2w2 + ... snwn)/(w1+w2+..wn)
# 计算加权平均值
# closing_prices: 样本数组
# weights: 权重数组
np.average(closing_prices, weights=array)
成交量加权平均值 (VWAP)
以每天的交易量作为权重, 计算加权平均值. (VWAP体现了市场对当前交易价格的认可度)
# 成交量加权均线
vwap = np.average(closing_prices, weights=volumns)
mp.hlines(vwap, dates[0], dates[-1],
color='limegreen', label='VWAP')
时间加权平均值 (TWAP)
# 时间加权均线
times = np.arange(1, closing_prices.size+1)
twap = np.average(closing_prices, weights=times)
mp.hlines(twap, dates[0], dates[-1],
color='violet', label='TWAP')
最值
np.max(array) # 求array数组的最大值
np.min(array) # 求array数组的最小值
np.pip(array) # 求array数组的极差(max-min)
np.argmax(array) # 获取array数组最大值的下标
np.argmin(array) # 获取array数组最小值的下标
# a与b是同维数组
# 留下两数组中相比的最大值组成新数组
np.maximum(a, b)
# 留下两数组中相比的最小值组成新数组
np.minimum(a, b)
中位数
将多个样本按照大小排序, 取中间位置的元素.
# 对有序数组array 求中位数
m = np.median(ary)
# 中位数算法
m = (ary[(size-1)/2] + ary[size/2]) / 2
案例演示:
"""
绘制均线
"""
import numpy as np
import matplotlib.pyplot as mp
import datetime as dt
import matplotlib.dates as md
# 当numpy解析文本时,将会把第一列中的每个字符串
# 都传给函数进行处理, 将处理完毕后的返回值
# 转成需要的M8[D]类型
def dmy2ymd(dmy):
dmy = str(dmy, encoding='utf-8')
# 把dmy转成日期对象
d = dt.datetime.strptime(dmy, '%d-%m-%Y')
t = d.date()
s = t.strftime('%Y-%m-%d')
return s
# 加载文件
dates, closing_prices, volumns = np.loadtxt(
'../da_data/aapl.csv', delimiter=',',
usecols=(1,6,7), unpack=True,
dtype='M8[D], f8, f8' ,
converters={1:dmy2ymd})
# 绘制收盘价
mp.figure('AAPL', facecolor='lightgray')
mp.title('AAPL', fontsize=18)
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 设置主刻度定位器为每周一
ax = mp.gca()
ax.xaxis.set_major_locator(
md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(
md.DateFormatter('%Y/%m/%d'))
# 把M8[D]转为matplotlib识别的date类型
dates = dates.astype(md.datetime.datetime)
mp.plot(dates, closing_prices, alpha=0.6,
color='dodgerblue', linewidth=2,
linestyle='--', label='closing_prices')
# 绘制均线
mean = np.mean(closing_prices)
mp.hlines(mean, dates[0], dates[-1],
color='orangered', label='Mean(ClosingP)')
# 成交量加权均线
vwap = np.average(closing_prices, weights=volumns)
mp.hlines(vwap, dates[0], dates[-1],
color='limegreen', label='VWAP')
# 时间加权均线
times = np.arange(1, closing_prices.size+1)
twap = np.average(closing_prices, weights=times)
mp.hlines(twap, dates[0], dates[-1],
color='violet', label='TWAP')
# 绘制中位数水平线
sorted_prices = np.msort(closing_prices)
median = np.median(sorted_prices)
# 自己计算
size = sorted_prices.size
median = (sorted_prices[int((size-1)/2)] + \
sorted_prices[int(size/2)]) / 2
print(median)
mp.hlines(median, dates[0], dates[-1],
color='gold', label='Median')
mp.legend()
# 自动格式化x轴的日期输出
mp.gcf().autofmt_xdate()
mp.show()