python matplotlib 绘制 线性拟合
csv文件下载地址:
链接: https://pan.baidu.com/s/1Jm4Z8wlskkloGYeeVNkOXg 提取码: p25v
"""
线性拟合 绘制趋势线
"""
import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md
# 方法-日期转换函数
def dmy2ymd(dmy):
dmy = str(dmy, encoding='utf-8')
time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
t = time.strftime('%Y-%m-%d')
return t
# 读取csv文件数据
dates, open_price, max_prices, min_prices, close_prices, volumes = np.loadtxt(
r".\aapl.csv",
delimiter=",",
usecols=(1, 3, 4, 5, 6, 7),
unpack=True,
dtype="M8[D], f8, f8, f8, f8, f8",
converters={1: dmy2ymd})
print(open_price)
# 设置绘图窗口
mp.figure("Apple K Line", facecolor="lightgray")
mp.title("Apple K Line", fontsize=16)
mp.xlabel("Data", fontsize=14)
mp.ylabel("Price", fontsize=14)
# x坐标(时间轴)轴修改
ax = mp.gca()
# 设置主刻度定位器为周定位器(每周一显示主刻度文本)
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
ax.xaxis.set_minor_locator(md.DayLocator())
mp.tick_params(labelsize=8)
mp.grid(linestyle=":")
# 绘制收盘价
dates = dates.astype(md.datetime.datetime)
mp.plot(dates, close_prices, color="b", linestyle="--",
linewidth=2, label="close", alpha=0.2)
# 求趋势价格
trend_prices = (max_prices + min_prices + close_prices) / 3
mp.scatter(dates, trend_prices, marker="o",
color="orangered", s=80, label="Trend Points")
# 绘制趋势线 整理 A 与 B
days = dates.astype("M8[D]").astype("int32")
print(days)
A = np.column_stack((days, np.ones_like(days)))
B = trend_prices
# 执行线性拟合
x = np.linalg.lstsq(A, B, rcond=None)[0]
# 求 拟合线 并绘制
# x[0] :K x[1]:b y = kx + b
trend_line = x[0] * days + x[1]
mp.plot(dates, trend_line, color="red", label="Trend line")
mp.legend()
mp.gcf().autofmt_xdate()
mp.show()