python应用(3)svm模型预测股票涨跌

最近接了一个私活,指导学妹完成毕业设计。核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置。

在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖掘工程师不仅技术要过关,还需要了解所要挖掘数据涉及到的领域的相关知识。举个例子,在做数据预处理的时候,不知道超额收益率是怎么个意思,查阅资料才了解,超额收益率是股票行业里的一个专有名词,指大于无风险投资的收益率,在我国无风险投资收益率即是银行定期存款。

也稍微打个小广告,简书上如果有需要做毕业设计的同学可以找我私聊哦。而且如果只是简单咨询一些技术问题,学长会很热心得解答。

废话少说,言归正传。这里有关SVM、PCA等等这些与项目相关的数学知识不会提及,我以后会在算法专题里详细描述。

本项目用pycharm + anaconda3.6开发,涉及到的第三方库有pandas,numpy,matplotlib,skllearn。

流程图

Quotation Flowchart.jpg

参数设置

class Para:method = 'SVM'                                              #模型选择为SVMmonth_in_sample = range(1,  7 + 1)              #训练集数据对应月份month_test = range(8, 12 + 1)                        #测试集数据对应月份percent_select = [0.3, 0.3]                              #正反例股票选取比例percent_cv = 0.1                                     #交互验证机占样本内数据比例path_data = 'C:/my python/python code/stock predict/Datas/Tests/Tests/'                         #输入数据文件路径path_result = 'C:/my python/python code/stock predict/Datas/Results/'                #输出数据文件路径seed = 42                         #random seed设置随机种子,制造伪随机数svm_kernel = 'linear'                            #支持向量机的核函数类型svm_c = 0.01                                       #线性支持向量机的惩罚系数
para = Para()

这个就是参数的初始化,没有什么要说的。

数据读取以及标记

#function: label data
#3数据标记
def label_data(data):data['return_bin'] = np.nan                                         #在data表格最后添加一列,并命名为return_bin,这一列将记录每个样本的标签data = data.sort_values(by = '超额收益', ascending = False)            #将整个表格按照return列的值降序排列n_stock_select = np.multiply(para.percent_select, data.shape[0])     #选取的股票个数n_stock_select = np.around(n_stock_select).astype(int)               #将上行所选取的股票个数取整,注意n_stock_select是个含有两个整数的列表data.iloc[0:n_stock_select[0],-1] = 1data.iloc[-n_stock_select[1]:, -1] = 0                               #这两行将表现好的股票标签置1,差的置0data = data.dropna(axis = 0)                                         #将没有1,0标签的,即不是最好的前百分之三十也不是最差的前百分之三十股票从表格里剔除return data#4数据读取
for i_month in para.month_in_sample:file_name = para.path_data + str(i_month) + '.csv'data_curr_month = pd.read_csv(file_name, header = 0)                 #header=0意思是将表格第一行作为列名para.n_stcok = data_curr_month.shape[0]data_curr_month = data_curr_month.dropna(axis = 0)                   #去除缺省值data_curr_month = label_data(data_curr_month)                        #将读入的数据进行标记if i_month == para.month_in_sample[0]:data_in_sample = data_curr_monthelse:data_in_sample = data_in_sample.append(data_curr_month)       
print('数据读取完成')#5数据预处理
X_in_sample = data_in_sample.loc[:,'货币资金(万元)':'应收分保账款(万元)']
y_in_sample = data_in_sample.loc[:,'return_bin']                       #从样本内数据中分别提取特征与标签因子
X_train,X_cv,y_train,y_cv = train_test_split(X_in_sample,y_in_sample,test_size=para.percent_cv, random_state=para.seed)#按照固定比例随机分配训练集与交叉验证集
pca = decomposition.PCA(n_components=0.95)
pca.fit(X_train)
X_train = pca.transform(X_train)
X_cv = pca.transform(X_cv)                                              #以上是关于主成分分析模型的代码
print('数据预处理完成')

代码的基本功能注释里也写了一些,不过不够全面,我再详细说一下。这三部分代码所实现的功能是读取数据,并对数据进行预处理。我已经把最原始的数据整理好放在了excel表格里,并且将第一个月的全部股票的参数放在一个excel里,并将其命名为1.csv,以此类推,我爬取了157个月的数据,总共有157个excel。因此代码里循环的便是excel的文件名,也就是依次读取excel文件。因为数据量太大,所以我一般调试的时候只跑12个月。所以我在参数初始化阶段,训练集(1,8),测试集(8,12)。
数据截面.png

将数据读取到DataFrame表格里后,并不是全部使用,而是取超额收益值最好的前百分之三十,以及最差的后百分之三十,并在表格后追加一列,列名叫return_bin,将最好最差的百分之三十的股票的return_bin列各赋值1,0。然后将每个读取并加工的excel表格拼接在一起形成一个大表格,从总抽取70个因子作为X_in_sample,抽取return_bin作为y_in_sample作为训练集。

训练模型

#6
print('选择模型')
if para.method == 'SVM':model = svm.SVC(kernel=para.svm_kernel, C=para.svm_c)
print('模型选择为SVM')#7用训练好的模型分别放到训练集和验证集上去预测,用来调参
print('模型开始训练')
if para.method == 'SVM':model.fit(X_train, y_train)y_pred_train = model.predict(X_train)y_score_train = model.decision_function(X_train)y_pred_cv = model.predict(X_cv)y_score_cv = model.decision_function(X_cv)
print('模型训练结束')

这个也比较好理解,就是选择sklearn库里的svm模块对数据进行训练。svm模型是集成封装好的,拿来用就可以。

模型预测与评价

#8使用训练完成的模型再测试集上做预测
print('模型预测开始')
y_true_test =  pd.DataFrame([np.nan] * np.ones((para.n_stcok, para.month_test[-1])))
y_pred_test =  pd.DataFrame([np.nan] * np.ones((para.n_stcok, para.month_test[-1])))
y_score_test = pd.DataFrame([np.nan] * np.ones((para.n_stcok, para.month_test[-1])))    #先对各种参数做一个初始化
print(y_true_test)
for i_month in para.month_test:                                                         #遍历测试集的每一个月份,每个月份都有上市的所有股票file_name = para.path_data + str(i_month) + '.csv'                                  #读取预测集上的数据data_curr_month = pd.read_csv(file_name, header=0)data_curr_month = data_curr_month.dropna(axis=0)X_curr_month = data_curr_month.loc[:,'货币资金(万元)':'应收分保账款(万元)']X_curr_month = pca.transform(X_curr_month)if para.method == 'SVM':y_pred_curr_month = model.predict(X_curr_month)y_score_curr_month = model.decision_function(X_curr_month)y_true_test.iloc[data_curr_month.index, i_month - 1] = data_curr_month['超额收益'][data_curr_month.index]y_pred_test.iloc[data_curr_month.index, i_month - 1] = y_pred_curr_monthy_score_test.iloc[data_curr_month.index, i_month - 1] = y_score_curr_month
print(y_true_test)
print('模型预测结束')#9模型评价
print('模型开始评价')
print('training set, accuracy = %.2f'%metrics.accuracy_score(y_train, y_pred_train))
print('training set, ACU = %.2f'%metrics.roc_auc_score(y_train, y_score_train))
print('cv set, accuracy = %.2f'%metrics.accuracy_score(y_cv, y_pred_cv))
print('cv set, ACU = %.2f'%metrics.roc_auc_score(y_cv, y_score_cv))
for i_month in para.month_test:y_true_curr_month = pd.DataFrame({'超额收益':y_true_test.iloc[:, i_month - 1]})y_pred_curr_month = y_pred_test.iloc[:,i_month - 1]y_score_curr_month = y_score_test.iloc[:,i_month - 1]y_true_curr_month = y_true_curr_month.dropna(axis=0)y_curr_month = label_data(y_true_curr_month)['return_bin']y_pred_curr_month = y_pred_curr_month[y_curr_month.index]y_score_curr_month = y_score_curr_month[y_curr_month.index]print('test set, month %d, accuracy = %.2f'%(i_month, metrics.accuracy_score(y_curr_month, y_pred_curr_month)))print('test set, month %d, AUC = %.2f'%(i_month, metrics.roc_auc_score(y_curr_month, y_score_curr_month)))
print('模型评价结束')

现在模型就训练好了,然后就那训练好的模型在测试集上来跑,看看情况到底如何。
模型评价.png
可以看到参数并不是多好,这是训练集上数据太少的原因。那我们来改动一下,把训练集改成(1,10),测试集改成(10,12)看看有没有改变。
模型评价2.png
训练集从只有6个月变成9个月(1-10在代码上体现为1-9),参数情况大有改观。可见数据对机器学习模型训练的重要性。

策略构建以及策略评价

#10策略构建
print('策略构建开始')
para.n_stcok_select = 3
strategy = pd.DataFrame({'return' : [0]*para.month_test[-1], 'value' : [1]*para.month_test[-1]}) #这并不是字典格式,而是表格格式,分别表示每月收益和每月净值,初始值为0和1
print(strategy)
for i_month in para.month_test:y_true_curr_month = y_true_test.iloc[:,i_month - 1]print(y_true_curr_month)y_score_curr_month = y_score_test.iloc[:,i_month - 1]y_score_curr_month = y_score_curr_month.sort_values(ascending=False)print(y_score_curr_month)index_select = y_score_curr_month[0:para.n_stcok_select].indexprint(index_select)strategy.loc[i_month-1, 'return'] = np.mean(y_true_curr_month[index_select])print(strategy)
strategy['value'] = (strategy['return'] + 1).cumprod()print('策略构建结束')#11策略评价
print('策略评价开始')
month_test = np.array(para.month_test)
month_test = month_test - 1
print(strategy.loc[month_test, 'value'])
plt.plot(month_test, strategy.loc[month_test, 'value'],'r-')
plt.show()ann_excess_return = np.mean(strategy.loc[month_test,'return']) * 12             #策略年化超额收益
print(ann_excess_return)
ann_excess_vol = np.std(strategy.loc[month_test,'return']) * np.sqrt(12)        #策略年化超额收益波动
info_ratio = ann_excess_return/ann_excess_vol                                    #数值越大策略越好
print('annual excess return = %.2f'%ann_excess_return)
print('annual excess volatility = %.2f'%ann_excess_vol)
print('information ratio = %.2f'%info_ratio)
print('以上为策略评价参数')print('策略评价结束')

所谓策略构建就是选择什么样的股票,代码里将股票按照超额收益率进行排序,然后我设置para.n_stcok_select = 3意思就是选择超额收益率前三名进行购买。

所谓策略评价这里采用的评价体系就是将选择的三支股票的每月超额收益率取平均值乘12,来作为这三只股票在该月的年化收益率。

Figure_1.png
Figure_2.png
以上两张图是选择不同月份做训练集后,模型策略的表现。

在这里还要提及的是这行代码,month_test = np.array(para.month_test)
month_test = month_test - 1。这个涉及到了np数组的高阶用法。一般数组是无法和数字做运算的,可是将普通数组用np.array()加工过后,变成了np数组,他拥有一个广播属性,可以直接与数字运算。该行代码就是将数组里每个元素都减1。

想要数据集跑程序又不会爬虫,微信里输入CS_mastering搜索公众号,关注后回复股票预测获取资源,可以分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63475.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用随机森林预测股票大盘涨跌

本文仅从实战角度去观察,利用机器学习算法中,随机森林模型预测股票市场指数涨跌的准确率。 适合入门玩家 首先,我们导入所需要的模块 import numpy as np import pandas as pd import talib as ta #金融数据计算 import datetime,pickle …

随机森林——股票涨跌预测模型搭建

多因子模型搭建 1.引入之后需要用到的库 import tushare as ts # 股票基本数据相关库 import numpy as np # 科学计算相关库 import pandas as pd # 科学计算相关库 import talib # 股票衍生变量数据相关库 import matplotlib.pyplot as plt # 引入绘图相关库 from sk…

案例分析:股票涨跌预测

目标和背景 采用逻辑回归方法,使用过去 5 天的收益率 X 来预测未来一天的涨跌 Y, 并依据涨跌概率大小来构建多空投资组合。 解决方案和程序 拟合模型:将其中 450 天数据作为训练样本,拟合一个逻辑回归模型,得 到参数估…

股票预测pythonlstm_LSTM预测股票涨跌--结合技术分析视角(一)

LSTM处理股票数据的一般流程: image.png 2.在先工作的基本思路: (1).为利用沪深300前100天的收盘价预测下一天的收盘价。从结果来看,LSTM对未来20天的预测基本上是对过去100天收盘价变化的趋势的总括,因此最终的预测结果以及回测结果都不是很理想。 之后尝试增加了feature…

基于长短期记忆网络(LSTM)对股票价格的涨跌幅度进行预测

完整代码:https://download.csdn.net/download/qq_38735017/87536579 为对股票价格的涨跌幅度进行预测,本文使用了基于长短期记忆网络(LSTM)的方法。根据股票涨跌幅问题, 通过对股票信息作多值量化分类,将股票预测转化成一个多维函…

R语言逻辑回归Logistic回归分析预测股票涨跌

最近我们被客户要求撰写关于逻辑回归的研究报告,包括一些图形和统计输出。 视频:R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险 逻辑回归Logistic模型原理和R语言分类预测冠心病风险实例 ,时长06:48 本文回…

预测股票涨跌看什么指标,如何预测明天股票走势

通达信精准预测股价主图指标公式 是不是可以去了未来 如何用公式将当日股票上涨幅度在M-N之间的股票当天及前几天的行情统计出来。 70 如何知道或者预测一个股票次日的开盘价? 。 在短线操作中,对目标个股次日的买入卖出价的测算是很重要的&#xff…

基于支持向量机SVM的沪深300股票预测股票涨跌方向

结果参考:https://www.bilibili.com/video/BV1nY411z7Kk/?spm_id_from=333.999.0.0 附完整代码+数据

以预测股票涨跌案例入门基于SVM的机器学习

SVM是Support Vector Machine的缩写,中文叫支持向量机,通过它可以对样本数据进行分类。以股票为例,SVM能根据若干特征样本数据,把待预测的目标结果划分成“涨”和”跌”两种,从而实现预测股票涨跌的效果。 1 通过简单…

GPT2中文新闻标题生成

向AI转型的程序员都关注了这个号👇👇👇 机器学习AI算法工程 公众号:datayx 项目描述 本项目是一个带有超级详细中文注释的基于GPT2模型的新闻标题生成项目。本项目参考了GPT2-Chinese、GPT2-chitchat、CDial-GPT、GPT2等多个GPT…

中文新闻文本标题分类(基于飞桨、Text CNN)

目录 一、设计方案概述 二、具体实现 三、结果及分析 四、总结 一、设计方案概述 主要网络模型设计: 设计所使用网络模型为TextCNN,由于其本身就适用于短中句子,在标题分类这一方面应该能发挥其优势。 TextCNN是Yoon Kim在2014年提出的模型&#xff…

“无法登陆到你的账户”的问题解决方案

电脑打开后,winR打开命令窗口 输入:netplwiz 点击添加 ​​​​​​​点击添加方框内 点击本地账户 输入你要创建的账号那些: 我当时已经创建好了,就是user. 然后需要将该用户设置为管理员权限即可。 重回回到,此时你…

聚观早报 | 美国又一家银行要暴雷;腾讯T13技术黄希彤被曝遭裁员

今日要闻:暴跌 62%!美国又一家银行要暴雷;三星上半年量产第三代 4nm 工艺;腾讯T13技术大佬黄希彤被曝遭裁员;华为 P60 系列将于 3 月 23 日发布;苹果公司CEO库克减薪40% 暴跌 62%!美国又一家银…

蓝筹股连环爆雷!这些蓝筹股哪些最容易爆雷?(最全名单)

幸福的股民总是相似的,不幸的股民去而各有各的不幸。天雷滚滚的2019年报季尚不去不远,不少股民们尚未从那场暗雷中疗伤正骨,2020年中报的雷声又开始拉响。 7月14日,有着“药中茅台”之称的东阿阿胶半年度业绩公布,作为…

我问自己代言,甄嬛篇

你只看到本宫的寿康宫 却没看到本宫的凌云峰 你有你的气度 本宫有本宫的本事 你嘲笑本宫菀菀类卿 本宫可怜你留得住人留不住心 你可以轻视本宫的存在 本宫会让你见识糙米薏仁汤的口感 回宫 注定是一段孤独的旅程 路上少不了三姑六婆 但 那又怎样?即使是滑胎 也要滑的…

淘宝618每日一猜6月6日答案-甄嬛在横店哪里参加的选秀?

淘宝6月6日每日一猜答案是什么?,接下来也会给大家来介绍一下6月6日淘宝大赢家每日一猜的答案。 淘宝每日一猜6月6日答案分享 活动问题:甄嬛在横店哪里参加的选秀 活动答案:【交泰殿】 还有打开手机淘宝,搜索“能省就…

吴忠军 - 《甄嬛传》宜修到死都不知道,这个和甄嬛无关的人帮了甄嬛一个大忙...

《甄嬛传》在甄嬛把华妃扳倒后,皇后便甩开手开始对付甄嬛了,比起华妃和甄嬛的眼里皇后是最好对付的,因为皇后手中掌握扳倒甄嬛的法宝,这便是皇后的亲姐姐纯元,皇后设计甄嬛穿错纯元故衣后,不仅是皇上大发雷…

专利战争:IT界的甄嬛传

分享到 本文来自腾讯大讲堂(DJT.QQ.COM),转载请注明出处。      近期热播电视剧“甄嬛传”完美收官,剧中女猪脚甄嬛的经历堪称一部女人的奋斗史诗,一方面要讨皇上的欢心,一方面又要跟华妃、皇后等后宫各方势力做斗争&…

熹贵妃竟是这种隐藏属性,从MBTI来看甄嬛“三姐妹”的爱恨情仇?

就在不久前的5月17日,农历四月十七,是熹贵妃的农历生日,这一天为了给嬛嬛庆生,朋友圈微博等各大平台,可热闹了起来,这盛况堪比那年果郡王为嬛嬛庆生~ 如今,距《甄嬛传》首播已经有1…