最小二乘法预测沪牌202101价格

1. 背景

最近在拍沪牌,毫无经验,想着本也是做数据的,来个预测。从各大网站搜索沪牌近6个月最后30s的数据。

2. 原理

 

3. 代码

最小二乘法的算法:

def zuixiaoerchen(arrayY, picTitle):
    print(f"arrayY: {arrayY}")
    print(f"picTitle: {picTitle}")

    if len(arrayY) == 0:
        return [0, 0, 0]

    # 取得最大销量,作为纵坐标的峰值标准
    maxValue = max(arrayY)
    minValue = min(arrayY)

    # 设置横坐标和纵坐标的值
    # def arange(start=None, stop=None, step=None, dtype=None)
    x = numpy.arange(1, len(arrayY) + 1, 1)
 
    # def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
    y = numpy.array(arrayY)

    # 第1個拟合,设置自由度為1 : (y = ax + b)
    z = numpy.polyfit(x, y, 1)
    # z: [  0.46428571  13.35238095]
    print(f"z: {z}")

    # 生成的多項式對象(y = ax + b)
    p = numpy.poly1d(z)
    # p: -0.1448x + 13.23
    print(f"p: {p}")

    if z[0] > 0:

        # 绘制原曲线及 拟合后的曲线

        # 原曲线 , 设置颜色(蓝色)和标签
        pylab.plot(x, y, 'b^-', label='original sales growth')

        # 自由度为1的趋势曲线, 设置颜色(蓝色)和标签
        pylab.plot(x, p(x), 'gv--', label=f'y = {z[0]}x + {z[1]}')

        # 设置图表的title
        pylab.title(f"picTitle: {picTitle}")

        # 设置横坐标,纵坐标的范围 [xmin=0, xmax=16, ymin=0, ymax=30]
        pylab.axis([0, len(arrayY) + 1, minValue, maxValue + 1])
        pylab.legend()

        # 保存成图片,需要提前创建文件夹 Growth,程序不会自动创建
        pylab.savefig(f"Growth/{picTitle}.png", dpi=96)

        # 清除图表设置,以防止曲线多次累计
        # 如果不清除,那么在这个程序运行起见,多次调用这个函数时,会不断将之前的曲线累计到新图片中
        pylab.clf()

    return [z[0], z[1], maxValue]

 

由于大家都是最后出价的,因此算了下202006~202012最后10s的最小二乘系数。

 

系数在39和67之间  erchengyue = [39.0909090909,59.99999999,37.2727272727,62.7272727272,40.9090909090,57.2727272727,54.545454545454],差距较大。 无从预测下个月的增长趋势。

因此,我们给202006~202012系数又做了最小二乘算法。

预测202101的增长系数值为: y=1.590909091620068*8+43.89610389179887=56.62337662475941

预测202101的50s开始的增长值为y=56.62337662475941*11=622.8571428723536

因此推荐50s加价600.

 

以上,属于娱乐。

附实现过程:

1. 原数据。

 

 2. 数据处理

import pandas as pd

import numpy as np

hu=pd.read_excel('./hu.xlsx')

hu=hu.rename(columns={'年月':'month','时间':'time','价格':'price'})

##去除时间列后的空格  \xa0
def delSpace(x):
        x="".join(str(x).split())
        if(x=='11:29:60'):    
                x='11:30:00'
        return x
hu['time']=hu['time'].apply(delSpace)

##设置索引
hu=hu.set_index('month')

##将数据设置成可以行列显示的图标  时间为横坐标,价格为纵坐标
hup=hu.pivot_table(index='time',columns='month',values='price')

####生成公式和图标
##选取最后50s的数据 hup.loc['11:29:46':'11:30:00','2020-12-01']
 zuixiaoerchen(hup.loc['11:29:46':'11:30:00','2020-12-01'], "202012")

最后一步,就生成这个图像啦,得到的增长系数是54.54545454545161.

 

posted @ 2021-01-22 15:20  KJXY  阅读(177)  评论(0)    收藏  举报