题目
行情数据拟合
已知有某量化交易行情数据,从中取出一些样本(样本数据为2维(x,y)),根据这些样本拟合出一条曲线y_pred=f(x),使得该曲线最能反映该行情数据的规律。数据Data以[x,y]形式存储。
1、 清洗并获得数据
2、 绘制已知样本的散点图和折线图
3、 拟合并计算R2和皮尔逊相关系数
输入:
原始数据Data
输出:
1、预测值y_pred
2、可视化数据和预测结果
3、R2和皮尔逊相关系数
注:相关系数为预测值和真实值的皮尔逊相关系数。
其他要求:
将图片、模型文件、源代码和可执行程序分别保存在src和bin目录下,打包提交。
可以使用numpy等,但是数据清洗、拟合算法、计算R2和相关系数要由自己实现。
回归方法不限。
解
看到题之后,虽然并没有实践过相关内容,但就是拟合一条曲线出来,应该也不是太难。按照题目要求一步一步来吧。
清洗并获得数据&绘制已知样本的散点图和折线图
原始数据是在word里面,复制出来存个list
里面,画出图来长这个样子:
看起来应该需要去掉一些噪声点,但是这方面没啥经验,直接skip了。。
拟合
直观想法就是,最后出来的肯定是一条曲线,所以肯定不是关于自变量的一次函数,形式应该是这样。
由于不让调用现成的库,所以只用到了numpy计算和matplotlib画图。整体划分为以下几个函数:
文件 | 功能 |
---|---|
dataset.py | 读入并处理数据,实现了画图和返回划分batch之后的数据的功能。 |
linear_reg.py | 虽然当时取名叫linear_reg,但它并不是线性回归,应该是多项式拟合。实现了前向传播、平方误差作为损失函数、反向传播、保存模型和读取模型的功能,以及训练和预测的函数。 |
utils.py | 两个评价指标,和相关系数 |
main.py | 没啥好说的,按题目要求的顺序,调用上面模块的主函数 |
因为SGD的效果不好,所以换了mini-batch GD,确实有效,画出来的曲线还是挺满意的哈哈
计算决定系数和皮尔逊相关系数
首先百度这两个指标的定义:
上面曲线计算出的指标如下:
: 0.7948669932793072 越接近1越好
: 0.8944591989384286 大于0成正相关
具体代码参见我的github仓库。
期间也尝试了numpy库自带的多项式拟合函数,会比自己写的要快,准备有时间看看源码,先立个flag。