摘要:本文针对重庆市商品房价格预测问题,介绍了GM(1,1)模型基本原理,利用Python程序设工具,建立GM(1,1)灰色预测模型并进行预测,得到未来三年的预测价格并进行模型评价,从而为购房者提供决策。
关键词:GM(1,1)、重庆、商品房、销售价格、预测
@[TOC]
一、 引言
我国的房地产市场已进入快速发展时期,如何采取有效的措施对商品房价格进行价格引导,减少或消除价格偏离导致的不利影响,是事关我国房地产行业可持续发展的一个重要课题。因此,对商品房销售价格的合理分析和准确预测成为当务之急。
重庆由于其独特的背景在全国各地的房价中处于“低价格”水平,在选择对象中具有研究价值,选取灰色 GM(1,1)模型对重庆市区 2021、2022、2023 年商品房价格进行预测分析,并拟合2012-2020年房价数据进行对比,测算其相对误差。
二、GM(1,1)模型基本原理
灰色系统理论由我国学者邓聚龙等于 20 世纪 80 年代提出, 灰色系统是指相对于一定的认识层次,系统内部的信息部分已知, 部分未知, 即信息不完全的系统。
灰色系统理论认为, 由于各种环境因素对系统的影响, 使得表现系统行为特征的离散数据呈现出离乱, 但是这一无规的离散序列是潜在的有规序列的一种表现, 系统总是有其整体功能, 也就必然蕴含着某种内在规律。因而任何随机过程都可看作是在一定时空区域变化的灰色过程, 随机量可看作是灰色量, 通过生成变换可将无规序列变成有规序列。
GM(1,1)模型的基本原理是基于原始数据逐步变化特性,在数据处理过程中,对原始数列进行累加生成,能够生成具有指数增长规律的数列,通过建立一阶微分方程并对数据进行累减生成,即可得到预测数据。
2.1、模型的建立方法
(1)累加生成
将原始数列作为随机数列做一次累加,得到累加生成序列$x_{i}^{(1)}(i=0,1,2,…n)$ 并且满足指数增长规律,因此,$x_{i}^{(1)}(i=0,1,2,…n)$ 满足一阶线性微分方程:
$$
frac{mathrm{d} X^{(1)}}{mathrm{d}t}+aX^{(1)}=u
$$
其中,$t$ 代表时间,$X^{(1)}$是时间的函数。
(2)参数估计
$a$ 为待辨识参数,亦称发展系数,利用最小二乘法求解其近似值。计$u$ 为灰作用量,即待辨识内生变量,则:
$$
hat{a}=(B^{T}B)^{-1}B^{T}y_{n}=binom{a}{u}
$$
然后,将近似值代入原微分方程进行求解。其中:
$$
B=begin{pmatrix}
-frac{1}{2}(x_{1}^{(1)}+x_{2}^{(1)}) & 1 \
-frac{1}{2}(x_{2}^{(1)}+x_{3}^{(1)})& 1 \
: & :\
-frac{1}{2}(x_{n-1}^{(1)}+x_{n}^{(1)}) & 1\
end{pmatrix}
$$
$$
y_{n}=begin{bmatrix}
x_{2}^{(0)}\
x_{3}^{(0)}\
:\
x_{n}^{(0)}\
end{bmatrix}
$$
(3)求解模型
对原微分方程求解,可以得到离散时间响应函数,原微分方程的近似解为:
$$
X_{i+1}^{(1)}=[X_{i}^{(0)}-frac{u}{a}]e^{-ai}+frac{u}{a}
$$
(4)模型预测
若检验合格,则可以用模型进行预测。
计算出:
$$
X_{i+1}^{(2)}=X_{i+1}^{(1)}-X_{i}^{(1)},X_{i+2}^{(2)}=X_{i+2}^{(1)}-X_{i+1}^{(1)},…
$$
即得到$X_{i+1}^{(0)},X_{i+2}^{(0)},…$的预测值。
2.2、模型基本特点
灰色系统理论核心和基础的灰色模型(GreyMode1), 简称 GM 模型, 概括而言具有以下 3 个特点:
(1)建模所需信息较少, 通常只要有 4 个以上数据即可建模;
(2)不必知道原始数据分布的先验特征, 对无规或不服从任何分布的任意光滑离散的原始序列, 通过有限次的生成即可转化成为有规序列;
(3)建模的精度较高, 可保持原系统的特征, 能较好地反映系统的实际状况。
本文选用灰色 GM(1,1)模型,并借助Python程序设计,使得对重庆房价进行预测研究具有可行性。
三、房价预测模型的建立
3.1、原始数据的获取
重庆市区为四个直辖市之一,吸引着各地的眼光,外来人口不断增加,房地产行业也不断发展,如何更好的掌握商品房销售价格增长规律,对城市的发展至关重要。以重庆市区 2012-2020 年商品房销售价格为例,对模型的灵敏性进行检验,通过“安居客”平台统计资料可查得相关数据。通过Python程序设计计算GM(1,1)参数并进行拟合预测,代码见附录一。
3.2、模型的应用
根据灰色预测模型构建原理可得原始数据为:
$[ 6550, 6896, 6718, 6289, 7493,9925,12080,11187,11275]^{T}$
对原始数列进行累加,生成累加生成序列为:
$[6550, 13446, 20164, 26453, 33946, 43871, 55951, 67138, 78413]^{T}$
可求得参数B 矩阵:
$$
B = begin{bmatrix}
-9.99800e+03 & 1\
-1.68050e+04 & 1\
-2.33085e+04& 1\
-3.01995e+04& 1\
-3.89085e+04 & 1\
-4.99110e+04 & 1\
-6.15445e+04 & 1\
-7.27755e+04 & 1
end{bmatrix}
$$
$y$矩阵为:
$$ y= [6896,6718, 6289, 7493, 9925,12080,11187,11275]^{T}$$
将以上参数带入公式 GM(1,1)求解,最小二乘估计参数为:
$a$ = -0.09682929,$b$ =4549.89922748 ,$b/a$ = -46988.87347486
将求解的 $a$、$b$ 数值带入公式,可以得到 GM(1,1)模型的函数式将 2012-2020 年原始数据带入公式,即可求得相对应的预测值。
3.3、房价预测及评价
模型通过对房价进行预测,求得 2021-2023 年重庆市区商品房销售价格预测值,以及2012-2020 年的拟合值以及相对误差。
年份 | 2021 | 2022 | 2023 |
预测价格 | 13494 | 14849 | 16341 |
年份 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 |
实际价格 | 6550 | 6896 | 6718 | 6289 | 7493 | 9925 | 12080 | 11187 | 11275 |
拟合价格 | 6550 | 6275 | 6905 | 7599 | 8362 | 9202 | 10126 | 11143 | 12262 |
相对误差 | —— | -9.01% | 2.78% | 20.82% | 11.60% | -7.29% | -16.18% | -0.39% | 8.76% |
四、结论
(1)求得 2021、2022、2023 年的预测值
(2)从上述对于 2012-2020 年的拟合值中可以发现,其拟合值并不等于真实值,且相对误差有一定波动,模型效果一般。
(3)针对上述(2)尚需改进的地方在于对拟合结果进行检验,判断GM(1,1)模型在本 问题研究中拟合效果的优良程度。
参考文献
[1]赵泰,迟建英.灰色 GM(1,1)模型在商品房销售价格预测中的应用[J].价值工程,2019.23(35):76—77
[2]王全意. 重庆直辖以来城乡居民收入差距变化趋势预测[J].重庆理工大学学报(社会学科),2011,25(1):45—50
附录一
#项目:实现GM(1,1)模型,求解参数及预测拟合。
#author:AdamCY888
import numpy as np
from math import e
m = 0
x0 = [ 6550, 6896, 6718, 6289, 7493,9925,12080,11187,11275]##2012-2020 年数据
x1 = list()
b = list()
for i in x0:
m += i
x1.append(m) ## x1 为 x0 的一次累加向量
for i in range(len(x0)-1):
b.append(list((-0.5*(x1[i]+x1[i+1]),1)))
B = np.mat(b) ##高维列表转换为矩阵
Y = np.transpose(np.mat(x0[1:]))
a = np.dot(np.dot(np.linalg.inv(np.dot(np.transpose(B),B)),np.transpose(B)),Y)
z = a[1]/a[0]
print("一次累加序列矩阵为:n",x1)
print("B 矩阵为:n",B)
print("Y 矩阵为:n",Y)
print("最小二乘估计参数为:n",a)
print("a = %s,b = %s"%(a[0],a[1]))
print("b/a = %sn"%z)
mmm = list()
for i in range(len(x0)+2):
A = (1-pow(e,float(a[0]))) * (x0[0] - z)*pow(e,-(float(a[0]))*(i+1) )
mmm.append(A)
print("%d 年的拟合值为%s" %(2013+i,A))
for i in range(len(x0)-1):
AA = 100*abs(x0[i+1] - mmm[i])/x0[i+1]
print("%d 年相对误差为:%s"%(2013+i,AA))
本文由mdnice多平台发布
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net