好友
阅读权限10
听众
最后登录1970-1-1
|
接着来,上回咱们已经取得了股票代码,接下来要把通达信的本地数据给取出来。
因为通达信的本地数据是二进制文件,所以要用到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()
转换完后,如下图:
对应文件里的数据,如下图:
有了这些数据,以后就可以计算各种指标,比如MA均线,MACD等,也可以回测策略了,之后有时间我们再唠怎么实现。
【tips】- pandas库 这个库很重要,需要多用多了解
multiprocessing库 区分一下多进程和多线程的不同,它们各自的优势是啥,python的GIL锁是个啥,思考在python中怎样提高程序执行的效率- 掌握一些股票指标,如JDK,MACD,MA,EMA 是怎样计算出来的 思考一下自己通过这些数据怎样高频计算能筛选出来心仪的股票
我的颈椎病又开始痛了,去休息了,晚安各位。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|