Python 实现股票交易信息统计(数学建模推导计算编程实现)

Python + 数学建模

创作背景

逢周末休息,下午去剪头一资生院的打数模的学长问我一些python的问题,后来我一看感觉简单就答应帮学长做了,后来发现要求很多,很复杂,毕竟有上百组的数据要处理。
然后写到一半发现是为了计算结果,不是为了要代码,然后中途想转C++去实现(毕竟相对python来说C++还是熟悉太多,况且那会很自闭,备选庄家都没找到呢那会。)后来发现用C++也有困难的地方,就是名字中文的问题,问了半天舍友(C++dl,泽神)还是没有想出储存名字的好方法,然后就后来直接硬着头皮上了,接着用python,发现真的python的变量容错性好高,啥都能储存在一个变量里(有错的话dl指出,自己菜不知道见解对不对)
最后连着肝了六个小时的样子,就是这样,下面是这个整理

题目背景

给出如下表单
在这里插入图片描述

step1. 表单中筛选VIP单位(三个排名均上榜)→ 备选庄家;

step2. 备选庄家中找到(持仓量/成交量)大于Avg的VIP单位 → 主力庄家;

step3. ITS = (持买单量-持卖单量)/(持买单量+持卖单量)

解决方案

  • 使用xlrd进行从excel中读取信息
  • 使用xlwt进行将数据写入excel
  • 定义class类来记录所有公司的成交量,持买持卖
  • 使用item来对从表格中存储的数据进行
  • 使用var来对表格中的部分数据进行处理(如在中信期货的成交量是4,098,就要想办法半中间的逗号删去。)中间这一部分卡了有将近半小时才发现是因为这个的原因,查资料改正又画了半小时左右。改正方法是利用转换为var,然后将中间的“,”去掉即可。
  • 利用矩阵存放类的对象成员。(一开始头昏脑热一直以为存的是结构体成员,人都傻了查了了半天才发现自己用的是class,而且python根本没有struct)

代码部分

由于时间仓促,代码可以说太零散太分散了,有的很赘余,还有将近一半调试代码,真正起作用的也就一百来行。
好多语法都是现学现编,感觉原来都不知道的那种

import xlrd
import xlwt

data=xlrd.open_workbook('20190107_i1909.xls')
table=data.sheets()[0]

class company1:
    def _init_(self,name,val,change):
        self.Name = name
        self.Val = val
        self.Change = change
# c1 = [company1]*25
c1 = [company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1()]

class company2:
    def _init_(self,name,val,change):
        self.Name = name
        self.Val = val
        self.Change = change
# c2 = [company2]*25
c2 = [company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2()]

class company3:
    def _init_(self,name,val,change):
        self.Name = name
        self.Val = val
        self.Change = change
# c3 = [company3]*25
c3 = [company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3()]

for i in range(1000):
    c1.append(company1)
    c2.append(company2)
    c3.append(company3)

nrows = table.nrows
ncols = table.ncols
data_list = []

tem_list = []

for i in range(ncols+12):
    if i == 1:
        tem_list.extend(table.row_values(i))
    if i >= 4:
        data_list.extend(table.row_values(i))
cnt = cnt1 = cnt2 = cnt3 = 1

total_cnt = 1
average = 0
for item in tem_list:
    if total_cnt == 2:
        var5 = item
        if var5[1] == ',':
            var5 = var5[:1] + var5[2:]
        if var5[2] == ',':
            var5 = var5[:2] + var5[3:]
        print var5
        average += int(var5)
    if total_cnt == 4:
        var5 = item
        if var5[1] == ',':
            var5 = var5[:1] + var5[2:]
        if var5[2] == ',':
            var5 = var5[:2] + var5[3:]
        print var5
        average += int(var5)
    if total_cnt == 6:
        var5 = item
        if var5[1] == ',':
            var5 = var5[:1] + var5[2:]
        if var5[2] == ',':
            var5 = var5[:2] + var5[3:]
        print var5
        average =float(average*1.0/int(var5))
    total_cnt += 1


for item in data_list:
    print item


for item in data_list:
    # print cnt
    # print cnt1
    # print cnt2
    # print cnt3
    # print "^^^^^^^^^^"
    if cnt == 3:
        var56 = item

    if cnt % 12 == 2:
        c1[cnt1].Name = item
    if cnt % 12 == 3:
        var1 = item
        if var1[1] == ',':
            var1 = var1[:1]+var1[2:]
        c1[cnt1].Val = int(var1)
    if cnt % 12 == 4:
        c1[cnt1].Change = item
        cnt1 += 1
    if cnt % 12 == 6:
        c2[cnt2].Name = item
    if cnt % 12 == 7:
        var2 = item
        if var2[1] == ',':
            var2 = var2[:1]+var2[2:]
        c2[cnt2].Val = int(var2)
    if cnt % 12 == 8:
        c2[cnt2].Change = item
        cnt2 += 1
    if cnt % 12 == 10:
        c3[cnt3].Name = item
    if cnt % 12 == 11:
        var3 = item
        if var3[1] == ',':
            var3 = var3[:1] + var3[2:]
        c3[cnt3].Val = int(var3)
    if cnt % 12 == 0:
        c3[cnt3].Change = item
        cnt3 += 1
    # print item
    cnt += 1


for i in range(1,21):
    print i
    print c1[i].Name
    print c1[i].Val
    print c1[i].Change
    print "***********"
    print c2[i].Name
    print c2[i].Val
    print c2[i].Change
    print "***********"
    print c3[i].Name
    print c3[i].Val
    print c3[i].Change
    print "------------------------------"

# print "check   "
# print c2[2].Val
# print c3[3].Val
# print int(c2[2].Val)+int(c3[3].Val)

pre_banker = []
pre_banker_chengjiao = []
pre_banker_num = 0
is_pre_banker = [1]*21
for i in range(1,21):
    for j in range(1,21):
        if c2[j].Name == c1[i].Name:
            is_pre_banker[i] += 1
for i in range(1,21):
    for j in range(1,21):
        if c3[j].Name == c1[i].Name:
            is_pre_banker[i] += 1
# print "!!!!!!!!!!!!!!!"
for i in range(1,21):
    # print i
    # print is_pre_banker[i]
    if is_pre_banker[i] == 3:
        pre_banker_num += 1
        pre_banker.append(c1[i].Name)
        pre_banker_chengjiao.append(c1[i].Val)

total_hold = [0]*20
its_fenzi = [0]*20
its_fenmu = [0]*20
its = [0]*20
for i in range(pre_banker_num):
    for j in range(1,21):
        if pre_banker[i] == c2[j].Name:
            total_hold[i] += c2[j].Val
            its_fenzi[i] += c2[j].Val
            its_fenmu[i] += c2[j].Val
    for j in range(1,21):
        if pre_banker[i] == c3[j].Name:
            total_hold[i] += c3[j].Val
            its_fenzi[i] -= c3[j].Val
            its_fenmu[i] += c3[j].Val
    its[i] = float(its_fenzi[i]*1.0/its_fenmu[i])
    total_hold[i] = float(total_hold[i]*1.0/pre_banker_chengjiao[i])

final = 0
final_banker = [0]*20
final_banker_its = [0]*20
# print "pre_banker_num total"
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)
for i in range(pre_banker_num):
    if total_hold[i] >= average:
        print pre_banker[i]
        print total_hold[i]
        print its[i]
        sheet1.write(0, i, pre_banker[i])
        sheet1.write(1, i, its[i])
        print "^^^^^^^^^^^^^^^^^^^^^^"
        final_banker.append(pre_banker[i])
        print final_banker[final]
        final_banker_its.append(its[i])
        print final_banker_its[final]
        final += 1

f.save('0107.xls')
# for i in range(final):
#     print final_banker[i]
#     print final_banker_its[i]
#     sheet1.write(0, i, final_banker[i])
#     sheet1.write(1, i, final_banker_its[i])
# print final

#
#
#



# class company1:
#     def _init_(self,name,val,change):
#         self.Name = name
#         self.Val = val
#         self.Change = change
# c1 = [company1(),company1(),company1()]
# # c1 = []
# # for i in range(1,24):
# #     c1.append(company1)
#
# c1[1].Name = "name2"
# c1[1].Val = 200
# c1[1].Change = 24
#
# c1[0].Name = "name1"
# c1[0].Val = 100
# c1[0].Change = 12
#
# c1[2].Name = "name3"
# c1[2].Val = 300
# c1[2].Change = 48
#
# for i in range(0,3):
#     print i
#     print c1[i].Name
#     print c1[i].Val
#     print c1[i].Change
#     print "----------"


# print var56
# print var56[1]
# if var56[1] == ',':
#     var56 = var56[:1]+var56[2:]
# a = int(var56)
# print a
# if var56[]
# for i in range(var56):
#     o = 1


# print ";;;;;;;;;;;;;;"

补个运行结果
这个是最一开始筛选出备选庄家(随便截取的,可能与样例表单中的数据不匹配)
在这里插入图片描述

这个图是筛选出了最后的庄家,下面那一行是持仓/成交,再下边那一行是its
在这里插入图片描述


2020.1.12补充
这种数据结构,那元组和字典做他不香吗,,,省着再用class来实现公司了,直接通过元组的固定结构来放一个公司的固定量(公司名称、),然后通过字典来对应每个需要后续计算的元素的值(如果多的话list[]索引往里边堆叠即可)……可能往后还能想到更好的数据结构来表示

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学建模是一种通过数学方法来解决实际问题的过程。在数学建模中,找到合适的模型是关键,而不是手写算法求解。因此,使用Python进行数学建模是一个很好的选择。Python拥有丰富的包和库,可以轻松地进行数学建模。通过使用这些包,可以快速下载和使用各种功能强大的工具。使用Python进行数学建模可以提高效率,并且可以避免手写算法时可能出现的错误。同时,Python的语法简单易懂,使用起来非常流畅。因此,使用Python进行数学建模是一个简单而有效的方法。\[1\]\[2\] 在Python中,可以使用各种包来进行数学建模。例如,如果想要进行二次插值,可以使用matplotlib、numpy和scipy包。下面是一个使用这些包进行二次插值的示例代码: ```python import matplotlib import numpy as np from matplotlib import pyplot as plt from scipy import interpolate font = { "family": "Microsoft YaHei" } matplotlib.rc("font", **font) # 创建数据点集 x = np.linspace(0, 10, 11) y = np.sin(x) # 得到插值函数 f = interpolate.interp1d(x, y, kind='quadratic') # 新数据 x_new = np.linspace(0, 10, 101) y_new = f(x_new) # 可视化 plt.plot(x, y, 'o', x_new, y_new, '-') plt.show() ``` 这段代码使用了matplotlib包来进行可视化,numpy包来处理数值计算,scipy包中的interpolate模块来进行插值计算。通过这些包的组合,可以方便地进行数学建模,并得到想要的结果。\[3\] #### 引用[.reference_title] - *1* *2* [使用python进行数学建模系列1 读表格 +简单处理+ 画图简单入门 代码可直接运行](https://blog.csdn.net/m0_62579137/article/details/126487961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python数学建模系列(四):数值逼近](https://blog.csdn.net/weixin_44225182/article/details/119922826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值