目录

1.前言

2.准备工作

(1)题目分析:

提供的数据集

问题

3.解题思路:

(1)第一问解题思路

4.代码实现

(1)第一题部分代码


1.前言

之前和男朋友一起学完了数据挖掘的相关框架,决定要找一些题目来实战,偶然之下发现了这个比赛,于是在官网上找到了第一届比赛的赛题。本来想做B题的,但是B题是属于开放式数据集题目,为了更好的练习如何处理随机的原始数据集,所以,在商讨之后决定拿A题来作为练习题。

由于是第一次接触金融数据,也是学数据挖掘以来的第一次实战,所以,如果有错误的地方,请大家赐教,多多包含。那么就让我们开始吧!

2.准备工作

题目压缩包可以在我的百度网盘上进行下载:

链接:https://pan.baidu.com/s/1AN2NP1_w_i72bC_vtNU2qw?pwd=bxx3
提取码:bxx3

(1)题目分析:

提供的数据集:

题目中给我们提供了两个数据文件,分别是30支股票从2011年到2020年的行情数据,以及大湾区2011年到2020年的大湾区指数行情数据。

可以看到数据提供了股票代码(code)、当日开盘价格(open)、当日最高交易价格(high)、当日最低交易价格(low)、当日收盘价格(close)、当日交易量(volume)、当日交易额(amount) 的数据。

(30支股票数据与大湾区行情给出的数据类型相同)

问题:

问题剖析:

概括:题目中一公司给出了一种投资策略,即每周在30支股票中选取10支强势股票来进行投资,且每周一换仓(即卖出所有股票再买入上一周的强势股票)。

要求:将周一的收盘价格(close)作为准考虑收益,每只股票投资额固定为本金10%,手续费按万分之2.5计算。

第一小题:计算该投资策略的收益率曲线,并与大湾区指数

第二小题:调仓时间不变,调整单支股票投资额,找到最优的投资策略并绘制收益率曲线

第三小题:调仓时间不变,单只股票投资额定为本金10%,根据市场数据建模,得出自己的投资策略。

第四小题:调仓时间和投资额灵活变化,根据市场数据建模,得出自己的投资策略。(3个工作日完成建仓,仓位不低于50%,单支股票不超过总资产10%)

3.解题思路:

先做了第一、二题的分析,经过讨论,大致解题思路出来了(PS:打比赛队伍之内的讨论真的非常重要)

(1)第一问解题思路:

首先,我们需要搞清楚一个金融概念——收益率。

经过查找资料,我们知道收益率公式为:

收益率=收益额/原始投资额

又由于题目要求,将周一的收盘价格(close)作为准考虑收益,每只股票投资额固定为本金10%,手续费按万分之2.5计算。所以我们暂时将收益率公式抽象为以下代码:

price = open -  open * (0.000025) #单支投资额
interest = ((close-open)/price ) * 100 # 利益率

这个时候,我的队友突然问了一个问题——本金怎么算,在经过商量之后,我们决定将本金定为10万

为什么不可以直接将建仓时10支单股股票的总购买价定为本金呢?因为观察发现这30支股票的开盘价格从25元到110元左右不等,如果将10支单股股票的总购买价,若建仓时十支股票价格都是20-30元,那么第二周需要购买另10支股票时,可能会出现本金不够,无法购买的情况。为了避免这种情况出现,我们索性将本金定为10万,再根据要求将每支股票投资额定为本金的10%(即每支股票原始投资额为1万)。

这样一来,本金的问题就解决了。最终利益率抽象后公式为:

'''
power是单支股票的总收益额
price是购买单支股票的总入手价格
Interest是收益率
stocnum是本金能够购买的单支股票股数
principal是本金
'''
principal=100000
stocnum = int((principal / 10) / opendata[i])
power = (opendata1[i] - opendata[i]) * stocnum
price = (stocnum * opendata[i]) - (stocnum * opendata[i]) * (0.000025)
Interest = (sum(powerdata) / sum(pricedata)) * 100

在解决收益率的计算方法之后,后面的讨论基本都非常顺畅。

思路如下:
(1)3个工作日建仓:通过计算3天中第三天的收盘价格减去第一天的开盘价格作为收益,选取收益最高的10支股票用于建仓

(2)将30支股票数据剥离出来并另外保存:读取30支股票行情数据的,并对其进行切片,将30支股票从原始csv文件中分离出来并保存,方便后期读取

(3)将每周周一的收盘价和开盘价数据进行截取:由于我们需要利用每周一的收盘价和开盘价来计算每周的收益率,并由此决定下一周需要投资的10支强势股票,所以可以先将股票数据以每周作为阶段进行切片,再通过iloc方法将数据中每周的数据截取其中周一的close和open,将每周30支股票的周一数据拿出来。

(4)计算每周的强势股票:创建一个函数,调用(3)中函数,获取当周的30支股票周一收盘价和开盘价数据,用于计算当周每支股票的收益率,选取收益率最高的10支作为强势股票,作为下一周数据的投资股票,返回值为每周的强势股票股代码。在主函数中循环该函数,可以得到每周的强势股票数据。

(5)计算每周投资的利益率:创建一个函数,将(3)中数据和(4)中数据加入,将每周10支强势股票的股票代码与30支股票的周一数据进行键值匹配,得到每周10支股票周一的数据,用于计算每周的10支股票数据的利益率。

(6)用利益率数组绘制折线图:其中横坐标是年份(2011-2020)

4.代码实现

(1)第一题部分代码

分离30支股票数据,并保存:

import pandas as pd# 读取数据并进行初步处理
def read_csv_shuju(path):''':param path:path:文件路径:return:data2: 处理后数据'''data1 = pd.read_csv(path, sep=',')data1['date'] = pd.to_datetime(data1['time'])data1['date']=data1['date'].dt.datedata2 = data1.drop([ 'time','volume', 'amount', 'open_interest'], axis=1)data2.set_index('code', inplace=True)states = ['date','open', 'hight', 'low', 'close']data2.reindex(columns=states)return data2# 对数据进行分割并保存
def write_csv_data(data,start,code):''':param:data:需要分割的原始数据start:上一次调用所到数据(每次输入时需要修改start的值为上一次输出的end值)code:输入需要分割的数据的股票名称:return: 根据输入的股票名称截取股票数据所在的列范围数据'''stock_code=[]end=0end+=startfor i in range(end,len(data.index)):if data.index[i] == code:end+=1else:continuestock_code=data[start:end]return end,stock_codeif __name__ == '__main__':'''stock_data为读取后初步处理数据(未分割)stock_code为对数据按照股票代码进行分割后数据'''# 文件路径path1 = '../data/附录一:30支股票行情.csv'stock_data = read_csv_shuju(path1)print("初步处理数据:")print(stock_data)# print(len(stock_data.index))# print(stock_data.index[69696])'''# 这里需要手动修改参数,依次分割30支股票需要修改的参数:start: 修改为上一次输出的end值code: 修改为需要分割出来的股票代码文件名: 存入csv时的路径文件名'''end=0start=67431code='szse.000028'stock_code=[]end,stock_code=write_csv_data(stock_data,start,code)# stock_code.to_csv('./code_data/30.csv')print('分割后股票数据:')print(stock_code)print(stock_code.index)print('end:')print(end)

建仓函数:

def Stock_position_building():   '''size_code:30支股票的编号first_data:存取读取30支股票的利润data1:将其股票编号和利润变成一维数组data2:将其股票利润排序data3:选取前十支股票data4:十支优势股票的收市''' size_code = ['002027','300014','002475','000636','002449','600183','000049','002138','300115','600325','000069','600383','600048','001914','601318','600323','002152','000921','002035','000651','002233','002060','002352','002511','002303','002461','600872','600332','000513','000028']first_data,first_close = first_cycle_csv()first_close_df=pd.Series(data=first_close,index=size_code)data1 = pd.Series(data=first_data,index=size_code)data2 =data1.rank(method='average',ascending=False).sort_values()data3 = data2[0:11]data_x = first_close_df.loc[data3.index]print(data_x)return data_x
def first_cycle_csv():"""first_data:用于存储利益数据path:用于地址(有循环)cut-up:读取data的前2-4条数据close:最后一天闭市的数据open:最初开始的数据"""first_data = []first_close = []for i in range(1,31):path = './data_process/code_data/'+str(i)+'.csv'data1 = pd.read_csv(path,sep=',')cut_up = data1.iloc[1:4]open = cut_up.iloc[0,2]close = cut_up.iloc[2,5]profit  = close - openfirst_data.append(profit)first_close.append(close)return first_data,first_close

获取每周10支强势股票的数据:

def cycle_csv(a):'''param:  a是切片开始日期'''date_data=shuzu().dt.datepower=[]state = ['open','close','code']open_data=[]for i in range(1,31):list_data2 = []list2_data1=[]path = './data_process/code_data/'+str(i)+'.csv'data1 = pd.read_csv(path,sep=',')data1.set_index(['date'],inplace=True)data2 = date_data[a:a+7]for j in data2:j = str(j)list_data2.append(j)for k in data1.index:k= str(k)if k in list_data2:list2_data1.append(k)else:continuedata_x =data1.loc[list2_data1,state]open = data_x.iloc[0,0]close = data_x.iloc[len(data_x.index)-1,1]power_data= close - openpower.append(power_data)open_data.append(open)'''size_code:30支股票的编号first_data:存取读取30支股票的利润data1:将其股票编号和利润变成一维数组data2:将其股票利润排序data3:选取前十支股票''' size_code = ['002027','300014','002475','000636','002449','600183','000049','002138','300115','600325','000069','600383','600048','001914','601318','600323','002152','000921','002035','000651','002233','002060','002352','002511','002303','002461','600872','600332','000513','000028']data_1 = pd.Series(data=power,index=size_code)data_2 =data_1.rank(method='average',ascending=False).sort_values()data_3 = data_2[0:10]open_data2=pd.Series(data=open_data,index=size_code)# print(open_data2)# print(data_3)return  data_3,open_data2

计算利益率:

def interest_rate(a,principal,front_stock):'''param:a是切片日期principal是设置的本金front_stock是上周的10支强势股票'''if a > 3584:stockwinner, stockopen30 = cycle_csv(a)opendata = stockopen30.loc[front_stock.index]else:stockwinner, stockopen30 = cycle_csv(a)stockwinner2, stockopen30_2 = cycle_csv(a + 7)opendata = stockopen30.loc[front_stock.index]opendata1 = stockopen30_2.loc[front_stock.index]# print(opendata)# print(opendata1)powerdata = []  # 用于保存利益pricedata = []  # 用于保存购入价格for i in range(10):stocnum = int((principal / 10) / opendata[i])# print(stocnum)power = (opendata1[i] - opendata[i]) * stocnumprice = (stocnum * opendata[i]) - (stocnum * opendata[i]) * (0.000025)powerdata.append(power)pricedata.append(price)# allprice.append(sum(pricedata))# allpower.append(sum(powerdata))Interest = (sum(powerdata) / sum(pricedata)) * 100# print(Interest)return Interest

python金融量化初体验——2020年“大湾区杯”金融数学建模比赛A题《大湾区指数增强策略》刷题总结(持续更新中)相关推荐

  1. 太原市山大附中2021年高考成绩查询,【高考喜报】2019年太原市高中学校高考喜报(持续更新中……)...

    原标题:[高考喜报]2019年太原市高中学校高考喜报(持续更新中--) 现将太原市各校高考喜报整理如下,供大家参考. 目前收集到的学校有: 山西大学附属中学.太原五中.山西省实验中学.太原市知达常青藤 ...

  2. 2020年9月份华为杯研究生数学建模C题

    报名 总共3个小组成员,超越cy队还有一位指导老师 下载压缩包文件,是MD5加密的 试题发布以后会有MD5码可以解密之前下载的题. 开始分析题目并建模 1 小组讨论,分析每个题,然后选题. 2 我们小 ...

  3. 风变编程有c语言吗,风变编程Python小课初体验:用有趣好玩的方式学编程

    原标题:风变编程Python小课初体验:用有趣好玩的方式学编程 经过约一个月时间的学习,今天,我终于学完风变编程Python小课的Python基础语法课程啦!从零基础的"小白"到现 ...

  4. 2020云栖大会奖品大盘点(持续更新中)

    简介:2020云栖大会开发者游乐园正在火热进行中,但是阿里妹听到有许多开发者表示,不知道这次开发者游乐园都有哪些礼品,或是不知道上哪赢取.阿里妹决定为你带来一篇最全的开发者奖品大盘点!奖品持续更新中, ...

  5. 南昌二中高考2021成绩查询,2020年江西南昌各大高中学校高考喜报出炉,持续更新中……...

    7月23日,江西省2020高考成绩出炉,文理科状元皆来自南昌. 2020年江西省高考状元 文科:杨诗雨 分数:671分 学校:江科附中 理科:尹天骥 分数:705分 学校:南昌二中 目前,南昌各高中学 ...

  6. 量化交易之指数增强策略

    不断地学习,才能使我们变得更加强大 指数增强策略概念:指数增强策略是以对标的股市基准指数(如沪深300.中证500.中证1000)作为参考,在追踪对标股市基准指数的前提下,利用量化投资的方式进行主动管 ...

  7. ECharts数据可视化项目-大屏数据可视化【持续更新中】

    ECharts数据可视化项目-大屏数据可视化[持续更新中] 文章目录 ECharts数据可视化项目-大屏数据可视化[持续更新中] 一. 数据可视化ECharts使用 二.技术栈 三.数据可视化 四.可 ...

  8. 2020年拼多多校招面试题及答案-最全最新-持续更新中(2)

    大家好我是好好学习天天编程的天天 一个整天在互联网上种菜和砍柴的程序员~ 2020年拼多多校招面试题及答案-最全最新-持续更新中(2) 2020年拼多多校招面试题一面 2020年拼多多校招面试题一面- ...

  9. 2020年第十届亚太地区大学生数学建模

    2020年第十届亚太地区大学生数学建模竞赛 比赛时间为11月26日至11月30日 一等奖占5%,二等奖占15%,三等奖占25%,本人不才,一次二等奖,一次一等奖,在校参加数学建模比赛十余次,具有相当丰 ...

最新文章

  1. 苹果状态栏HTML,CSS3实现苹果电脑的DOCK菜单栏_html/css_WEB-ITnose
  2. php worker,问题 php不支持worker工作模式的报错
  3. linux系统服务设置命令--chkconfig命令参数及用法详解
  4. 五年从P5到P8,在阿里学做个靠谱的人
  5. php小程序码生成并保存,小程序中如何生成小程序码
  6. 如果有轮回,又为何一定要抹去前世记忆?
  7. 开源项目halo个人博客源码学习初篇(一)
  8. android常用刷机指令,【高级技术】Android刷机常用adb指令集合
  9. samba 指定的网络名不再可用
  10. 解决oracle出现the account is locked问题以及出现not logged on
  11. ie禁用java怎么办,您如何解决IE中禁用javascript的问题?
  12. 数学在计算机方面的应用论文参考文献,数学论文参考文献
  13. 研究意识问题为什么如此困难
  14. python培训总结心得
  15. 勿忘2022,迎接2023
  16. 输入年份和月份,求该月有多少天
  17. 应用程序迁移_加速绿色IT-关于应用程序迁移和重新托管的实用指南
  18. 脸萌创始人郭列:准备好做一颗流星
  19. 用友二次开发之总账自定义结转
  20. BSC,MSC,HLR的作用

热门文章

  1. SAP S4 HANA 年结汇总数据
  2. android 文字闪烁效果,Android Shader应用开发之霓虹闪烁文字效果
  3. 幼年产品狗如何养成?这是完全自我修炼教程!
  4. feko学习day1
  5. 计算机书籍(必看推荐)
  6. 关于ARM Cortex a 系列的看门狗定时器
  7. java入门之 画板及画板重绘(详细版)
  8. JD Edwards 演进史
  9. 【乔布斯走了】别太熬夜了,身体没了,事业算啥,防癌16条
  10. ZYNQ7000引脚-个人理解