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

2023-11-06

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

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

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

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

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

流程图

Quotation Flowchart.jpg

参数设置

class Para:
    method = 'SVM'                                              #模型选择为SVM
    month_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] = 1
    data.iloc[-n_stock_select[1]:, -1] = 0                               #这两行将表现好的股票标签置1,差的置0
    data = 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_month
    else:
        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_month
    y_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].index
    print(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搜索公众号,关注后回复股票预测获取资源,可以分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python应用(3)svm模型预测股票涨跌 的相关文章

  • Pygame读取MIDI输入

    我参考了Pygame MIDI 文档 https www pygame org docs ref midi html and 这段代码 https stackoverflow com questions 62983509 pygame mi
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 如何在单独的文件中使用 FastAPI Depends 作为端点/路由?

    我在单独的文件中定义了一个 Websocket 端点 例如 from starlette endpoints import WebSocketEndpoint from connection service import Connectio
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt

随机推荐

  • java最大堆空间会自动扩增吗_最大化Java堆空间

    我试图在 Java中使用非常大的方阵 n 1e6或更大的数量级 矩阵不是稀疏的 所以我没有看到很多方法将它们表示为2D数组 这需要n 2 sizeof int 位的内存 显然 我正在获得堆溢出错误 即使添加编译器标志来使用我的机器将允许的大
  • 二十九.刷题.19

    输入两点坐标 X1 Y1 X2 Y2 0 lt x1 x2 y1 y2 lt 1000 计算并输出两点间的距离 include
  • centos7.3 32位 安装ssh实现远程登陆

    centos7 3 32位 安装ssh实现远程登陆 安装ssh sudo yum install openssh 关闭防火墙 永久禁用 sudo systemctl disable firewalld 重启ssh sudo systemct
  • 流动的数据——使用 RxJS 构造复杂单页应用的数据逻辑

    感谢作者徐飞的授权发布 作者 徐飞 网名民工精髓V 曾任Teambition前端架构师 苏宁云计算中心前端架构师 有十年以上大型企业应用前端架构及开发经验 熟悉AngularJS等框架 对Web组件化有一些思考 博客地址 https git
  • 微软server2012服务器端客户端,windows server 2012 datacenter配置iSCSI目标服务器和客户端配置...

    您好 1 在添加角色时 添加 文件和存储服务 文件和iSCSI服务 iSCSI目标存储提供程序 VDS和VSS硬件提供程序 这项主要的作用是什么 在配置iSCSI目标服务器时 有没有必要安装 这个应该 是 让 iscsi 卷 支持 VSS
  • gitee配置SSH公钥

    第一步 找个地方打开 git bash 然后输入生成ssh公钥的命令 ssh keygen t rsa C your email 然后敲四次回车生成公钥 第二步 输入查看公钥的命令 cat ssh id rsa pub 结果如下 第三步 将
  • 如何在微信小程序中优雅地发送异步请求

    一 微信小程序运行环境 微信小程序的 javascript 运行环境和浏览器不同 页面的脚本逻辑是在JsCore中运行 JsCore是一个没有窗口对象的环境 所以不能在脚本中使用window 也无法在脚本中操作组件 JsCore中也没有 X
  • ProtoBuf(Google Protocol Buffers)—— C++开发具体教程

    ProtoBuf C 开发 教程 C 开发 教程 1 定义你的 protocol 格式 1 1 protocol 字段格式 1 2 指定字段规则 1 3 proto文件 2 编译你的 Protocol Buffers 3 The Proto
  • 【华为OJ】【在字符串中找出连续最长的数字串】

    题目描述 请一个在字符串中找出连续最长的数字串 并把这个串的长度返回 如果存在长度相同的连续数字串 返回最后一个连续数字串 注意 数字串只需要是数字组成的就可以 并不要求顺序 比如数字串 1234 的长度就小于数字串 1359055 如果没
  • 模板类的特化和类型萃取

    模板类的特化 有时为了需要 针对特定的类型 需要对模板进行特化 也就是所谓的特殊处理 全特化 对传入的数据类型都做了限制 偏特化 半特化 偏特化并不仅仅是指特殊部分参数 而是针对模板参数更进一步的条件限制所设计出来的一个特化版本 模板的全特
  • Linux vim的常见基本操作

    目录 vim是一款多模式的编辑器 命令模式下 用小写英文字母 h j k l 分别控制光标左 下 上 右移一格 gg 定位到代码第一行 n shift g 定位到任意一行 最后一行 移动到光标所在行的结尾 移动到光标所在行的开头 w 以单词
  • Linux之 Shell分析日志文件

    文章目录 前言 1 查看有多少个IP访问及某一个页面被访问的次数 2 查看每一个IP访问了多少个页面及个IP访问的页面数进行从小到大排序 3 查看某一个IP访问了哪些页面及去掉搜索引擎统计的页面 4 查看2015年8月16日14时这一个小时
  • React Hook的用法: Ref + useMemo + 自定义Hook(三)

    React Hook的用法 Ref Hook 这个Hook的作用是可以通过他来获取到Dom元素节点 使用起来非常方便 关键代码如下 const xxxEle useRef initialValue 1 useRef返回一个ref变量 并接受
  • U盘怎么重装系统到电脑上

    当今社会 电脑可以说是融入了我们的生活 每个工作职能都需要使用到电脑来录入信息 电脑既然这么重要 但还是偶然出现些小故障 我们都可以通过u盘来重装系统拯救电脑 更多系统教程尽在小白系统重装官网 1 注 准备好一个8g以上u盘 一台能上网的电
  • Blender里的三种绑定:(一)主从绑定

    文章目录 Blender里的三种绑定 主从绑定 进行物体绑定 进行顶点绑定 解除绑定 保持变换 无反向 进行晶格绑定 Blender里的三种绑定 1 Blender中一共有三种绑定模式 分别是 主从绑定 约束 骨骼 主从绑定 1 主从绑定即
  • python下载安装过程——超详细!

    Python 下载安装 文末附python全套学习资料 安装python分三个步骤 1 下载python 2 安装python 3 检查是否安装成功 1 下载Python 1 python下载地址https www python org d
  • python使用pycrawlers批量下载huggingface上的模型与数据文件

    文章目录 前言 一 git下载的例子 二 pycrawlers的使用 1 安装 2 批量下载 3 单个下载 4 示例 5 后台下载 6 断点续传 总结 前言 现在从下载huggingface的文件一般使用git 下载单个小型模型的文件使用g
  • Linux系统管理:虚拟机Alpine Linux安装

    目录 一 理论 1 Alpine Linux 二 实验 1 Alpine Linux安装 三 问题 1 Alpine Linux 缺少VIM命令 2 Alpine Linux SSH连接不上 3 Alpine Linux IP配置 四 总结
  • Python3实现向指定邮箱发送邮件(支持附件文件、图片等)

    Background 最近业务需求需要把生成的月报定时发送到指定邮箱 直接在网上找了相关经验改巴改巴给实现了 测试可以直接使用 生产是我从MySQL数据库获取文件信息和邮箱等使用的 程序中的注释相当清楚了 定时是通过shell脚本实现的 获
  • python应用(3)svm模型预测股票涨跌

    最近接了一个私活 指导学妹完成毕业设计 核心思想就是利用SVM模型来预测股票涨跌 并完成策略构建 自动化选择最优秀的股票进行资产配置 在做这个项目的过程中 我体会到想成为一个合格的数据分析或者数据挖掘工程师不仅技术要过关 还需要了解所要挖掘