欢迎大家来到IT世界,在知识的湖畔探索吧!
多项式回归模型是一种线性回归模型的扩展,它通过将自变量的多项式函数作为新的特征来拟合数据。在多项式回归中,我们假设因变量与自变量之间存在非线性关系,通过添加自变量的高次幂项来捕捉这种关系。
多项式回归模型的优点是可以捕捉自变量和因变量之间的复杂非线性关系,并且可以通过增加多项式的次数来提高模型的拟合能力。但是,多项式回归模型也存在一些缺点,例如容易出现过拟合现象,特别是当多项式的次数过高时。
程序主要对股票数据进行处理,并利用多项式回归模型进行预测和模型效果评估。
- 数据读取与预处理:从文件中读取股票数据,对数据按索引排序,创建新列 “y”(为 “close” 列后移一位)并填充缺失值。
- 数据划分:将数据按时间区间切割为训练集和测试集。
- 模型准备:提取训练集和测试集的特征与标签,设置线性回归模型,并对特征数据进行二次多项式转换。
- 模型训练与预测:使用转换后的训练数据训练线性回归模型,并用该模型对测试集数据进行预测,将预测结果存入测试集的 “y2” 列,同时绘制真实值 “y” 与预测值 “y2” 的折线图。
- 模型评估:调用自定义函数分别按 5% 和 1% 的精度评估模型预测效果,输出相应的准确率,以此判断模型的性能。
import sys; # 将 "topqt/" 目录添加到 Python 的模块搜索路径,以便后续导入该目录下的模块 sys.path.append("topqt/") # import pandas as pd # 导入pandas库,用于数据处理和分析 import plotly as py # 导入plotly库,用于数据可视化 import plotly.graph_objs as go # 导入plotly的绘图对象模块 import plotly.figure_factory as pyff # 导入plotly的图形工厂模块 # import sklearn # 导入sklearn库,提供机器学习相关工具 from sklearn import datasets, linear_model # 从sklearn导入数据集和线性模型模块 from sklearn.preprocessing import PolynomialFeatures # 导入多项式特征生成模块 from sklearn.linear_model import LinearRegression # 从线性模型模块导入线性回归类 from sklearn import metrics # 导入评估指标模块 from sklearn.model_selection import cross_val_predict # 导入交叉验证预测函数 from sklearn.model_selection import train_test_split # 导入数据集划分函数 # import zsys # 导入自定义模块zsys import ztools as zt # 导入自定义模块ztools并别名为zt import ztools_str as zstr # 导入自定义模块ztools_str并别名为zstr import ztools_web as zweb # 导入自定义模块ztools_web并别名为zweb import ztools_data as zdat # 导入自定义模块ztools_data并别名为zdat import ztools_draw as zdr # 导入自定义模块ztools_draw并别名为zdr import ztools_ai as zai # 导入自定义模块ztools_ai并别名为zai import zpd_talib as zta # 导入自定义模块zpd_talib并别名为zta # #----------------------- #----------------------- #1 # 打印提示信息,表示开始读取数据 print('#1,rd data') # 定义数据文件路径 fss='data/sh2018.csv' # 使用pandas读取数据文件,将第一列作为索引 xdf=pd.read_csv(fss,index_col=0) # 对数据按索引进行排序 xdf=xdf.sort_index() # 调用自定义函数prDF打印xdf的基本信息 zt.prDF('xdf',xdf) #2 # 打印提示信息,表示开始处理数据 print('#2,xed data') # 创建一个新列 'y',其值为 'close' 列向后移动一位的数据 xdf['y']=xdf['close'].shift(-1) # 调用自定义函数prDF打印处理后xdf的基本信息 zt.prDF('xdf#2.1',xdf) # 使用前向填充的方法填充数据中的缺失值 xdf.fillna(method='pad',inplace=True) # 调用自定义函数prDF打印填充缺失值后xdf的基本信息 zt.prDF('xdf#2.2',xdf) #3.1 # 打印提示信息,表示开始切割数据 print('#3,cut data') # 定义时间区间的起始时间和结束时间 tim0str,tim9str='2010-10-10','2017-12-31' # 调用自定义函数df_kcut8tim按时间区间切割xdf数据,得到训练集 df_train=zdat.df_kcut8tim(xdf,'',tim0str,tim9str) # 调用自定义函数prDF打印训练集df_train的基本信息 zt.prDF('#3.1 df_train\n',df_train) # #3.2 # 从xdf中选取索引大于'2018'的数据作为测试集 df_test=xdf[xdf.index>'2018'] #.tail(100) # 调用自定义函数prDF打印测试集df_test的基本信息 zt.prDF('#3.2 df_test\n',df_test) #----------------------- #4 # 打印提示信息,表示准备AI数据 print('#4,准备AI数据') # 定义特征列名列表 clst=['open','high','low','close'] # 从训练集中提取特征数据并转换为numpy数组 x0=df_train[clst].values # 从训练集中提取标签数据并转换为numpy数组 y=df_train['y'].values # # 从测试集中提取特征数据并转换为numpy数组 xtst0=df_test[clst].values #5 # 打印提示信息,表示设置模型 print('#5,模型设置') # 创建一个线性回归模型对象 mx = linear_model.LinearRegression() # 5.b # 打印提示信息,表示进行多项式参数变换 print('#5,多项式参数变换') # 创建多项式特征对象,degree=2表示生成二次多项式特征,include_bias=False表示不包含常数项 poly = PolynomialFeatures(degree=2,include_bias=False) # 对训练集特征数据进行多项式转换 x = poly.fit_transform(x0) # 对测试集特征数据进行多项式转换 xtst = poly.fit_transform(xtst0) #6 # 打印提示信息,表示训练模型 print('#6,fit训练模型') # 使用转换后的训练数据对线性回归模型进行训练 mx.fit(x,y) #7 # 打印提示信息,表示使用模型进行预测 print('#7,predict模型预测数据') # 使用训练好的模型对测试集的特征数据进行预测,并将结果存储在测试集的 'y2' 列中 df_test['y2']=mx.predict(xtst) # 调用自定义函数prDF打印测试集df_test的基本信息 zt.prDF('df',df_test) # 绘制测试集的 'y' 列和 'y2' 列数据的折线图 df_test[['y','y2']].plot() #print(predicted) #8.1 # 打印提示信息,表示验证模型预测效果 print('#8,验证模型预测效果') # 打印提示信息,表示按5%精度验证模型 print('\n#8.1,按5%精度验证模型') # 调用自定义函数ai_acc_xed2x评估模型预测结果,返回精度和相关数据 dacc,df=zai.ai_acc_xed2x(df_test['y'],df_test['y2'],5,True) # 打印模型精度 print('acc',dacc) #8.2 # 打印提示信息,表示按1%精度验证模型 print('\n#8.2,按1%精度验证模型') # 调用自定义函数ai_acc_xed2ext评估模型预测结果,返回精度、相关数据和列名列表 dacc,df,xlst=zai.ai_acc_xed2ext(df_test['y'],df_test['y2'],1,True) #----------------------- # 打印程序执行完成提示信息 print('\nok!') def ai_acc_xed2x(y_true,y_pred,ky0=5,fgDebug=False): ''' 效果评估函数,用于评估机器学习算法函数的效果。 输入: y_true,y_pred,pandas的Series数据列格式。 ky0,结果数据误差k值,默认是5,表示百分之五。 fgDebug,调试模式变量,默认为False。 返回: dacc,准确率,float格式 df,结果数据,pandas列表格式DataFrame ''' #1 # 创建空的DataFrame和初始化准确率 df,dacc=pd.DataFrame(),-1 #print('n,',len(y_true),len(y_pred)) # 如果真实值或预测值的长度为0,则返回初始值 if (len(y_true)==0) or (len(y_pred)==0): #print('n,',len(y_true),len(y_pred)) return dacc,df # # 获取真实值的数量 y_num=len(y_true) # 将真实值和预测值转换为pandas的Series并添加到DataFrame中 #df['y_true'],df['y_pred']=zdat.ds4x(y_true,df.index),zdat.ds4x(y_pred,df.index) df['y_true'],df['y_pred']=pd.Series(y_true),pd.Series(y_pred) # 计算真实值和预测值的绝对差值 df['y_diff']=np.abs(df.y_true-df.y_pred) #2 # 复制真实值列 df['y_true2']=df['y_true'] # 将真实值为0的替换为一个很小的值,防止除零错误 df.loc[df['y_true'] == 0, 'y_true2'] =0.00001 # 计算相对误差百分比 df['y_kdif']=df.y_diff/df.y_true2*100 #3 # 选取相对误差小于ky0的数据 dfk=df[df.y_kdif<ky0] # 获取符合条件的数据数量 knum=len(dfk['y_pred']) # 计算准确率 dacc=knum/y_num*100 # #5 # 保留三位小数 dacc=round(dacc,3) # 返回准确率和结果数据 return dacc,df
欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎大家来到IT世界,在知识的湖畔探索吧!runfile('D:/zwPython/zwrk/5_机器学习与量化/kb402_poly.py', wdir='D:/zwPython/zwrk/5_机器学习与量化') Reloaded modules: zsys, ztools, ztools_str, ztools_web, ztools_data, ztools_tq, zpd_talib, ztools_draw, ztools_ai #1,rd data xdf open high close low volume amount date 1994-01-03 837.70 840.65 833.90 831.66 1994-01-04 835.97 836.97 832.69 829.89 1994-01-05 829.30 847.05 846.98 823.10 1994-01-06 850.78 869.33 869.33 850.78 1994-01-07 875.18 883.99 879.64 873.01 1994-01-10 891.99 900.30 900.30 889.73 1994-01-11 903.54 907.09 891.79 884.00 1994-01-12 891.83 900.23 888.04 885.88 1994-01-13 889.02 899.14 897.46 888.80 1994-01-14 900.13 900.99 849.23 842.62 open high close low volume amount date 2018-05-11 3179.80 3180.76 3163.26 3162.21 6 2018-05-14 3167.04 3183.82 3174.03 3163.48 4 2018-05-15 3180.42 3192.81 3192.12 3164.52 0 2018-05-16 3180.23 3191.95 3169.56 3166.81 4 2018-05-17 3170.01 3172.77 3154.28 3148.62 5 2018-05-18 3151.08 3193.45 3193.30 3144.78 7 2018-05-21 3206.18 3219.74 3213.84 3203.34 5 2018-05-22 3211.25 3214.59 3214.35 3192.23 2 2018-05-23 3205.44 3205.44 3168.96 3168.96 5 2018-05-24 3167.94 3173.53 3154.65 3152.07 2 len-DF: 5931 #2,xed data xdf#2.1 open high close low volume amount y date 1994-01-03 837.70 840.65 833.90 831.66 832.69 1994-01-04 835.97 836.97 832.69 829.89 846.98 1994-01-05 829.30 847.05 846.98 823.10 869.33 1994-01-06 850.78 869.33 869.33 850.78 879.64 1994-01-07 875.18 883.99 879.64 873.01 900.30 1994-01-10 891.99 900.30 900.30 889.73 891.79 1994-01-11 903.54 907.09 891.79 884.00 888.04 1994-01-12 891.83 900.23 888.04 885.88 897.46 1994-01-13 889.02 899.14 897.46 888.80 849.23 1994-01-14 900.13 900.99 849.23 842.62 859.28 open high close ... volume amount y date ... 2018-05-11 3179.80 3180.76 3163.26 ... 6 3174.03 2018-05-14 3167.04 3183.82 3174.03 ... 4 3192.12 2018-05-15 3180.42 3192.81 3192.12 ... 0 3169.56 2018-05-16 3180.23 3191.95 3169.56 ... 4 3154.28 2018-05-17 3170.01 3172.77 3154.28 ... 5 3193.30 2018-05-18 3151.08 3193.45 3193.30 ... 7 3213.84 2018-05-21 3206.18 3219.74 3213.84 ... 5 3214.35 2018-05-22 3211.25 3214.59 3214.35 ... 2 3168.96 2018-05-23 3205.44 3205.44 3168.96 ... 5 3154.65 2018-05-24 3167.94 3173.53 3154.65 ... 2 NaN [10 rows x 7 columns] len-DF: 5931 xdf#2.2 open high close low volume amount y date 1994-01-03 837.70 840.65 833.90 831.66 832.69 1994-01-04 835.97 836.97 832.69 829.89 846.98 1994-01-05 829.30 847.05 846.98 823.10 869.33 1994-01-06 850.78 869.33 869.33 850.78 879.64 1994-01-07 875.18 883.99 879.64 873.01 900.30 1994-01-10 891.99 900.30 900.30 889.73 891.79 1994-01-11 903.54 907.09 891.79 884.00 888.04 1994-01-12 891.83 900.23 888.04 885.88 897.46 1994-01-13 889.02 899.14 897.46 888.80 849.23 1994-01-14 900.13 900.99 849.23 842.62 859.28 open high close ... volume amount y date ... 2018-05-11 3179.80 3180.76 3163.26 ... 6 3174.03 2018-05-14 3167.04 3183.82 3174.03 ... 4 3192.12 2018-05-15 3180.42 3192.81 3192.12 ... 0 3169.56 2018-05-16 3180.23 3191.95 3169.56 ... 4 3154.28 2018-05-17 3170.01 3172.77 3154.28 ... 5 3193.30 2018-05-18 3151.08 3193.45 3193.30 ... 7 3213.84 2018-05-21 3206.18 3219.74 3213.84 ... 5 3214.35 2018-05-22 3211.25 3214.59 3214.35 ... 2 3168.96 2018-05-23 3205.44 3205.44 3168.96 ... 5 3154.65 2018-05-24 3167.94 3173.53 3154.65 ... 2 3154.65 [10 rows x 7 columns] len-DF: 5931 #3,cut data #3.1 df_train open high close ... volume amount y date ... 2010-10-11 2755.03 2823.60 2806.94 ... 0 2841.41 2010-10-12 2795.76 2843.43 2841.41 ... 4 2861.36 2010-10-13 2842.14 2862.04 2861.36 ... 2 2879.64 2010-10-14 2881.55 2919.41 2879.64 ... 0 2971.16 2010-10-15 2863.74 2971.16 2971.16 ... 2 2955.23 2010-10-18 2985.46 3026.10 2955.23 ... 4 3001.85 2010-10-19 2949.63 3002.37 3001.85 ... 2 3003.95 2010-10-20 2947.51 3041.15 3003.95 ... 0 2983.53 2010-10-21 3009.22 3018.24 2983.53 ... 0 2975.04 2010-10-22 2976.75 2997.62 2975.04 ... 8 3051.42 [10 rows x 7 columns] open high close ... volume amount y date ... 2017-12-18 3268.03 3280.54 3267.92 ... 4 3296.54 2017-12-19 3266.02 3296.94 3296.54 ... 1 3287.61 2017-12-20 3296.74 3300.21 3287.61 ... 3 3300.06 2017-12-21 3281.12 3309.22 3300.06 ... 2 3297.06 2017-12-22 3297.68 3307.33 3297.06 ... 7 3280.46 2017-12-25 3296.21 3312.30 3280.46 ... 4 3306.12 2017-12-26 3277.84 3307.30 3306.12 ... 6 3275.78 2017-12-27 3302.46 3307.08 3275.78 ... 6 3296.38 2017-12-28 3272.29 3304.10 3296.38 ... 4 3307.17 2017-12-29 3295.25 3308.22 3307.17 ... 9 3348.33 [10 rows x 7 columns] len-DF: 1762 #3.2 df_test open high close ... volume amount y date ... 2018-01-02 3314.03 3349.05 3348.33 ... 3 3369.11 2018-01-03 3347.74 3379.92 3369.11 ... 5 3385.71 2018-01-04 3371.00 3392.83 3385.71 ... 4 3391.75 2018-01-05 3386.46 3402.07 3391.75 ... 2 3409.48 2018-01-08 3391.55 3412.73 3409.48 ... 5 3413.90 2018-01-09 3406.11 3417.23 3413.90 ... 0 3421.83 2018-01-10 3414.11 3430.21 3421.83 ... 1 3425.34 2018-01-11 3415.58 3426.48 3425.34 ... 9 3428.94 2018-01-12 3423.88 3435.42 3428.94 ... 8 3410.49 2018-01-15 3428.95 3442.50 3410.49 ... 9 3436.59 [10 rows x 7 columns] open high close ... volume amount y date ... 2018-05-11 3179.80 3180.76 3163.26 ... 6 3174.03 2018-05-14 3167.04 3183.82 3174.03 ... 4 3192.12 2018-05-15 3180.42 3192.81 3192.12 ... 0 3169.56 2018-05-16 3180.23 3191.95 3169.56 ... 4 3154.28 2018-05-17 3170.01 3172.77 3154.28 ... 5 3193.30 2018-05-18 3151.08 3193.45 3193.30 ... 7 3213.84 2018-05-21 3206.18 3219.74 3213.84 ... 5 3214.35 2018-05-22 3211.25 3214.59 3214.35 ... 2 3168.96 2018-05-23 3205.44 3205.44 3168.96 ... 5 3154.65 2018-05-24 3167.94 3173.53 3154.65 ... 2 3154.65 [10 rows x 7 columns] len-DF: 94 #4,准备AI数据 #5,模型设置 #5,多项式参数变换 #6,fit训练模型 #7,predict模型预测数据 df open high close ... amount y y2 date ... 2018-01-02 3314.03 3349.05 3348.33 ... 3 3369.11 3355.06 2018-01-03 3347.74 3379.92 3369.11 ... 5 3385.71 3375.02 2018-01-04 3371.00 3392.83 3385.71 ... 4 3391.75 3388.83 2018-01-05 3386.46 3402.07 3391.75 ... 2 3409.48 3393.40 2018-01-08 3391.55 3412.73 3409.48 ... 5 3413.90 3412.31 2018-01-09 3406.11 3417.23 3413.90 ... 0 3421.83 3416.46 2018-01-10 3414.11 3430.21 3421.83 ... 1 3425.34 3421.36 2018-01-11 3415.58 3426.48 3425.34 ... 9 3428.94 3426.08 2018-01-12 3423.88 3435.42 3428.94 ... 8 3410.49 3430.31 2018-01-15 3428.95 3442.50 3410.49 ... 9 3436.59 3404.30 [10 rows x 8 columns] open high close ... amount y y2 date ... 2018-05-11 3179.80 3180.76 3163.26 ... 6 3174.03 3159.47 2018-05-14 3167.04 3183.82 3174.03 ... 4 3192.12 3176.61 2018-05-15 3180.42 3192.81 3192.12 ... 0 3169.56 3191.32 2018-05-16 3180.23 3191.95 3169.56 ... 4 3154.28 3168.14 2018-05-17 3170.01 3172.77 3154.28 ... 5 3193.30 3150.15 2018-05-18 3151.08 3193.45 3193.30 ... 7 3213.84 3197.51 2018-05-21 3206.18 3219.74 3213.84 ... 5 3214.35 3216.27 2018-05-22 3211.25 3214.59 3214.35 ... 2 3168.96 3212.24 2018-05-23 3205.44 3205.44 3168.96 ... 5 3154.65 3159.77 2018-05-24 3167.94 3173.53 3154.65 ... 2 3154.65 3151.90 [10 rows x 8 columns] len-DF: 94 #8,验证模型预测效果 #8.1,按5%精度验证模型 acc 100.0 #8.2,按1%精度验证模型 ky0=1; n_df9,94,n_dfk,70 acc: 74.47%; MSE:1094.09, MAE:23.99, RMSE:33.08, r2score:0.94, @ky0:1.00 ok!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/124773.html