吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3864|回复: 32
收起左侧

[Python 转载] 用python抄抄股-02

  [复制链接]
rikoukai 发表于 2020-11-16 22:39
接着来,上回咱们已经取得了股票代码,接下来要把通达信的本地数据给取出来。
因为通达信的本地数据是二进制文件,所以要用到struct库(处理二进制数据用)。
通达信本地数据里每个文件(.day)对应一个股票,文件里面是32位为单元的结构(每32位其实就是一个交易日的历史数据),32位里包含了8个数值。
分别是date, open, high, low, close, amount , vol, unused(保留位,无用)
用这些字段数据我们可以算出每日的涨跌幅度ratio,

原本代码是封装在类里的,但一下都拷贝出来太长了,还是按模块拷贝出来吧。


[Python] 纯文本查看 复制代码
from struct import *  #字节流,处理二进制数据 

 def exactStock(self, filepath):  # 定义一个函数
        '''处理二进制数据'''

        code = filepath[-12:-4]
        ofile = open(filepath, 'rb')  # 打开文件,rb:只读二进制文件
        buf = ofile.read()  # 把文件读入到buf中
        ofile.close()
        num = len(buf)  # 得到文件的长度,存入num变量中
        no = num / 32  # 把num除以32,通达信的数据文件是32位为单元的结构
        b = 0  # 定义一个变量b,初始化为0
        e = 32  # 定义一个变量e,初始化为32
        items = list()  # 定义一个空列表items

        for i in range(int(no)):  # 把简单格式化的数据放入for循环,开始逐个读入。
            a = unpack('IIIIIfII', buf[b:e])  # 按照给定的格式解析字节流,返回解析出来的tuple-这里是buf[0:32]
            year = int(a[0] / 10000)  # 定义一个变量year,把a[0]处理后给year
            m = int((a[0] % 10000) / 100)  # 定义一个变量m,把a[0]求模后除以100处理后给m
            month = str(m)  # 把m格式化为字符串
            if m < 10:  # 如果m小于10
                month = "0" + month  # 加一个字符‘0’
            d = (a[0] % 10000) % 100  # 得到日期
            day = str(d)  # 把日期赋值给day变量
            if d < 10:  # 如果d小于10
                day = "0" + str(d)  # 就在前面加零
            dd = str(year) + "-" + month + "-" + day  # 整合年月日为日期
            openPrice = a[1] / 100.0  # 把a列表中的第二个数值取出来计算,赋给开盘价格openPrice
            high = a[2] / 100.0  # 把a列表中的第三个数值取出来计算,赋给最高价格high
            low = a[3] / 100.0  # 把a列表中的第四个数值取出来计算,赋给最低价格low
            close = a[4] / 100.0  # 把a列表中的第五个数值取出来计算,赋给收盘价格close
            amount = a[5]  # 把a列表中的第六个数值取出来赋给amount,这个变量是成交金额,是当前价与vol的乘积
            vol = a[6]  # 把a列表中的第七个数值赋给成交量vol
            unused = a[7]  # 把a列表中的第八个数值取出赋给unused,不用这个数据
            if i == 0:
                preClose = close  # 先前价格就是当前价格
            ratio = round((close - preClose) / preClose * 100, 2)  # ratio是涨跌率,是当天收盘价格减去昨天收盘价格,再除以昨天的收盘价格,乘以100,然后把这个数值四舍五入,精确到小数点后面2位
            preClose = close  # 当天收盘价格赋值给前一天收盘价格
            item = [code, dd, str(openPrice), str(high), str(low), str(close), str(ratio), str(amount), str(vol)]  # 建一个列表,把前面的变量放进去。
            items.append(item)  # 把循环得到的item,放进items变量
            b = b + 32  # b是二进制文件的位变化
            e = e + 32  # e是二进制文件安装多少位来变化

        mypd = pd.DataFrame(items, columns=['code','date','open','high','low','close','ratio','amount','vol'])

        # 前一个收盘价
        mypd['pre_close'] = mypd['close'].shift(1)

        mypd.to_csv(CSV_DAILY_PATH + os.sep + filepath[-12:-4]  + '.csv', print(mypd)
        return mypd  # 返回items,里面就是转换后的数据

这个方法函数需要一个filepath参数,是一个通达信本地数据的绝对路径。
为了实现自动批量处理转换文件,咱们得生成一个list,存放着通达信每个本地数据的绝对路径。(别忘了sh和sz在不同的文件路径中,思考一下怎么实现?)

最后一步,实现了自动批量处理转换文件,咱们得给程度提高效率,用多进程完成,multiprocessing.Pool().map()第1个参数是转换函数,第2个是存放着通达信每个本地数据的绝对路径列表。
用multiprocessing库
[Python] 纯文本查看 复制代码
        with multiprocessing.Pool() as pool:
            pool.map(self.exactStock,FILE_LIST[:])
        pool.close()

转换完后,如下图:
5.jpg
对应文件里的数据,如下图:
6.jpg
有了这些数据,以后就可以计算各种指标,比如MA均线,MACD等,也可以回测策略了,之后有时间我们再唠怎么实现。
7.jpg

【tips】
  • pandas库 这个库很重要,需要多用多了解

  • multiprocessing库 区分一下多进程和多线程的不同,它们各自的优势是啥,python的GIL锁是个啥,思考在python中怎样提高程序执行的效率
  • 掌握一些股票指标,如JDK,MACD,MA,EMA  是怎样计算出来的     思考一下自己通过这些数据怎样高频计算能筛选出来心仪的股票


我的颈椎病又开始痛了,去休息了,晚安各位。

免费评分

参与人数 8吾爱币 +14 热心值 +7 收起 理由
qqq111qq + 1 + 1 谢谢@Thanks!
ggiff + 1 用心讨论,共获提升!
agi学习者 + 1 + 1 用心讨论,共获提升!楼主真棒~加油~
killua2011 + 1 + 1 热心回复!
mabotoo + 1 + 1 用心讨论,共获提升!
字数补丁 + 1 + 1 用心讨论,共获提升!
SakuraYaaa + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

chentest 发表于 2020-11-17 09:46
想把 金融 ,股票 投资与人工智能结合起来,实现最大化效益的自动化投资。
 楼主| rikoukai 发表于 2020-11-18 19:49
吾爱_欢迎您 发表于 2020-11-18 18:36
对 我就想知道 我下载好的五分钟数据 如何转换出来

可以用pandas中的resample方法
这个方法里面是个freq参数,可以设置采样频率。
思路大致如下:
open取第一个值
high取最大值
low取最小值
close取最后一个值
vol取和
代码:
        period_stock_data['open'] = pdfile['open'].resample(period_type).first()
        period_stock_data['high'] = pdfile['high'].resample(period_type).max()
        period_stock_data['low'] = pdfile['low'].resample(period_type).min()
        period_stock_data['close'] = pdfile['close'].resample(period_type).last()
        period_stock_data['amout'] = pdfile['amout'].resample(period_type).sum()
        period_stock_data['vol'] = pdfile['vol'].resample(period_type).sum()
陌小林 发表于 2020-11-17 00:14
o824 发表于 2020-11-17 00:17
先收藏了 等待你最终完成的结果
大爷你好啊 发表于 2020-11-17 07:21
看不懂这个是做什么的
yyd841122 发表于 2020-11-17 08:02
这样操作下去,中国股神即将横空出世!!!
郭小生 发表于 2020-11-17 09:09
楼主厉害啊,超越马云指日可待
字数补丁 发表于 2020-11-17 09:36
支持大佬,但愿此系列不会中途中断
guoqudefeng 发表于 2020-11-17 09:42
在出差,回家试试
mabotoo 发表于 2020-11-17 10:35
楼主厉害,希望继续更新
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表