2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Python之数据分析(numpy线性模型 线性预测 线性拟合)

Python之数据分析(numpy线性模型 线性预测 线性拟合)

时间:2018-10-20 20:53:00

相关推荐

Python之数据分析(numpy线性模型 线性预测 线性拟合)

文章目录

一、线性预测二、线性拟合

线性模型分为两种:线性预测和线性拟合,这两种都可以起到预测走势和数据点的作用,当然,预测是存在一定误差的,因此这种预测图像仅供参考。

一、线性预测

1、基本概念

线性预测(a*x=b)

/a b c\ /A\/ d \|b c d| X | B | = | e |\c d e/ \C/\ f /

2、numpy进行预测的函数

numpy.linalg.lstsq(a, b)

需要预测的就是x

3、价格预测案例

import datetime as dtimport numpy as npimport matplotlib.pylab as mpimport matplotlib.dates as mdimport pandas as pd # 日期计算def dmy2ymd(dmy):dmy = str(dmy, encoding='utf-8') # 转码dmy日期date = dt.datetime.strptime(dmy, '%d-%m-%Y').date() # 获取时间对象ymd = date.strftime('%Y-%m-%d')return ymddates, closing_prices = np.loadtxt('0=数据源/beer_price.csv', delimiter=',',usecols=(0, 4), unpack=True,dtype=np.dtype('M8[D], f8'),converters={0: dmy2ymd})'''收盘价格预测'''N = 5 # 最开始是数组是2*N个,# 初始化预测价格pred_prices = np.zeros(closing_prices.size - 2*N + 1) # 2*N是表示无法预测的# 给预测价格数组填入职for i in range(pred_prices.size):a = np.zeros((N, N)) # 初始化N*N的矩阵# a[0, ] = closing_prices[0: 5] # a的第0行,对应收盘价的0到5个元素# a[1, ] = closing_prices[1: 6]# a[2, ] = closing_prices[2: 7]# 得到a矩阵:用循环表示以上的效果for j in range(N):a[j, ] = closing_prices[i+j: i+j+N] # +i表示跟上起点位置# 得到b向量b = closing_prices[i+N: i+N*2]x = np.linalg.lstsq(a, b)[0] # 第0个值才是解方程的根pred_prices[i] = b.dot(x) # b点乘x# 检验计算# print(a.dot(x), b) # a点乘x就是b# 曲线图基础设置mp.figure('Stock Price Prediction', facecolor='lightgray')mp.title('Stock Price Prediction', fontsize=20)mp.xlabel('Date', fontsize=14)mp.ylabel('Price', fontsize=14)# 主刻度设置为以周一为起始的星期格式ax = mp.gca() # 获取刻度线(坐标轴)ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))# 次刻度设置为以天为单位ax.xaxis.set_minor_locator(md.DayLocator())# 主刻度的格式化ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))mp.tick_params(labelsize=10) # 字体mp.grid(linestyle=':') # 网格线# 绘制曲线dates = dates.astype(md.datetime.datetime) # 将日期标准化成numpy的日期mp.plot(dates, closing_prices, 'o-', c='lightgray', label="Closing Price") # 绘制曲线# 新增一个日期:计算两个时间点的距离dates = np.append(dates, dates[-1] + pd.tseries.offsets.BDay()) # 在dates后面加上后面这个新的日期# 绘制预测的股价,起点是N*2,o-表示点图mp.plot(dates[N*2: ], pred_prices, 'o-', c='orangered', label='Predicted Price')# 打印预测价格# print(pred_prices)mp.legend() # 显示图例mp.gcf().autofmt_xdate() # 设置格式展示的自动化调整mp.show() # 显示图像

csv数据:

![1

4、测试效果

二、线性拟合

1、基本概念

kx1 + b = y1kx2 + b = y2...kxn + b = yn

/ x1 \ / k \ / y1 \| x2 | x | b | = | y2 ||... | \ / |... |\ xn / \ yn /a xb

2、numpy的对应函数

x = np.linalg.lstsq(a, b)

3、统计学知识

趋势点:设定的某几项数据的平均值(此处为最高价、最低价与收盘价的平均值)压力点:趋势点+每天的幅度支撑点:趋势点-每天的幅度计算趋势线:日期乘斜率+截距

4、线性拟合趋势图案例

import datetime as dtimport numpy as npimport matplotlib.pylab as mpimport matplotlib.dates as md# 转换时间格式def dmy2ymd(dmy):dmy = str(dmy, encoding='utf-8')# 利用python能够解析日-月-年的时间格式,来解析成时间信息,再转化成年-月-日的numpy时间格式date = dt.datetime.strptime(dmy, '%d-%m-%Y').date() # 得到日期子对象ymd = date.strftime('%Y-%m-%d') # 将时间信息格式化成字符串return ymd# 解包取出:时间,开盘价,最高价,最低价,收盘价dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt('0=数据源/beer_price.csv', delimiter=',',usecols=(0, 1, 2, 3, 4), unpack=True,dtype='M8[D], f8, f8, f8, f8',converters = {0:dmy2ymd})# M是numpy 的时间数据类型,[]表示精度,D是日,以日为单位的时间# 由于数据内时间格式是日-月-年,需要用converter转化成年月日# {0:dmy2ymd}表示将第0列的数据全部用dmy2ymd执行一遍# print(opening_prices)# 得到b向量(趋势点):将趋势点定位最高价、最低价和收盘价的平均值,不管开盘价trend_points = (highest_prices + lowest_prices + closing_prices) / 3 # 每天三个价格平均值的数组# 每天的幅度spreads = highest_prices - lowest_prices# 压力点:趋势点+每天的幅度resistance_points = trend_points + spreads# 支撑点:趋势点-每天的幅度support_points = trend_points - spreads# 日期类型转换:将日期换成以天为单位,直接用intdays = dates.astype(int)# 得到a矩阵:将天数与全是1的矩阵按列组合在一起a = np.column_stack((days, np.ones_like(days))) # ones_like得到一个全是1的矩阵,矩阵格式与days相等# 计算趋势线:日期乘斜率+截距x1 = np.linalg.lstsq(a, trend_points)[0]trend_line = days * x1[0] + x1[1]# 计算压力线:x2 = np.linalg.lstsq(a, resistance_points)[0]resistance_line = days * x2[0] + x2[1]# 计算支撑线:x3 = np.linalg.lstsq(a, support_points)[0]support_line = days * x3[0] + x3[1]# 图像基本参数mp.figure('Trend', facecolor='lightgray')mp.title('Trend', fontsize=20)mp.xlabel('Date', fontsize=14) # 横轴、纵轴的标签mp.ylabel('Price', fontsize=14)# 坐标轴设置ax = mp.gca() # 获取坐标轴# 设置主、副刻度定位器ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO) # 星期定位器,MO(Monday)表示以星期一作为主刻度定位)ax.xaxis.set_minor_locator(md.DayLocator() # 日定位器)# 日期的格式ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))mp.tick_params(labelsize=10) # 设置标签所用的字体mp.grid(linestyle=':') # 网格线# 将日期转换成matplotlib.dates(md)的类型dates = dates.astype(md.datetime.datetime)# 获取价格差:数组相减再做判断等于一个装满布尔值的数组rise = closing_prices - opening_prices >= 0.01 # 上涨fall = opening_prices - closing_prices >= 0.01 # 下跌# 确定每根K线的颜色# 初始化颜色数组为0,个数为dates的个数,颜色数据格式是3个floatfc = np.zeros(dates.size, dtype='3f4') # 填充色ec = np.zeros(dates.size, dtype='3f4') # 边框色fc[rise], fc[fall] = (1, 1, 1), (0.85, 0.85, 0.85)# 将fc中为真的(上涨)设置颜色为(1, 1, 1)白色,下跌的设置为(0, 0.5, 0)绿色ec[rise], ec[fall] = (0.85, 0.85, 0.85), (0.85, 0.85, 0.85)# 画引线:矩形条mp.bar(dates, highest_prices-lowest_prices, 0, lowest_prices, color=fc, edgecolor=ec)# 纵坐标是最高价-最低价(数组),0表示矩形条宽度(最窄),1表示最宽;# 起点位以最低价为起点,边框颜色是ecmp.bar(dates, closing_prices-highest_prices, 0.8, opening_prices, color=fc, edgecolor=ec)# 绘制趋势线:将这些趋势点(最高、最低、收盘)用点一个个小蓝点表示出来mp.scatter(dates, trend_points, c="dodgerblue", alpha=0.5, s=60, zorder=2) # 点mp.plot(dates, trend_line, c="dodgerblue", linewidth=3, label="Trend") # 线# 绘制压力线mp.scatter(dates, resistance_points, c="limegreen", alpha=0.5, s=30, zorder=2) # 点mp.plot(dates, resistance_line, c="limegreen", linewidth=1.5, label="Resistance") # 线# 绘制支撑线mp.scatter(dates, support_points, c="orangered", alpha=0.5, s=30, zorder=2) # 点mp.plot(dates, support_line, c="orangered", linewidth=1.5, label="Support") # 线# 自动格式化水平方向的日期mp.gcf().autofmt_xdate()mp.legend()mp.show()

csv数据:

5、测试效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。