2022年美赛C题M奖思路复盘(附代码、附论文)
前言
美赛已经结束4天了,一直忙于教资考试的准备,今天我终于抽空写了这篇C题思路复盘的博客。
题目大致要求
题目叫'Trading Strategies(交易策略)',一共给了两个文件,分别是比特币和黄金价格随时间变化的CSV文件。大致要求可以分为以下四个步骤:
- 基于截止至当日的价格情况建立模型,预测2021年9月10日原来的本金1000美元会变成多少钱?(Develop a model that gives the best daily trading strategy based only on price data up to that day. How much is the initial $1000 investment worth on 9/10/2021 using your model and strategy?)
- 证明你的模型提供了最佳策略(Present evidence that your model provides the best strategy.)
- 就是让你对手续费那两个参数做敏感性分析(Determine how sensitive the strategy is to transaction costs. How do transaction costs affect the strategy and results?)
- 美赛的老一套,让你写一个什么备忘录,向投资者陈述你的战略、模型和结果(Communicate your strategy, model, and results to the trader in a memorandum of at most two pages.)
具体题目内容见美赛网站:2022 MCM Problem C (immchallenge.org)http://www.immchallenge.org/mcm/2022_MCM_Problem_C.pdf
分析题目
对于问题1,思路无非是分为两个步骤,第一个步骤是预测出后几日的价格进而估计得到后几日的收益率,然后通过动态规划模型进行最优化的求解。具体思路如下:
首先先看数据集,你会发现数据集只有两列,时间一列和价格一列。这意味着知网或者其他数据库中查到的很多论文写的预测算法你都用不了了。为什么呢?因为人家写论文时候用的数据集都有其他的特征,而不是这里只有时间一列特征。所以那些什么SVM、贝叶斯网、向量自回归等要求多维特征的算法都不适用。查来查去,有推荐使用LSTM、神经网络模型还有xgboost算法,但我都是不是很熟悉,最终还是用了时间序列ARIMA模型来做的预测。为什么用ARIMA模型来做的预测,我给出以下几点原因:
- ARIMA模型属于单时间序列模型,符合题目数据集提供的数据以及题目给出的要求。
- ARIMA模型是一个很常见的时间序列模型,较为成熟也是我所熟悉的,我能拿它写不少东西。
- 我使用Python编程,而Python的statsmodels库中提供了ARIMA现成的API,不用另外写代码,而且调用API绘制图像的操作十分方便。
对于问题二呢,网上的思路都是说,改变什么参数,看看收益率会不会提高,如果不会的话就说明是最优的,但也没说清楚具体怎么操作。而我的想法不完全是这样的,我看了他们的思路突然想到了"梯度下降法",那你说如果我用模型的两个参数(具体来讲一个是ARIMA模型的AR参数另一个是MA参数,作为梯度下降法改变模型的两个搜索方向,然后进行算法计算,理论上是完全可行的,于是乎我就这么干了。
对于问题三和问题四就不再多说了。但我也罗嗦一下,问敏感性分析,我除了做了问题三的手续费的敏感性分析外,我还针对ARIMA模型做了敏感度分析。问题四就总分总来写,总一段,分三段,也就是战略、模型和结果各一段写,最后写个总结,要注意的是英文备忘录是有格式的,得按照格式来,要有点仪式感,不然你就可能会被扣分。
还有就是别忘了一开始写数据清洗那一段,我用了基于时间序列的牛顿插值法进行插补,用箱型图法判断离群点。
接下来我贴出我的代码。
代码
import pandas as pd
from pylab import *
import statsmodels.api as sm
from datetime import datetime
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import kpss
from statsmodels.stats.diagnostic import acorr_ljungboxdef adf_test(timeseries):print('Results of Dickey-Fuller Test:')dftest = adfuller(timeseries, autolag='AIC')dfoutput = pd.Series(dftest[0:4], index=['Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used'])for key, value in dftest[4].items():dfoutput['Critical Value (%s)'%key] = valueprint(dfoutput)def kpss_test(timeseries):print('Results of KPSS Test:')kpsstest = kpss(timeseries, regression='c')kpss_output = pd.Series(kpsstest[0:3], index=['Test Statistic','p-value','Lags Used'])for key, value in kpsstest[3].items():kpss_output['Critical Value (%s)'%key] = valueprint(kpss_output)dataGOLD = pd.read_csv("C:\\ProblemC\\LBMA-GOLD.csv")
dataMKPRU = pd.read_csv("C:\\ProblemC\\BCHAIN-MKPRU.csv")
dataGOLD['Date'] = pd.to_datetime(dataGOLD.Date)
dataMKPRU['Date'] = pd.to_datetime(dataMKPRU.Date)
dataGOLD = dataGOLD[dataGOLD['Date'] >= datetime.strptime('2016-9-11', "%Y-%m-%d")]
dataMKPRU = dataMKPRU[dataMKPRU['Date'] >= datetime.strptime('2016-9-11', "%Y-%m-%d")]
dataGOLD = dataGOLD[dataGOLD['Date'] <= datetime.strptime('2021-9-10', "%Y-%m-%d")]
dataMKPRU = dataMKPRU[dataMKPRU['Date'] <= datetime.strptime('2021-9-10', "%Y-%m-%d")]
dataGOLD = dataGOLD.sort_values('Date').reset_index(drop=True)
dataMKPRU = dataMKPRU.sort_values('Date').reset_index(drop=True)adf_test(dataGOLD['Value'])
kpss_test(dataGOLD['Value'])diffGOLD = dataGOLD['Value'].diff(1).dropna()
diffMKPRU = dataMKPRU['Value'].diff(1).dropna()fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
sm.graphics.tsa.plot_acf(diffMKPRU, ax=ax1)
ax1.xaxis.set_ticks_position('top')
ax2 = fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(diffMKPRU, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()fig = plt.figure(figsize=(12, 8))
ax11 = fig.add_subplot(211)
sm.graphics.tsa.plot_acf(diffGOLD, ax=ax11)
ax11.xaxis.set_ticks_position('top')
ax22 = fig.add_subplot(212)
sm.graphics.tsa.plot_pacf(diffGOLD, ax=ax22)
ax22.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()p_value = acorr_ljungbox(dataGOLD['Value'])
print(p_value)results = sm.tsa.arma_order_select_ic(dataMKPRU['Value'], ic=['aic', 'bic'], trend='nc', max_ar=5, max_ma=5)
print('AIC', results.aic_min_order)
print('BIC', results.bic_min_order)n_sample = dataGOLD['Value'].shape[0]
n_train = int(n_sample * 0.95) + 1
n_forecast = n_sample - n_traints_train = dataGOLD.iloc[:n_train]['Value']
ts_test = dataGOLD.iloc[n_train:]['Value']arima = sm.tsa.SARIMAX(ts_train, order=(2, 1, 0))
model_results = arima.fit()
model_results.plot_diagnostics(figsize=(16, 12))
plt.show()
print(model_results.summary())plt.title("Bitcoin price image after first-order difference")
plt.plot(dataMKPRU['Date'], dataMKPRU['Value'].diff(1))
plt.show()plt.title("Gold price image after first-order difference")
plt.plot(dataGOLD['Date'], dataGOLD['Value'].diff(1))
plt.show()
代码绘图展示
我们使用matplotlib进行绘图,绘制了如下的图片进行展示:
箱型图法检测的两张图,如下:
价格随时间变化的趋势图两张:
一阶差分图两张:
应用新策略后的趋势图一张:
ARIMA模型预测图一张
ACF图和PACF图两张:
各类图表:一阶差分图、正态分布直方图、QQ图等
代码分析与第一问细节
可以看到,statsmodels确实十分强大,各种API拿来就用,十分方便。
其中我们用ACF图和PACF图确定了参数的大致阶数,然后用BIC和AIC来定阶。代码只展示了黄金的ARIMA模型的阶数为(2,1,0),比特币模型的阶数只要改下变量就行了,就不在展示了,比特币模型的阶数最终定为(4,1,4)。
就写到这里吧,仅供参考和复盘。
最终获奖结果
更新于5月8日。
我们团队最终获得了M奖,祝贺所有人!!!
结语
这是我们的论文链接,仅供参考!学术生涯不易,请投喂我们,论文只要1.9元,也不是很贵!
2022年美赛(MCM)C题M奖论文https://download.csdn.net/download/qq_41938259/85318021
END
2022年美赛C题M奖思路复盘(附代码、附论文)相关推荐
- 2023年美赛F题F奖思路复盘(附论文)
5.9 我查了成绩,发现是F奖,本来还以为最多M,大概率S/H的.和MCM不同,ICM其实不太看重数学模型,而是论文写作,我们这篇文章应该是以清晰的论文写作拿奖的.写下这篇经验贴,希望能够帮助想打美赛 ...
- 2023美赛C题-Wordle预测思路及matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 2021美赛(4)美赛E题数据、思路、方法
EF题总体来看,本人认为两题较相似,比较考验偏文科的能力.问题的关键在于确定指标,然后是数据驱动.最后对其进行数据处理即可. E题题目的味道更像是多条件的规划问题 F更像是获得数据进行数据分析(回归/ ...
- 2021年美赛C题翻译、思路及感受
文章主要包括:翻译.问题提取.思路.感想 一.翻译 1.论文翻译 2021MCM 问题C:确认关于大黄蜂的传言 2019年9月,在加拿大不列颠哥伦比亚省温哥华岛发现了一群野黄蜂(也被称为AGH).蜂巢 ...
- 2022年美赛D题思路分享+翻译
MCM--D:数据瘫痪? 使用我们的分析! 背景 许多公司将数据视为战略资产,但承认获取价值的难度很大从这个资产. 妥善管理这种宝贵的资源可以带来有竞争力的优势.因此,公司需要建立一个集成的数据和分析 ...
- 2022美赛C题题目及思路--交易策略
背景:市场交易者经常买卖波动较大的资产,以实现总回报最大化为目标.通常每笔买卖都 有佣金.其中两种资产是黄金和比特币. 图 1. 黄金日价格,美元每金衡盎司.资料来源:伦敦金银市场协会,2021 年 ...
- 2022美赛F题题目及思路--人人为我,我(空间)为人人
背景 世界上大多数国家都签署了 1967 年的联合国<外层空间条约>,同意"探索和利用外层空间, 包括月球和其他天体,应为所有国家的利益和利益而进行,不论其程度如何经济或科学发展 ...
- 2022年美赛e题资料(森林固碳)
背景 正如我们所知,气候变化对生命构成了巨大的威胁.为了减轻气候变化的影响,我们需要采取严厉的行动,以减少大气中的温室气体的数量.仅仅是减少温室气体的排放是不够的 .我们需要努力增加通过生物圈或机械手 ...
- 2022年美赛C题-交易策略-完整解题论文和代码
完整英文论文(参赛)和代码:
- 2022美赛E题题目及思路--林业固碳技术
背景 正如我们所知,气候变化对生命构成巨大威胁.减轻气候的影响改变,我们需要采取激烈的 行动来减少温室气体的排放量气氛.仅仅减少温室气体排放是不够的.我们需要努力增加我 们被生物圈隔离在大气中的二氧化 ...
最新文章
- Linux CPU信息
- sql server 备份与恢复系列一 必备知识
- mysql扩展中如何处理结果集_我们如何处理MySQL存储过程中的结果集?
- Springboot中的缓存Cache和CacheManager原理介绍
- SAP Spartacus home 页面的 cx-page-slot selector
- android数据存放map_ES6 的新鲜玩意儿——集合set、map、WeekSet、WeekMap
- unity text不能刷新_Unity使用ComputerShader实时压缩RT!
- 聊天系统服务器端类图怎么画,聊天系统服务器端类图
- PHP header发送各种类型文件下载
- TCHAR、WCHAR、CHAR以及WideCharToMultiByte、MultiByteToWideChar
- Java中Arrays类的两个方法:deepEquals和equals
- 俄罗斯方块 java_java 俄罗斯方块
- iOS 模拟器调试web/h5代码
- linux查询硬盘固件版本,一种Linux系统下批量更新希捷硬盘固件的方法与流程
- 关于Google谷歌微信不能使用小程序
- 计算机输入法无法输入小写字母,键盘不能输入小写字母
- python修改word文本框中的内容
- 水星路由器wan口ip显示0_路由器wan口状态全是0 路由器wan口状态ip为0-192路由网
- 教学用计算机报废年限,教学科研仪器设备报废管理办法
- mysql 按时间累计计算_mysql查询——计算占比与累计占比
热门文章
- 两个平面的位置关系和判定方程组解_必修二数学课后题答案
- 百行代码,轻松实现机器人语音对话
- apizza+导出html文档,apizza导出为html后,从中提取api_name/api_path/api_method,保存到本地,方便根据接口名称得到接口路径与请求方法...
- 发那科程序全部输出_如何拷贝FANUC系统全部程序
- APP性能测试之GT 测试
- 科幻之蓝xp壁纸主题
- 计算机桌面壁纸在哪个文件夹,桌面背景在哪个文件夹,详细教您xp win7 win10系统桌面背景在哪个文件夹?...
- 敏感词过滤算法Aho-Corasick
- Tomcat优化详细教程
- 无法启动此程序 因为计算机中丢失hypertrm.dll,开机弹出找不到HYPERTRM.dll