一、基本思想

假设,在长期大量的消费支出记录中,每个月最终的消费金额,与这个月中,任意一天的消费金额存在着一定的关系。同时我们假设这个关系可以用多元回归和均值回归任意种方式来描述,记作:

  • 多元回归:

f m l r ( x 1 , x 2 , . . . , x n ) = ξ + ρ 1 x 1 + ρ 2 x 2 + . . . + ρ n x n ( n < 31 ) f_{mlr}(x_1,x_2,...,x_n) = \xi + \rho_1x_1 + \rho_2x_2 + ... + \rho_nx_n \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space (n<31) fmlr​(x1​,x2​,...,xn​)=ξ+ρ1​x1​+ρ2​x2​+...+ρn​xn​                     (n<31)

  • 均值回归:

f m r ( x 1 , x 2 , . . . , x n ) = T ∗ x 1 + x 2 + . . . + x n n ( T 表示当月天数, n < 31 ) f_{mr}(x_1,x_2,...,x_n) = T * \frac{x_1 + x_2 + ... + x_n}{n} \space\space\space\space\space (T表示当月天数,n<31) fmr​(x1​,x2​,...,xn​)=T∗nx1​+x2​+...+xn​​     (T表示当月天数,n<31)

接下来将对两种模型进行探究。

二、步骤

1、获取数据

我从一份网上的账目清单中获取了一份支出报告。其中包含近八年共5572条消费记录:

由于我们只需要研究一个月里面,每天的支出和月总支出的关系,所以我们把数据整理成下面的样式:

使用Excel的透视表功能可以完成上述转换。

对于上图,行索引为[年-月]组合,比如202101表示2021年1月份。每行的数据表示每天的实际支出,最特殊的是最后一个值,为当月的总支出。为了抵消通胀影响,我们只取最近四年的数据,月份取30天,空值替换为0。由此我们获得了由30个列向量组成的30*55日消费矩阵,以及一个单独的向量组成的1*55总金额矩阵。以下代称X矩阵和Y矩阵。

将这两个矩阵写入Matlab。

2、观察数据

刚拿到的数据可能存在脏数据,所以第一步一定是将离群值处理成一个合适的值,我们将处理后的列向量矩阵命名为x_zscore

    x_zscore = filloutliers(X, 'clip', 'mean'); % 离群值清洗,以均值的三倍为离群值,将离群值替换为均值% -- 在先期实验中,已通过对30个自变量与因变量共3288条数据的模拟,确定了不同参数对应的绝对值累计误差:% 'clip'       'mean'         98,674% 'center'     'mean'         286,966% 'clip'       'quartiles'    637,770% 'center'     'quartiles'    695,930% 'clip'       'median'       945,326% 'center'     'median'       1,358,290% 所以可得最好的离群值处理办法为'clip','mean'组合

处理完成之后,我们需要观察x_zscore 中的每个列向量,是否与Y存在着线性关系,所以我们做散点图:

 [m, ~] = size(X);for i = 1:LENGTHsubplot(5, 6, i), plot(x_zscore(:, i), Y, '+'), xlabel(i)end


从图中可以看出,大部分的天数与最终的消费金额是存在一定关系的,这就意味着我们可以进行下一步试探。

3、建立多元回归


3.1求参数向量

回顾一下多元线性回归公式:

f m l r ( x 1 , x 2 , . . . , x n ) = ξ + ρ 1 x 1 + ρ 2 x 2 + . . . + ρ n x n ( n < 31 ) f_{mlr}(x_1,x_2,...,x_n) = \xi + \rho_1x_1 + \rho_2x_2 + ... + \rho_nx_n \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space (n<31) fmlr​(x1​,x2​,...,xn​)=ξ+ρ1​x1​+ρ2​x2​+...+ρn​xn​                     (n<31)

我们需要求出每个自变量对应的参数。我们定义参数向量:

b ( n ) → = [ ξ ρ 1 ρ 2 . . . ρ n ] \overrightarrow{b_{\left(n\right)}} = \begin{bmatrix} \xi &\rho_1& \rho_2 &... &\rho_n \end{bmatrix} b(n)​ ​=[ξ​ρ1​​ρ2​​...​ρn​​]

受益于计算机技术的发展,我们可以使用计算机计算出公式里面的参数:

% 获取多元回归模型的所有参数
b = ones(30, 1);
for i = 1:30b(1:i + 1, i + 1) = funcx(i, x_zscore , Y);
end
b(:, 1) = [];function result = funcx(LENGTH, X, Y) % LENGTH表示给与的自变量个数,也就是给多少个天数作为预测的自变量x = [ones(m, 1), X(:, 1:LENGTH)];y = Y;[b, ~, ~, ~, ~] = regress(y, x);result = b;
end

最终输出的b是一个31*30列向量矩阵,我们称之为参数向量矩阵b。其中第n个参数向量(列向量)表示自变量个数为n时,所对应的回归系数:

b ( n ) → = [ ξ ρ 1 ρ 2 . . . ρ n ] \overrightarrow{b_{\left(n\right)}} = \begin{bmatrix} \xi &\rho_1& \rho_2 &... &\rho_n \end{bmatrix} b(n)​ ​=[ξ​ρ1​​ρ2​​...​ρn​​]

如果不方便理解请看下面的实际例子:

比如我们用2021年1月份的前三天来预测整个月份的开支:
2021年1月份的前三天,对应的自变量为:
X ( 202101 , 3 ) = [ 0.000 100.380 336.000 ] X_{(202101,3)} = \begin{bmatrix} 0.000& 100.380 &336.000 \end{bmatrix} X(202101,3)​=[0.000​100.380​336.000​]
对应的参数向量为:
b ( 3 ) → = [ 4615.743 5.455 − 0.893 1.049 ] \overrightarrow{b_{\left(3\right)}} = \begin{bmatrix} 4615.743 &5.455& -0.893 &1.049 \end{bmatrix} b(3)​ ​=[4615.743​5.455​−0.893​1.049​]
那么基于这三天所做出的预测就是
Y ( 202101 , 3 ) = 4615.743 + 5.455 ∗ 0.000 − 0.893 ∗ 100.380 + 1.049 ∗ 336.000 = 4878.568 Y_{(202101,3)} = 4615.743 +5.455 * 0.000 - 0.893 * 100.380 + 1.049 * 336.000 = 4878.568 Y(202101,3)​=4615.743+5.455∗0.000−0.893∗100.380+1.049∗336.000=4878.568

3.2 定义多元线性回归方程

有了上面的参数向量矩阵b,我们就可以定义一个用于预测的函数:

% 构建多元线性回归函数
% 输入自变量组成的行向量a 以及参数向量矩阵b,输出预测的总开支result:
% Example: MLR([100 200 300] ,b)function result = MLR(a, b)[~, LENGTH] = size(a);result = a * b(2:1 + LENGTH, LENGTH) + b(1, LENGTH);
end

4、建立均值回归


回顾一下均值回归:

f m r ( x 1 , x 2 , . . . , x n ) = T ∗ x 1 + x 2 + . . . + x n n ( T 表示当月天数, n < 31 ) f_{mr}(x_1,x_2,...,x_n) = T * \frac{x_1 + x_2 + ... + x_n}{n} \space\space\space\space\space (T表示当月天数,n<31) fmr​(x1​,x2​,...,xn​)=T∗nx1​+x2​+...+xn​​     (T表示当月天数,n<31)

均值回归中,T 表示当月的天数。均值回归比较简单,我们可以直接根据公式得出均值回归方程:

% 构建均值回归函数
% 输入自变量组成的行向量a 以及天数 T,输出预测的总开支result:
% Example: MR([100 200 300] ,31)function result = MR(a, T)[~, LENGTH] = size(a);if LENGTH == 1result = (a / LENGTH) * T;elseresult = transpose((sum(transpose(a)) / LENGTH) * T);end
end

三、模型搭建

为了让预测模型更加精确,我们将采用两边结合的方法,将多元模型与均值回归有机的结合在一起,最终形成一个相对可靠的预测模型。

1、思路说明

对于上文的两个模型,其最大的问题在于其精准度与提供的自变量个数高度相关。我们需要将预测值与实际值之间的关系,按自变量的数量展开,以评估自变量数量对预测质量的影响。

2、相关系数评估

2.1 获取预测值向量矩阵

从提供1个变量开始,一直到提供30个变量,我们分别求出不同自变量个数下面,所获得的预测值

Predicted_BY_MLR = ones(55, 1);
Predicted_BY_MR = ones(55, 1); for i = 1:30Predicted_BY_MLR(:, i + 1) = MLR(X(:, 1:i), b);Predicted_BY_MR(:, i + 1) = MR(X(:, 1:i), 30);
endPredicted_BY_MLR(:, 1) = []; % 存储多元回归预测值
Predicted_BY_MR(:, 1) = []; % 存储均值回归预测值

2.2 获取相关系数矩阵

将每一组预测值与实际值做协方差,并求出对应的相关系数

Correlation_By_MLR = ones(1,30); % 存储多元回归相关系数
Correlation_By_MR = ones(1,30); % 存储均值回归相关系数for i = 1:30Cov_By_MLR = cov(Predicted_BY_MLR(:, i), Y);Cov_By_MR = cov(Predicted_BY_MR(:, i), Y);Correlation_By_MLR(i) = Cov_By_MLR(1, 2) / sqrt(Cov_By_MLR(1, 1) * Cov_By_MLR(2, 2));Correlation_By_MR(i) = Cov_By_MR(1, 2) / sqrt(Cov_By_MR(1, 1) * Cov_By_MR(2, 2));
end

2.3 绘图

% 绘图
x1_lab = 1:30;
x2_lab = 1:30;
plot(x1_lab,Correlation_By_MLR,'+',Color='red'),hold on,plot(x2_lab,Correlation_By_MR,'*',Color='blue')
% 红线表示多元回归,蓝线表示均值回归


从图上可以很明显的得出如下结论:

  • 1、提供的天数低于5天时,两个模型预测精度都不高
  • 2、在提供的天数没超过23天之前,多元回归会优于均值回归
  • 3、在提供的天数超过23天之后,均值回归会优于多元回归

2.4 模型构建

基于2.3的结论,实际上我们已经得出了一个比较合理的模型方法,如果自变量的个数小于23天,则采用多元回归,如果超过23天,则采用均值回归。具体的预测值可以使用上文中对应的回归函数进行计算。

四、模型应用

我们可以将上文中,多元回归模型所获得的参数以Json的形式保存下来,以方便使用。我们将以Javascripts为例,演示如何应用这个模型。

1、载入存储有多元回归 参数向量矩阵b 的Json。由于我把json存入了前端一个叫做TmpByJson的控件里,所以我的载入方法是这样:

 var TMP_BY_JSON = eval(TmpByJson.data)

2、获取自变量的个数 CURRENT_DATE_LENGTH 。由于我的自变量个数是由前端的两个日期参数currentDateSourceByStartcurrentDateSourceByEnd差额决定的,所以我的获取方法是这样的:

 var CURRENT_DATE_LENGTH = days360(param["currentDateSourceByStart"], param["currentDateSourceByEnd"], null) + 1;

3、建立求值的方法:

    if (CURRENT_DATE_LENGTH <= 23) {//根据多元回归预测月度花销(1-23天使用多元回归)var ExpenditureTrendData = getData("ExpenditureTrendChart", DATA); //ExpenditureTrendChart是我存储自变量的控件,是一个两列数组var subtotals = 0;var constant = TMP_BY_JSON[CURRENT_DATE_LENGTH - 1]["b"];for (i = 1; i <= CURRENT_DATE_LENGTH; i++) {subtotals = subtotals + ExpenditureTrendData.get(i, 1) * TMP_BY_JSON[CURRENT_DATE_LENGTH - 1]['x' + i];};MonthlyExpenditureForecast.data = subtotals + constant; //MonthlyExpenditureForecast是用来存储预测结果的控件} else {//根据累计均值回归预测月度花销(超过23天使用累计均值回归)MonthlyExpenditureForecast.data = AveAmountByEveryDay.data * day(eomonth(param["currentDateSourceByStart"], 0))}

范例:
比如我输入的时间段是xxxx-06-01到xxxx-06-27,这里一共是27天,对应的支出分别是[xxx,xxx,xxx,…,xxx],则利用上文模型即可得出对应的预测值,效果如下。

结合多元回归和累计均值回归建立日常支出预测模型相关推荐

  1. python数据分析及可视化(十七)聚宽(双均线分析、因子选股策略、多因子选股策略、均值回归理论、布林带策略、PEG策略、权重收益策略)

    聚宽 聚宽是一个做金融量化的网站,https://www.joinquant.com,登录注册,如果你写的文章.策略被别人采纳,增加积分,积分用于免费的回测时长.在我的策略,进入策略列表,里面有做好的 ...

  2. 均值回归,逆市中的投资机会

    用IT技术玩金融系列文章,将介绍如何使用IT技术,处理金融大数据.在互联网混迹多年,已经熟练掌握一些IT技术.单纯地在互联网做开发,总觉得使劲的方式不对.要想靠技术养活自己,就要把技术变现.通过&qu ...

  3. 布林线均值回归(股票)——Python量化

    布林线均值回归策略 目录 布林线均值回归策略 1. 原理 2. 策略思路 3. 策略代码 4. 回测结果与稳健性分析 1. 原理 提起布林线均值回归策略,就不得不提布林带这个概念.布林带是利用统计学中 ...

  4. 布林线均值回归策略(股票)

    1. 原理 提起布林线均值回归策略,就不得不提布林带这个概念.布林带是利用统计学中的均值和标准差联合计算得出的,分为均线,上轨线和下轨线.布林线均值回归策略认为,标的价格在上轨线和下轨线围成的范围内浮 ...

  5. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  6. 计量经济学之回归分析学习笔记(均值回归、分位数回归、岭回归、Lasso回归、ENet回归)——基于R(一)

    [笔记前言] 最近在进行计量经济学的课程学习,本文对部分回归方法进行了整理,恳请大家对其中出现的错误进行指正,不胜感激. 此外,由于种种原因,在均值回归时,我们将涉及到模型建立后的后续检验,而在其他回 ...

  7. 【量化策略系列】股票均值回归策略之一——配对交易策略(Pairs Trading)

    本文持续更新中.最后更新时间:11/11/2019 文章目录 1. 往期文章回顾 2. 均值回归策略简介 3. 配对交易策略简介 4. 配对交易策略构建流程 5. 代码实现与回测结果 Python 代 ...

  8. USDCNY即期均值顺势信号——基于Python的均值回归进阶策略

    在聚宽注册了之后,发现这个宝藏网站提供了大量的入门策略的教学文章:动态情景多因子Alpha模型.双均线策略.多因子策略入门等等.这个网站主要是为股票的量化投资提供一个策略撰写.回测的平台.站内的量化课 ...

  9. 能源价格风险管理matlab源代码 经济物理学、电价、风险管理、均值回归

    能源价格风险管理matlab源代码,代码按照高水平文章复现,保证正确 电力价格的波动性远远大于其他通常以极端波动著称的价格. 由于电力不能经济地储存,终端用户的需求在很大程度上取决于天气,而电网的可靠 ...

最新文章

  1. 样式集(三)成功页面样式模板
  2. Jquery autocomplete插件
  3. NC命令行作为服务端、客户端以及win32 套接字程序的简单连接测试
  4. 创建xmlhttp对象
  5. ubunt11 安装mysql_ubuntu 11.10安装mysql
  6. 字符设备驱动基础篇3——字符设备驱动工作原理
  7. 如何高效地判断奇数和偶数
  8. 非阻塞 php,PHP异步非阻塞之路
  9. 如何用rake tasks 生成migration对应的sql
  10. 湖南城市学院计算机题库和答案,湖南城市学院 计算机选择题题库
  11. 2021-06-13list map set 并发问题
  12. 有无3C认证的电源价格差别说明什么?
  13. App测试如何进行?手机app测试要点
  14. 《经济学原理》——读书笔记(一)
  15. linux profile文件,全面解析Linux profile文件
  16. jsp如何跳转java_JSP的三种跳转方式
  17. Autovue 21.0.2.3 新功能介绍
  18. Python简单实现人脸识别检测, 对照片进行评分
  19. 分层化网络设计:核心层,汇聚层,接入层
  20. codeforces 1255 B. Fridge Lockers

热门文章

  1. React虚拟滚动介绍与实现
  2. 酷冷至尊masterkeys xt v2如何宏编程
  3. Android系统扫描音频文件详解
  4. Ubuntu文件系统类型
  5. teamviewer linux远程开机,一分钟就能学会用手机远程控制你的电脑,远程开关机就是这么简单...
  6. Mtlab中的小括号()、中括号[]、大括号{}的使用及区别
  7. 2019燕山大学程序设计新生赛(二) 谍战风云
  8. java 城市分词_Java中文分词hanlp使用
  9. Set接口之HashSet、使用增强型的for遍历Set
  10. 新基建下的AI+教育:教育虫洞是AI坍塌的终路