文章目录

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

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

一、线性预测

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 dt
import numpy as np
import matplotlib.pylab as mp
import matplotlib.dates as md
import 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 = y1
kx2 + b = y2
...
kxn + b = yn
/ x1 \    / k \    / y1 \
| x2  | x | b |  = | y2 |
|...  |   \   /    |... |
\ xn /             \ yn /a           x          b

2、numpy的对应函数
x = np.linalg.lstsq(a, b)

3、统计学知识

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

4、线性拟合趋势图案例

import datetime as dt
import numpy as np
import matplotlib.pylab as mp
import 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# 日期类型转换:将日期换成以天为单位,直接用int
days = 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个float
fc = 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表示最宽;
# 起点位以最低价为起点,边框颜色是ec
mp.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、测试效果

Python之数据分析(numpy线性模型、线性预测、线性拟合)相关推荐

  1. python输入数组并计算_利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  2. python散点图拟合曲线-【python常用图件绘制#01】线性拟合结果图

    一.功能介绍 输入:实测x.y数据 输出:必选:x.y散点图 必选:x.y线性拟合直线 可选:相关性.显著性分析结果显示1-1 1-2 二.代码2-1 import random from scipy ...

  3. 【Python】数据分析.numpy.矩阵乘法运算

    Python.numpy.矩阵乘法运算 声明:本文章转载于矩阵的乘法运算及Python实现 在讲矩阵相乘之前,我们先看一个生活中的例子. 假如猪肉.牛肉.鸡蛋的价格在一周内不发生变化,记录近三周内的价 ...

  4. python数据分析numpy_利用python进行数据分析-NumPy高级应用

    1.ndarray对象的内部机理 NumPy的ndarray提供了一种将同质化数据块解释为多维数组对象的方式,ndarray如此强大的部分原因是所有数组对象都是数据块的一个跨度视图. ndarray内 ...

  5. python数据分析 - numpy | ndarray数组 | numpy常用函数

    文章目录 数据分析 numpy概述 numpy历史 numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 ndarray数组对象的创 ...

  6. excel线性拟合的斜率_邵励治的机器学习 2 / 100 天:「简单线性回归」

    前言 好了,我们闲言碎语不多讲,下面开始 机器学习100天:第2天 的学习! 另外,如果看官老爷喜欢我的文章,还请点个赞的说! 这是对我的认真分享最好的鼓励! 知识储备环节 今天我们学习的内容是:&q ...

  7. 用python的numpy作线性拟合、多项式拟合、对数拟合

    转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法: 1.线性拟合-使用math import ...

  8. python数据分析之单因素分析(线性拟合)

    功能:线性拟合,单因素分析,对散点图进行线性拟合,并放大散点图的局部位置 输入:某个xlsx文件,包含'患者密度(人/10万人)'和'人口密度(人/平方千米)'两列 输出:对这两列数据进行线性拟合,绘 ...

  9. Python之数据分析(numpy中的多项式拟合)

    1.多项式拟合的概念 用一个无穷级数表示一个可微函数,任何可微的函数,总可以用一个N次多项式来近似,而比N次幂更高阶的部分可以作为无穷小量而被忽略不计. f(x) = p0x^n + p1x^n-1 ...

最新文章

  1. sql中的Tran和C#中的TransactionScope介绍
  2. HTML IFRAME 用法小总结
  3. 【LeetCode从零单排】No20.ValidParentheses
  4. pandas 或者字段值_pandas用法总结
  5. 基于python的打印进度条、计算用时
  6. Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)
  7. 226. Invert Binary Tree 翻转二叉树
  8. python识别图片指定位置文字_python批量识别图片指定区域文字内容
  9. RecyclerView onClick
  10. Brownie Slicing(二分枚举答案)
  11. 将MinimalLinux安装在U盘中
  12. ASP.NET 学习日志
  13. 分享四款H5怀旧小游戏魔塔+伏魔记+三国霸业+寻仙纪
  14. 怎样下载mysql5.5_如何下载5.5版的mysql
  15. 实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  16. 2012百度移动开发者大会汇报
  17. ppt快速美化四步法
  18. VMware虚拟机启动报错,无法执行64位操作
  19. 'javac'不是内部或外部命令,也不是可运行的程序或批处理文件.
  20. pvr与png的内存占用

热门文章

  1. H5 存储数据sessionStorage
  2. android 设置功能,NDK 使用入门  |  Android NDK  |  Android Developers
  3. 计算机网络实验五静态路由与RIP协议,实验锐捷实训8-1--配置静态路由和rip协议...
  4. Eclipse修改项目编码
  5. python非法的_在下列Python语句中非法的是________。
  6. 循环首次适应算法_数据结构与算法之2——排序问题
  7. php网上实训指导书,PHP网站开发技术-实训指导书2016吐血制作
  8. dense sift matlab,一个 Dense SIFT 算法的 matlab 实现 | 学步园
  9. wincc工程组态论文_基于WinCC软件的组态设计与实现
  10. ros如何订阅关节力矩信息_ROS中阶笔记(二):机器人系统设计—URDF机器人建模...