2022年美国大学生数学建模竞赛
C题 贸易策略
原题再现:
背景:
市场贸易者经常购买和销售股票,目标是最大化他们的总回报。针对每次购买和销售,经常会存在回报提成。两个案例是金子和比特币。
要求:
你们团队被贸易者要求建立一个数学模型,只使用过去每天的价格,来确定贸易者是否应该购买,持有,或者销售他们的股票。
2016年11月9日,首先你有1000美元,你将有五年的贸易期,从2016年11月9日到2021年10月9日。在每天贸易期,贸易者将有一个账户,包含现金,金子,比特币。初始状态是[1000,0,0],每次贸易(购买或者销售)的成本是贸易金额的a%, 其中,假设金子和比特币的 a%分别是 1%和2%。持有股票不需要花费成本。
注意,比特币每天都可以交易,但是金子只能在市场开放的时候交易。相关数据反映在附件的两个csv文件中。你们的模型应该考虑到这样的贸易计划。
为了建立你们的模型,你们只能使用附件的两个csv 文件中的数据:LBMA-GOLD.csvandBCHAIN-MKPRU.csv.
• 建立一个数学模型,基于截止到那天的价格数据,给出每天贸易的最佳策略。使用你们的模型和策略,如果是初始有1000美元投资,那么在2021年10月9日值多少钱?
• 给出证据,说明你们的数学模型可以提供最佳的贸易策略。
• 确定你们的策略受到交易价格的灵敏度,交易价格是如何影响到你们的策略和结果?
• 在两页的篇幅内,和贸易者交流你们的策略,模型和结果。
整体求解过程概述(摘要)
面对传统类型的黄金投资和新型的比特币投资,制定科学的投资策略以获得最大的收益是许多人的梦想。在本文中,我们以预测模型和计划交易模型为主要主题,探讨了投资者在五年内初始资本为1,000 美元可以获得的最大回报,以及每日交易概况和交易价格对模型的影响。
我们首先进行数据预处理,分析每日交易状况,并标注黄金在交易日是否可以买卖。为了提高预测模型的准确性,使用小波降噪技术对数据进行处理。然后构建线性回归预测模型、灰度预测模型和循环神经网络预测模型,利用交易日前的历史数据预测第二天的数据。其中,循环神经网络使用基于LSTM模型的GRU模型的改进版本,使计算速度更快。为了使预测更加合理,符合劳逸规律,我们以30天为周期进行预测。在对三种模型进行详细对比和分析后,我们最终在短期预测的情况下使用灰度预测模型,在长期预测的情况下使用GRU模型。
然后,我们建立一个计划交易模型,将自己置于真实投资者的位置,并详细分析投资者当天可以采取的所有策略,得出投资情况只能是全部现金或所有比特币或所有黄金的结论。然后,我们使用贪婪算法和迭代计划的思想来不断更新投资金额,从而可以每天以最佳选择进行交易。从2016年11月9日到2021年12月9日,在模拟真实交易场景中,我们的总资产较初始大幅增加$1,000,最终为$230,31703.09。
我们推断我们的模型是已知单日预测的最佳解决方案,并可视化了每年、每月和每天的最终交易场景。在敏感性分析方面,我们分别从交易本金的变化和交易价格的变化方面分析了对最终资产的影响,并从黄金交易和比特币交易之间得出了一些结论。最终,我们从经济学和投资最大化的角度向交易者传达了我们的结果、模型和技术。
我们编写了大量的代码,这些代码都是开源的,对于后续投资者预测其他金融产品的价格变化和规划复杂的交易将更具启发性。
模型假设:
为了简化我们的模型并消除复杂性,我们在本文中做出以下主要假设。
1.假设附件中的价格是当天的唯一价格,无视开盘价和收盘价等股票市场规则。
2.市场效率较弱,即影响只有投资产品的历史价格才能有效反映在其当前价格中。
3.投资者根据价值投资的逻辑进行定量投资,即“投资产品的价格不会总是低于其内在价值,有效的市场竞争将自动消除所有超额回报”。
4.社会现实在空间和时间方面的相对不变性的假设。也就是说,投资者心理现象和社会政策环境的发生、发展和变化具有内在的规律性和确定性,被认为对黄金和比特币的影响不大。
问题分析(在这里只展示部分):
从真实投资的角度来看,我们能得到的数据并不是比特币和黄金的所有价格信息,而是截至当天的历史价格信息,所以我们的预测模型会随着时间的增长而不断更新。而且这个投资产品的价格是人为的,会遵循人类的栖息地,所以我们使用周期性的方法进行长期预测,使用30天作为我们预测的时间片。并且一些预测模型适用于短期预测,例如灰色预测和最小二乘。有些模型适用于长期预测,例如LSTM预测和GRU预测。我们将使用上述预测方法的组合并详细比较它们。
价格预测与最佳交易策略
在这项任务中,我们的目标是根据来自前几天。然而,真正的投资行为是基于预期实施的接下来的几天。也就是说,在我们制定每日交易策略之前,我们需要分别对接下来几天的黄金和比特币进行价格预测。因此,此任务的解题需要由以下两个步骤组成:
•步骤1:根据前几天的价格数据。
由于黄金和比特币的价格波动本质上是时间序列的,我们决定使用基于时间序列的模型,分别预测黄金和比特币的价格。
•第2步:使用投资策略,根据预测价格制定策略模型
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
import pandas as pd
import csv
df=pd.read_csv("Cresult.csv")
height,weight=df.shape
# height=10
m=df.values
huangjin=[]
for i in range(0,height):
if(m[i][2]==0):
huangjin.append(m[i][3])
k=1 #k代表现在持有的是黄金还是比特币
n=0 #n代表的是现在持有的黄金
rateG=0.01
rateB=0.2
oldprice_G=0
oldprice_B=0
newprice_G=0
newprice_B=0
target=1000
res=[]
for i in range(1,height-1):
res1=[]
print("第%d天的资产为:%f"%(i,target))
res1.append(m[i][0])
res1.append(target)
res.append(res1)
#如果黄金不能交易
if(m[i][2]==1):
#持现
if(k==0):
oldprice_B=m[i][1]
newprice_B=m[i+1][1]
tmp=target /(1+rateB) * newprice_B / oldprice_B
tmp=round(tmp,2)
target1=max(target,tmp)
if(target1==target):
k1=0
else:
k1=1
#持比特币
if(k==1):
oldprice_B = m[i][1]
newprice_B = m[i + 1][1]
tmp1=target*(newprice_B/oldprice_B)
tmp1=round(tmp1,2)
tmp2=target/(1+rateB)
tmp2=round(tmp2,2)
target1=max(tmp1,tmp2)
if(target1==tmp2):
k1=0
else:
k1=1
#持黄金
if(k==2):
target1=target
k1=2
k=k1
target=target1
if(m[i][2]==0):
oldprice_B = m[i][1]
newprice_B = m[i + 1][1]
oldprice_G=huangjin[n]
newprice_G=huangjin[n+1]
if(k==0):
tmp1=target/(1+rateG)*newprice_G/oldprice_G
tmp1=round(tmp1,2)
tmp2=target/(1+rateB)*newprice_B/oldprice_B
tmp2=round(tmp2,2)
target1=max(tmp1,tmp2,target)
if(target1==target):
k1=0
if(target1==tmp1):
k1=2
if(target1==tmp2):
k1=1
if(k==1):
tmp1=target*newprice_B/oldprice_B
# print(tmp1)
tmp1=round(tmp1,2)
tmp2=target/(1+rateB)
tmp2=round(tmp2,2)
tmp3=target/(1+rateB+rateG)*newprice_G/oldprice_G
tmp3=round(tmp3,3)
target1=max(tmp1,tmp2,tmp3)
if(target1==tmp1):
k1=1
if(target1==tmp2):
k1=0
if(target1==tmp3):
k1=2
if(k==2):
tmp1 = target * newprice_G / oldprice_G
tmp1=round(tmp1, 2)
tmp2 = target /(1+rateG)
tmp2 = round(tmp2, 2)
tmp3 = target /(1+rateB+rateG) * newprice_B / oldprice_B
tmp3 = round(tmp3, 3)
target1 = max(tmp1, tmp2, tmp3)
if (target1 == tmp1):
k1 = 2
if (target1 == tmp2):
k1 = 0
if (target1 == tmp3):
k1 = 1
n=n+1
k=k1
target=target1
res1=[]
res1.append(m[height-1][0])
res1.append(target)
res.append(res1)
print("第%d天的资产为:%f"%(height-1,target))