zoukankan      html  css  js  c++  java
  • 线性拟合

    线性拟合

    线性拟合可以寻求与一组散点走向趋势规律相适应的线型表达式方程。

    有一组散点描述时间序列下的股价:

    [x1, y1], [x2, y2], [x3, y3], 
    ...
    [xn, yn]

    根据线型 y=kx + b 方程可得:

    kx1 + b = y1
    kx2 + b = y2
    kx3 + b = y3
    ...
    kxn + b = yn

    样本过多,每两组方程即可求得一组k与b的值。np.linalg.lstsq(a, b) 可以通过最小二乘法求出所有结果中拟合误差最小的k与b的值。

    案例:利用线型拟合画出股价的趋势线

    1. 绘制趋势线(趋势可以表示为最高价、最低价、收盘价的均值):

    #趋势线
    import numpy as np
    import matplotlib.pyplot as mp
    import datetime as dt
    import matplotlib.dates as md
    
    
    def dmy2ymd(dmy):
      """
      把日月年转年月日
      :param day:
      :return:
      """
      dmy = str(dmy, encoding='utf-8')
      t = dt.datetime.strptime(dmy, '%d-%m-%Y')
      s = t.date().strftime('%Y-%m-%d')
      return s
    
    
    dates, opening_prices, 
    highest_prices, lowest_prices, 
    closing_prices = 
      np.loadtxt('aapl.csv',
                 delimiter=',',
                 usecols=(1, 3, 4, 5, 6),
                 unpack=True,
                 dtype='M8[D],f8,f8,f8,f8',
                 converters={1: dmy2ymd})  # 日月年转年月日
    # print(dates)
    # 绘制收盘价的折现图
    mp.figure('APPL', facecolor='lightgray')
    mp.title('APPL', fontsize=18)
    mp.xlabel('Date', fontsize=14)
    mp.ylabel('Price', fontsize=14)
    mp.grid(linestyle=":")
    
    # 设置刻度定位器
    # 每周一一个主刻度,一天一个次刻度
    
    ax = mp.gca()
    ma_loc = md.WeekdayLocator(byweekday=md.MO)
    ax.xaxis.set_major_locator(ma_loc)
    ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
    ax.xaxis.set_minor_locator(md.DayLocator())
    # 修改dates的dtype为md.datetime.datetiem
    dates = dates.astype(md.datetime.datetime)
    mp.plot(dates, closing_prices,
            color='dodgerblue',
            linewidth=2,
            linestyle='--',
            alpha=0.2,
            label='APPL Closing Price')
    
    #整理每天的趋势价格,绘制趋势线
    trend_points = (highest_prices+lowest_prices+closing_prices)/3
    mp.scatter(dates,trend_points,s=70,color='orangered',label='tread polints')
    
    #整理A与B
    days = dates.astype('M8[D]').astype('i4')
    #让x与一组1进行列合并
    A = np.column_stack((days,np.ones(days.size)))
    B = trend_points
    x = np.linalg.lstsq(A,B)[0]
    #将日期带入线性模型,得到每天你的趋势价格
    trend_points = x[0]*days+x[1]
    mp.plot(dates,trend_points,color='red',label='tread line')
    
    
    mp.legend()
    mp.gcf().autofmt_xdate()
    mp.show()

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11465683.html
Copyright © 2011-2022 走看看