真题解析 | 2022数模美赛C题:股票投资策略

news2025/7/11 12:37:53

1、准备工作

1.1 题目背景

市场交易者频繁买卖波动性资产,目标是最大化其总回报。每次买卖通常都会有佣金。 两种这样的资产是黄金和比特币。

图 1:黄金每日价格,每金衡盎司美元。 资料来源:伦敦金银市场协会,2021 年 9 月 11 日

图 2:比特币每日价格,每比特币美元。 资料来源:纳斯达克,2021 年 9 月 11 日

要求

一位交易员要求您开发一个模型,该模型仅使用迄今为止的每日价格流来确定交 易员每天是否应该购买、持有或出售其投资组合中的资产。
2016 年 9 月 11 日,您将从 1000 美元开始。 您将使用五年交易期,从2016 年 9 月 11 日至 2021 年 9 月 10 日。 在每个交易日,交易者将拥有一个由现金组成的投资组合,黄金和比特币 [C, G, B] 分别以美元、金衡盎司和比特币表示。 最初的状态为 [1000, 0, 0]。 每笔交易(购买或销售)的佣金成本为交易金额。 假设 αgold = 1% 和 αbitcoin = 2%。 持有资产没有成本。
请注意,比特币可以每天交易,但黄金仅在市场开放日交易,定价数据文件反映 LBMA-GOLD.csv 和 BCHAIN-MKPRU.csv 这两点,你的模型应该考虑这个交易时间表。
要开发模型,您只能使用提供的两个电子表格中的数据:LBMA-GOLD.csv 和 BCHAIN-MKPRU.csv。(官网提供下载)
• 开发一个模型,该模型仅根据当天的价格数据提供每日的最佳交易策略,使用你的模型和策略,在 2021 年 9 月 10 日,初始 1000 美元能收获的投资价值多少?
• 提供证据证明您的模型提供了最佳策略。
• 确定策略对交易成本的敏感程度。 交易成本如何影响策略和结果?
• 最多以一份备忘录(两页)的形式将您的策略、模型和结果传达给交易者

1.2 解题使用工具

语言:python3.8

编译器:SPSSPRO Notebook

下载链接:SPSSPRO Notebook(免费在线使用,推荐使用)

2、思路分析

首先,我们先整理和数据,因为比特币每天都开市,黄金有时间开市,有时间闭市,把他们整理成时间线对齐,可以用缺失值代表闭市日等等。

我们可以根据预测未来走势来对(买入或者出售或保持)这三种交易活动进行决策,因此,接着我们可以针对黄金、比特币进行时序预测,基于当天数据或以往数据去预测明天的价格走势,进而更好地做决策。

然后先针对第一天,基于预测的明天价格,构建一个目标规划,目的是实现已经知道第二日的价格后,如果投入才能实现当前交易日价格的最大化,其中交易的真实利益可以根据基于预测价格实施的投资策略后,通过真实第二天价格计算当天投资策略的盈利,然后重复这个过程,直到持有金额败光或者5年交易期结束,停止循环。

接着,对模型中出现的超参数进行灵敏度分析,例如设置了初始黄金的持有量是各500,如果调整这个比例,那么投资额度是否波动平稳?

3、解题流程框图

4、详细解题步骤

4.1 详细求解步骤

step1:数据合并

首先先把比特币和黄金的交易数据合并起来,通过简单的观察,以Date字段为关联字段,合并数据,采用merge连接,可以得到以下数据,可以看到,一共有1826行样本。

将合并后数据进行查看确实值,可以看到,黄金存在缺失值,且缺失了571个数值,这是因为比特币可以每天交易,但黄金仅在开市日交易导致的

step2:训练模型,进行时序预测

根据题目要求,开发一个模型,该模型仅根据当天的价格数据提供每日的最佳交易策略,因此,我们需要训练一个能基于当天数据预测第二天数据的时序模型。

对于时间序列问题,目前业界有两种求法:
1、学术界常用计量统计模型,如arima模型、灰色预测模型、指数平滑等等,这类需要进行非常严格的模型检验

2、工业界统计模型,大多采用机器学习进行时间序列问题求解,例如lstm,xgboost等,通常做法也是2种,一种是单序列求解,将单序列转为多序列回归,另外就是构建特征工程,直接研究回归问题。

这里我们采用工业界模型,也就是机器学习时序预测,在这之前,我们需要了解一个数据处理的方法——时序数据滑窗转换

时序数据滑窗转换用于将时间序列数据转为回归数据,简单地说,就是把一个单序列的数据变为X->Y的回归数据。步阶为2代表2个X(步阶多少就有多少个X),一个Y(这个不会变的),

简单地说,就是用第1,2天的数据预测第3天,用第2,3天的数据预测第4天,以此类推。

大家可以用spsspro的数据处理的时序数据滑窗转换实现

SPSSPRO-数据处理

时序数据滑窗转换

我这里也写了一个代码实现,只不过效率会差些。dataset, look_back

其中,dataset为数据集, look_back为步阶,如上图所示,为比特币步阶为1时的滑窗转换结果。

可以采用SPSSPRO的随机森林回归,使用起来也更简单,而且输出的结果和图表比较精美,这里建议大家多跑几个算法对比效果,推荐XGBooST、LGBM、随机森林回归这三项。

这里我采用代码采用随机森林对比特币进行时序数据训练进行示例,结果如下,可以看到,R2为0.994,拟合效果较为优秀。

同理,得到黄金的预测模型,注意黄金数据需要剔除缺失值,但是不要在原有数据上剔除。

接着,重复构建训练模型,用第1天的黄金、比特币数据预测第2天的黄金、比特币,用第1、2天的黄金、比特币数据预测第3天的黄金、比特币、用第1、2、3天的黄金、比特币数据预测第4天的黄金、比特币依次类推。

得到每天的预测数据,同时与真实的数据进行合并,整理得到以下表格。

step3:构建最优化模型,基于启发式算法寻优

在进行预测后,我们需要得到买入-出售-保持这样的交易策略,其中,黄金仅在开市日的交易,这说明在周末或者节假日,交易状态一定是持有,可以分别保留黄金和比特币的共同交易日数据来进行分析。假设黄金-比特币是同买同卖的,主要设计到的是一个收益率这样一个时间序列数据,比如,我们可以在任一一天进行买入,我们可以用(预测某天金子的价格/购买金子的实际价格-1)来得到收益率,当涨幅达到某个值的,建议卖出。

注意:初始状态为【1000,0,0】,并且每笔交易(购买或出售)的交易成本为交易金额的a%,其中黄金为1%,比特币为2%,那么,对于1000美金,买入卖出两个步骤,我们实际进行的交易金额只有940美金。

建立简单目标规划:

假设t是买入到卖出这段时间

由于买入-售出是在不断进行的,我们需要建立循环来进行运行。

为达到更加完美的结果,更贴合实际,可以添加金融风险性的分析,类似VaR、CVaR、又或者是信息熵的使用,在建立完美的投资模型后,我们可以用来优化算法来对权重进行寻优,比如粒子群法、遗传算法、免疫算法等等。

即:我们需要设定好目标函数,也就是每日收益的最大化,设立相关约束条件,求解规划求解结果,以及规划求解方程导出。

我们设置以下变量

变量设置

而我们的目标就是根据预测模型与限定的一些约束条件中,得到每天的最佳投资策略,然后重复这个过程,直到在 2021 年 9 月 10 日,初始 1000 美元能收获的投资价值多少?

可以简单设置一个规划模型:其中,如果是黄金和比特币都开市,则目标函数为

每日收益=(第二天的黄金价格/今天的黄金价格)*(前一天的黄金持有数+当天的黄金交易数)+(第二天的比特币价格/今天的比特币价格)*(前一天的比特币持有数+当天的比特币交易数)

约束条件有:

约束1:当天的黄金、比特币交易数不得超过总持有量

约束2:当天的黄金、比特币交易数不得超过前一天各自的持有量

约束3:高于税费才交易

还有其他约束,大家可以自行补充。

如果只有比特币开市,则目标函数为:

每日收益=前一天的黄金持有数+(第二天的比特币价格/今天的比特币价格)*(前一天的比特币持有数+当天的比特币交易数)

step4:使用遗传算法求解

单天最优解遗传算法求解

设置初始参数

第一个目标函数求解结果

第二个目标函数求解结果

step5:迭代每天重复进行最优化投资

SPSSPRO-Notebook

step6:1826天的最优策略下模拟结果

即最终持有投资额为7047.974988元。

当然我这个数值比较低是因为跟投资的约束条件有关,这里我只是简单列一下容易模型化的约束条件,大家可以自行进行补充,跑出更优秀的结果。

4.2 灵敏度分析

灵敏性分析

第三题的原理其实就是灵敏度分析,前面第一二题我们不是设置了初始黄金的持有量是一半一半各500,第三题灵敏度分析,它其实就是对这一些手动设置的参数进行分析,就像假设我黄金一开始持有量是100,会不会影响到最终的结果,所以我们可以看到那张图x轴是黄金开始的一个持有量,y轴就是经过5年交易期结束后的资产总额了,可以看到,他其实是再6750左右上下波动,说明模型的稳健性很强,对最终的资产总额结果不会有很灵敏的影响。

5 代码获取

以上,全部的代码、题目数据可以通过下面免费获取,关注SPSSPRO社区账号【跟着欢欢玩转数模】:

免费获取代码+题目+数据

作者创作不易,大家觉得有用的点赞收藏关注三连呗。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaScript实现动态规划(Dynamic Programming)01背包问题

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门…

二十分钟带你了解JVM性能调优与实战进阶

ZGC 诞生原因 Java生态非常强大,但还不够,有些场景仍处于劣势,而ZGC的出现可以让Java语言抢占其他语言的某些特定领域市场。比如 谷歌主导的Android手机系统显示卡顿。证券交易市场,实时性要求非常高,目前主要是C主…

Day16【元宇宙的实践构想04】—— 元宇宙的安全

💃🏼 本人简介:男 👶🏼 年龄:18 ✍今日内容:《元宇宙的实践构想》04——元宇宙的安全 ❗❗❗从1.31日开始,阿亮每天会查阅一些元宇宙方面的小知识,和大家一起分享。一是由…

ChatGPT背后的技术和多模态异构数据处理的未来展望——我与一位资深工程师的走心探讨

上周,我和一位从业三十余年的工程师聊到ChatGPT。 作为一名人工智能领域研究者,我也一直对对话式大型语言模型非常感兴趣,在讨论中,我向他解释这个技术时,他瞬间被其中惊人之处所吸引🙌,我们深…

读书笔记——《再见,平庸时代》

为什么会看这本书 《马斯克》这本书中,最后几段介绍了一下经济学家和作者泰勒考恩的两本书《大停滞》《再见,平庸时代》。《大停滞》讲的是美国这40年发展为何停滞,我当然不太关心这种内容。但是《再见,平庸时代》不是对历史的研究…

springboot 东方通(tongweb)替换tomcat

一.修改pom.xml文件依赖 1.排除springboot中内置的tomcat依赖 2.添加tongweb-spring-boot-starter和tongweb-embed依赖 特别说明下&#xff1a;我这里所有依赖的包都传到了私有仓库&#xff0c;直接复制到pom.xml文件会import失败。 <!-- SpringBoot Web容器 --> <d…

分享Python7个爬虫小案例(附源码)

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点&#xff0c;非常适合刚入门python爬虫的小伙伴参考学习。注&#xff1a;若涉及到版权或隐私问题&#xff0c;请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…

【uniapp小程序实战】—— 使用腾讯地图获取定位

文章目录&#x1f34d;前言&#x1f34b;正文1、首先看官网uni.getLocation(OBJECT)#注意2、腾讯位置服务平台申请密钥和下载SDK2.1 申请开发者秘钥2.2 开通webserviceAPI服务2.3 下载微信小程序JavaScriptSDK2.4 安全域名设置3、配置manifest.json文件4、示例代码展示4.1 引用…

如何用Python求解微分方程组

文章目录odeint简介示例odeint简介 scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API&#xff0c;是scipy早期使用的微分方程求解器&#xff0c;但由于是Fortran实现的&#xff0c;尽管使用起来并不方便&#xff0c;但速度没得说&#xff0c;所以有的时候还挺推荐…

JavaScript基础(详细总结)

目录 1、JavaScript简介 1.2、JavaScript的发展史 1.3、JavaScript的功能 1.4、JavaScript的特点 1.5、JavaScript组成 2、JavaScript基础语法 2.1、HTML引入JS 2.1.1、内部引入 2.1.2、外部引入 2.2、JS输出数据的三种方式 2.2.1、浏览器弹窗 2.2.2、输出HTML页面…

IDEA实现前端页面登录,注册、增、删、改、查操作-完整版

分层思想&#xff1a;entity层&#xff1a;存放实体类vo层&#xff1a;消息模型&#xff08;重复使用的一些属性&#xff09;mapper层&#xff1a;接口&#xff08;写方法的&#xff09;mapper.xml:MyBatis与数据库相关的一些内容controller(web)层&#xff1a;接收前端传回的参…

谈谈ES5和ES6的区别

我们都知道JavaScript是由三部分组成&#xff1a; 1. ECMAScript(核心)&#xff1a;规定了语言的组成部分>语法、类型、语句、关键字、保留字、操作符、对象 2. BOM(浏览器对象模型): 支持访问和操作浏览器窗口&#xff0c;可以控制浏览器显示页面以外的部分。 3. DOM(文…

基于Python构建机器学习Web应用

目录 一、内容介绍 1.Onnx模型 ①skl2onnx库安装 2.Netron安装 二、模型构建 1.数据加载 2.划分可训练特征与预测标签 3.训练模型 ①第三方库导入 ②数据集划分 ③SVC模型构建 ④精度评价 二、模型转换及可视化 1.参数配置 2.Onnx模型生成 3.可视化模型 四、构…

报错ValidationError: Progress Plugin Invalid Options

背景&#xff1a;我改了文件的名字 他很多配置都没有了 我只能重新来 中途删了删掉node_modules和package-lock.json 也找了很多方法来重复配置着两个文件 最快的方法是 npm i -D vue 后面复原了之后又出现了很多问题 一直困恼我的是下面那个图片内容 背景&#xff1a;他…

Java Web入门 Web环境的搭建

文章目录 一、JDK开发工具包 a、下载JDK b、如何安装 c、配置Java环境变量。 d、测试环境变量是否安装成功 二、下载Tomcat服务器 a、Tomcat是什么&#xff1f;为啥要用它&#xff1f; b、如何下载 c、了解Tomcat的目录 d、如何知道自己Tomcat服务器有没有问题呢&#…

在 js 中,reduce() 的详解 以及使用方法

reduce&#xff08;&#xff09;&#xff1a; reduce&#xff08;&#xff09;方法为归并类方法&#xff0c;最常用的场景就是&#xff0c;计算数组中的每一项的总和。 reduce&#xff08;&#xff09; 方法会遍历数组的每一项&#xff0c;他接收两个参数&#xff1a; 第一个…

22.信息系统安全管理-策略7定.方案.安全体系架构.PKI.PMI

信息系统的安全威胁分成七类&#xff0c;从风险源的角度划分&#xff0c;可以将安全威胁划分为&#xff1a;自然事件风险、人为事件风险、软件风险、软件过程风险、项目管理风险、应用风险、用户使用风险。 信息系统安全四个层次:设备安全、数据安全、内容安全、行为安全。数据…

vite打包配置(静态资源合并打包/清除log/gzip压缩/ENV配置等)

2022/6/2更新 传了一下本项目代码,文章里写到的基本都有用到,可以clone了看一下 下载地址https://github.com/shinjie1210/vite-config.git---------------------------------------------------------------------------------------------------------------------------- …

基于vue的uni-app生态——学习笔记001

目录 vue的简介 什么是vue.js vue相比传统的js开发优势有哪些 vue的优势 与传统的开发文件相比的类型变换 与传统的开发相比开发文件内部架构的变化 uni-app生态&#xff08;编辑器的使用&#xff09; 编辑器的下载 编辑器的使用 基于vue开发的uni-app生态的文件结构…

CANoe中使用CAPL刷写流程详解(Trace图解)(CAN总线)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…