题目

行情数据拟合

已知有某量化交易行情数据,从中取出一些样本(样本数据为2维(x,y)),根据这些样本拟合出一条曲线y_pred=f(x),使得该曲线最能反映该行情数据的规律。数据Data以[x,y]形式存储。

1、 清洗并获得数据

2、 绘制已知样本的散点图和折线图

3、 拟合并计算R2和皮尔逊相关系数

输入:

原始数据Data

输出:

1、预测值y_pred

2、可视化数据和预测结果

3、R2和皮尔逊相关系数

注:相关系数为预测值和真实值的皮尔逊相关系数。

其他要求:

  1. 将图片、模型文件、源代码和可执行程序分别保存在src和bin目录下,打包提交。

  2. 可以使用numpy等,但是数据清洗、拟合算法、计算R2和相关系数要由自己实现。

  3. 回归方法不限。

看到题之后,虽然并没有实践过相关内容,但就是拟合一条曲线出来,应该也不是太难。按照题目要求一步一步来吧。

清洗并获得数据&绘制已知样本的散点图和折线图

原始数据是在word里面,复制出来存个list里面,画出图来长这个样子:

原始数据散点图

原始数据折线图

看起来应该需要去掉一些噪声点,但是这方面没啥经验,直接skip了。。

拟合

直观想法就是,最后出来的肯定是一条曲线,所以肯定不是关于自变量的一次函数,形式应该是y=W0x0+W1x1+W2x2+...+Wnxny = W_0x^0+W_1x^1+W_2x^2+...+W_nx^n这样。

由于不让调用现成的库,所以只用到了numpy计算和matplotlib画图。整体划分为以下几个函数:

文件 功能
dataset.py 读入并处理数据,实现了画图和返回划分batch之后的数据的功能。
linear_reg.py 虽然当时取名叫linear_reg,但它并不是线性回归,应该是多项式拟合。实现了前向传播、平方误差作为损失函数、反向传播、保存模型和读取模型的功能,以及训练和预测的函数。
utils.py 两个评价指标,R2R^2和相关系数rr
main.py 没啥好说的,按题目要求的顺序,调用上面模块的主函数

因为SGD的效果不好,所以换了mini-batch GD,确实有效,画出来的曲线还是挺满意的哈哈

拟合曲线

计算决定系数R2R^2和皮尔逊相关系数rr

首先百度这两个指标的定义:

Cov(X,Y)=E[(XEX)(YEY)]r=Corr(X,Y)=Cov(X,Y)σxσy=E[(XEX)(YEY)]E[(XEX)]2E[(YEY)]2R2=1RSSTSS=1i(yiy^i)2i(yiyˉi)2Cov(X,Y)=E[(X−EX)(Y−EY)]\\ r=Corr(X,Y)= \frac{Cov(X,Y)}{\sigma_x·\sigma_y}=\frac{E[(X−EX)(Y−EY)]}{\sqrt{E[(X−EX)]^2}\sqrt{E[(Y−EY)]^2}}\\ R^2 = 1-\frac{RSS}{TSS} = 1-\frac{\sum_i{(y_i-\hat{y}_i)^2}}{\sum_i{(y_i-\bar{y}_i)^2}}

上面曲线计算出的指标如下:

R2R^2: 0.7948669932793072 越接近1越好
rr: 0.8944591989384286 大于0成正相关

具体代码参见我的github仓库

期间也尝试了numpy库自带的多项式拟合函数,会比自己写的要快,准备有时间看看源码,先立个flag。