rikoukai 发表于 2020-11-16 22:39

用python抄抄股-02

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

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


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)# 按照给定的格式解析字节流,返回解析出来的tuple-这里是buf
            year = int(a / 10000)# 定义一个变量year,把a处理后给year
            m = int((a % 10000) / 100)# 定义一个变量m,把a求模后除以100处理后给m
            month = str(m)# 把m格式化为字符串
            if m < 10:# 如果m小于10
                month = "0" + month# 加一个字符‘0’
            d = (a % 10000) % 100# 得到日期
            day = str(d)# 把日期赋值给day变量
            if d < 10:# 如果d小于10
                day = "0" + str(d)# 就在前面加零
            dd = str(year) + "-" + month + "-" + day# 整合年月日为日期
            openPrice = a / 100.0# 把a列表中的第二个数值取出来计算,赋给开盘价格openPrice
            high = a / 100.0# 把a列表中的第三个数值取出来计算,赋给最高价格high
            low = a / 100.0# 把a列表中的第四个数值取出来计算,赋给最低价格low
            close = a / 100.0# 把a列表中的第五个数值取出来计算,赋给收盘价格close
            amount = a# 把a列表中的第六个数值取出来赋给amount,这个变量是成交金额,是当前价与vol的乘积
            vol = a# 把a列表中的第七个数值赋给成交量vol
            unused = a# 把a列表中的第八个数值取出赋给unused,不用这个数据
            if i == 0:
                preClose = close# 先前价格就是当前价格
            ratio = round((close - preClose) / preClose * 100, 2)# ratio是涨跌率,是当天收盘价格减去昨天收盘价格,再除以昨天的收盘价格,乘以100,然后把这个数值四舍五入,精确到小数点后面2位
            preClose = close# 当天收盘价格赋值给前一天收盘价格
            item = # 建一个列表,把前面的变量放进去。
            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库
      with multiprocessing.Pool() as pool:
            pool.map(self.exactStock,FILE_LIST[:])
      pool.close()
转换完后,如下图:

对应文件里的数据,如下图:

有了这些数据,以后就可以计算各种指标,比如MA均线,MACD等,也可以回测策略了,之后有时间我们再唠怎么实现。


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


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

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

这样操作下去,中国股神即将横空出世!!!{:1_893:}

郭小生 发表于 2020-11-17 09:09

楼主厉害啊,超越马云指日可待

字数补丁 发表于 2020-11-17 09:36

支持大佬,但愿此系列不会中途中断{:1_919:}

guoqudefeng 发表于 2020-11-17 09:42

在出差,回家试试

mabotoo 发表于 2020-11-17 10:35

楼主厉害,希望继续更新
页: [1] 2 3 4
查看完整版本: 用python抄抄股-02