2022美赛C题股票投资策略回顾讲解,教你正确打数学建模比赛

比赛结束,所以我才正式发一下自己的思路,美赛国赛我不会发比赛思路。我们来聊一聊美赛C题到底在怎么理解?

一、读题,教你正确读题

首先说一下我也犯的大忌:大家都知道我们大多数数学建模都是英文版的,题目也是英文,习惯性用软件就把英文直接机器翻译成中文(如果运气不好,很有可能会一些专业词语翻译错误,导致对题目理解和处理有了偏差,浪费了时间,但是说实话题目英语难度确实简单,高中水平即可读懂)
个人英语不佳,懒得读英文,拿到题目我就直接用翻译软件把它全部机翻了,节约时间,这里推荐一款翻译挺不错的软件:Deel,个人英语不佳,懒得读英文,拿到题目我就直接用翻译软件把它全部机翻了,节约时间,这里推荐一款翻译挺不错的软件:Deel,可以通过文末查看如何领取。

先看背景:
在这里插入图片描述
背景配上两张图简直把这个题目说得明明白白,这就是一个股票投资策略问题,要想办法赚最多的钱,就是这个意思。当然读了背景,我们还并不知道什么思路。

1.1 第一问

继续往下读题:
在这里插入图片描述

读完题,我们首先要知道他要问的是什么,通俗说一下就是:给你1000美元拿去对黄金和比特币进行投资,投资开始时间是2016年11月9日,结束时间是2021年9月9日,你需要用一个构建一个模型保证使用你的模型能赚最多的钱,注意的是股票的买和卖都要扣除手续费,分别为1%和2%。

题目种还说到黄金和比特币的数据在那两个文件夹,值得注意的是黄健只能在开市的日子交易,我们来看一下数据:
在这里插入图片描述
在这里插入图片描述
可以看到数据就是简单的二维,一个变量一个自变量的形式,数据并不复杂,暂时我们还不说到数据处理,读题我们就是为了心里有个数。看到这如此简单的数据,心里是真坦荡。

1.2 第二问

读题:
在这里插入图片描述
证明我们上面的策略是最佳策略?那不就是证明我们的策略是最能赚钱的吗,这能怎么证明?应该有一个类似最佳标准。所以目前问题还是主要第一问。

1.3 第三问

读题:
在这里插入图片描述
看到关键词:敏感程度 ,就知道这是一个敏感度分析,因为太常见了,你一定要知道。继续仔细读题,什么的敏感程度?交易成本!交易成本有什么?我们是还不知道那1000美元怎么比例分配的吧,第二问我们就证明出它是个最佳策略了,就是最赚钱的嘛,虽然我们还不知道怎么证明,应该就是控制这个比例,交易成本?是不是还在想把1000美元变成2000,3000?这个没多大意义,跟控制这个比例是一样的。

1.4 第四问

题目说到:传达策略,模型,结果,三点内容。

策略:百度一下股票投资测类,发现是有很多种,我们在第一问应该只是随便选取的一种,投资是有风险的,我们无法证明哪个策略好,风险高的一半回报大,但是亏也有可能大。所以我们可以在这讲一下第一问的策略,在多提出几种方案(百度请)。

模型:再介绍一下模型的优缺点?

结果:把结果贴出来,用自己的语言描述一下。

二、思路和资料查询的正确方法

2.1 思路方法指导

首先给大家说一个产业链坑,很多人一打数学建模比赛就会百度:xx数学建模思路,如果你是小白,那么我建议你可以参考,可以给你提供一个方向,你应该更绝那样的方向去自行搜索更多准确的资料,但是基本都是错误的思路,不要相信它什么985团队,扯犊子的,我们数模圈几乎是没有人有人能给你提供思路,有能力的人不会出来说话,半斤八俩的人就是在网上开始收割韭菜,瞎扯点思路,然后跳转面包多(以后遇到在这里买的,基本都不靠谱),不针对任何人,也不是针对面包多这个产品,我实话实说,所以一定要靠自己,打比赛不要着急,第一天你可能什么思路都没有,你能做的可能都是百度,查到有用的资料就保存起来给团队一起看,大家都觉得好那就一定有用。

上面我说到:百度。我说的百度不是真的让你用百度,这仅仅是因为大多数人用的是百度,百度已经成了搜索的代有名词,我的建议是对你的浏览器换搜索引擎,至少你应该用:bing引擎,最好是使用谷歌引擎。

哪里换浏览器引擎?设置-搜索引擎
在这里插入图片描述
顺便说一下,个人建议浏览器用谷歌浏览器。我一般会怎么搜私聊,如果我是很着急学习一门技术,需要最快时间定位到最好的资料,我会使用谷歌引擎,如果自己没多大需求,我就换回bing引擎。再说一下:谷歌引擎会让你进入全新的学习世界。

比如说我看到这个题就是讲的股票投资,我会如何搜索?

这样?
在这里插入图片描述
不,应该这样:(这是bing引擎)
在这里插入图片描述
这是谷歌搜索:
在这里插入图片描述
看来第一篇很不错,排在越上面,说明质量越好的,多查类似资料,我们可以由此确定方向具体化:量化投资股票。

2.2 第一问思路

根据题目可以看出是要预测,注意预测不要站在上帝视角预测,是根据已有数据预测,所以怎么查资料?
在这里插入图片描述
懂了吧?多参考几篇写得好的,认真阅读,把他们提到的模型拿来改改符合题目要求是不是就可以了?加上股票风险分析之类的,自己搜一下就会了。

2.3 第二问思路

证明策略好坏?那就是对策略好坏做个评价呗。这个确实不知怎么想,所以继续搜索:
在这里插入图片描述
经过多篇文章查询,我们是可以确定到这样一个方法:回测

然后我们会看到这样的标题很符合我们的题目:在这里插入图片描述
认真读一下题,确实很符合,于是我多看了几篇,发现有专门的回测模块,于是就去搜索回测模块,经过查询体验最好的是Backtrader,然后呢就继续学习一下框架吧,就能做出来了,不难的,在这里我给大家展示一个实现代码,会有类似效果:在这里插入图片描述
主要模块安装,其它模块自行安装:

!pip install  backtrader 

模块导入:

# import datetime
from datetime import datetime
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
import backtrader as bt
import backtrader.feeds as btfeeds

获取比特币范围数据:

start = datetime(2016, 9, 11) # or start = '9/12/2016'
end = datetime(2021, 9, 12)
df= web.DataReader('BTC-USD', 'yahoo', start, end)#雅虎财经获取比特币数据
print(df)

在这里插入图片描述
下面以一个简单的单均线策略为例,展示backtrader的使用过程,即当收盘价上涨突破20日均线买入(做多),当收盘价下跌跌穿20日均线卖出(做空):

class my_strategy1(bt.Strategy):
    #全局设定交易策略的参数
    params=(
        ('maperiod',20),
           )

    def __init__(self):
        #指定价格序列
        self.dataclose=self.datas[0].close
        # 初始化交易指令、买卖价格和手续费
        self.order = None
        self.buyprice = None
        self.buycomm = None

        #添加移动均线指标,内置了talib模块
        self.sma = bt.indicators.SimpleMovingAverage(
                      self.datas[0], period=self.params.maperiod)
    def next(self):
        if self.order: # 检查是否有指令等待执行, 
            return
        # 检查是否持仓   
        if not self.position: # 没有持仓
            #执行买入条件判断:收盘价格上涨突破20日均线
            if self.dataclose[0] > self.sma[0]:
                #执行买入
                self.order = self.buy(size=50)         
        else:
            #执行卖出条件判断:收盘价格跌破20日均线
            if self.dataclose[0] < self.sma[0]:
                #执行卖出
                self.order = self.sell(size=100)

股票数据读取:

#先引入后面可能用到的包(package)
import pandas as pd  
from datetime import datetime
import backtrader as bt
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei'] #使用tushare获取浦发银行(代码:600000)数据。
#使用tushare旧版接口获取数据
import tushare as ts 
def get_data(code,start='2016-09-11',end='2021-09-09'):
    df=ts.get_k_data(code,autype='qfq',start=start,end=end)
    df.index=pd.to_datetime(df.date)
    df['openinterest']=0
    df=df[['open','high','low','close','volume','openinterest']]
    return df
dataframe=get_data('600000')

#回测期间
start=datetime(2010, 3, 31)
end=datetime(2020, 3, 31)
# 加载数据
data = bt.feeds.PandasData(dataname=dataframe,fromdate=start,todate=end)

初始化回测系统:

cerebro = bt.Cerebro()

#将数据传入回测系统
cerebro.adddata(data)

把刚刚的交易策略添加进系统:

cerebro.addstrategy(my_strategy1)

设置起始资金1000:

startcash = 1000
cerebro.broker.setcash(startcash)

设置手续费0.1%:

cerebro.broker.setcommission(commission=0.001)

执行:

d1=start.strftime('%Y%m%d')
d2=end.strftime('%Y%m%d')
print(f'初始资金: {startcash}\n回测期间:{d1}:{d2}')
#运行回测系统
cerebro.run()
#获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印结果
print(f'总资金: {round(portvalue,2)}')
print(f'净收益: {round(pnl,2)}')

结果:

初始资金: 1000
回测期间:20100331:20200331
总资金: 887.58
净收益: -112.42

画分析图:

# 画图
cerebro.plot()

在这里插入图片描述
图上标清楚了最终价格,在哪里买和卖。大家对此是否换一下就是我们题目种的要求了呢?

2.3 第三问思路

做一个循环迭代10次嘛,黄金:比特币=1:10到10:1这样比例分配起始金,查看变化程度就行了,巴蒂尔问的代码改成循环就好了。最后说明一下就好了。

2.4 第四问思路

备忘录,就是我前面读题的想法。(仅仅个人见解)

三、数模资料

扎实基础就行,现学现卖也不很难,当然可以看看姜启源,司空奎等人的书,我也经常研究他们的书,虽然不一定用得到,思维能有所提升。

也可以关注公众号:玩转大数据 菜单栏点击:美赛 获取我的这些资料。

关注我一下吧,有问题留言指正,谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_46211269/article/details/123080269
今日推荐