600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 量化交易学习:交易数据自动抓取

量化交易学习:交易数据自动抓取

时间:2018-07-29 08:30:02

相关推荐

量化交易学习:交易数据自动抓取



题记:一直对量化交易比较感兴趣,想先自学一下,将来如果有机会,能到机构实战就更棒了。去年用matlab做过一个股票下一交易日价格区间的预测算法,至少在股灾前那段时间准确率还行(别笑,预测区间当然不是在正负10%之间),不过受限于自己的本职工作强度太大(苦逼的移动互联网行业),一直没能继续做下去。后面希望能挤时间慢慢做下去,就当是个业余爱好吧。由于自己的本职工作是做音视频的编解码、增强相关的算法的,所以对量化交易的算法更偏好一点,其实两个方向本质上是相通的,都可以抽象为对随机过程的描述建模,模型建的好,音视频的压缩效率更高、增强效果更好,交易算法的预测准度更高。anyway:我的思路是用RNN-LSTM做学习模型,RNN-LSTM可以用来做自然语言处理,也可以用来做语音识别及增强,当然也可以用来做交易趋势预测啦。

第一步:抓取交易数据。

无论后面交易算法多么核心,都要先解决输入问题。先解决交易数据的自动抓取吧。没有绝对的原创,我的这步工作90%都是基于牛人的既有工作,原帖链接:/question/29648560/answer/56186559,先表示感谢。不过,原帖的代码应该是在低版本的python上可以工作的,但是在我的3.4.3版本上不能用,所以我的改造工作大约10%。改造后、可以正常work的代码如下:

"""

@author: David

"""

import const as ct

import pandas as pd

import json

import urllib.request

import urllib.error

def get_hist_data(code = None, start = None, end = None, ktype = 'D'):

"""

功能:

获取个股历史交易数据

--------

输入:

--------

code:string

股票代码 比如:601989

start:string

开始日期 格式:YYYY-MM-DD 为空时取到API所提供的最早日期数据

end:string

结束日期 格式:YYYY-MM-DD 为空时取到最近一个交易日数据

ktype:string(default=D, 函数内部自动统一为大写)

数据类型 D=日K线,W=周K线,M=月K线,5=5分钟,15=15分钟

30=30分钟,60=60分钟

输出:

--------

DataFrame

date 日期

open 开盘价

high 最高价

close 收盘价

low 最低价

chg 涨跌额

p_chg 涨跌幅

ma5 5日均价

ma10 10日均价

ma20 20日均价

vma5 5日均量

vma10 10日均量

vma20 20日均量

turnover换手率(指数无此项)

"""

code = code_to_APIcode(code.upper())

ktype = ktype.upper()

url = ''

url = get_url(ktype, code)

print(url)

js = json.loads(ping_API(url))

cols = []

if len(js['record'][0]) == 14:

cols = ct.INDEX_DAY_PRICE_COLS

else:

cols = ct.DAY_PRICE_COLS

df = pd.DataFrame(js['record'], columns=cols)

if ktype in ct.K_TYPE_KEY:

df = df.applymap(lambda x:x.replace(u',', u''))

for col in cols[1:]:

df[col]=df[col].astype(float)

if start is not None:

df = df [df.date >= start]

if end is not None:

df = df[df.date <= end]

df = df.set_index('date')

return df

def code_to_APIcode(code):

"""

功能:

验证输入的股票代码是否正确,若正确则返回API对应使用的股票代码

"""

print(code)

if code in ct.INDEX_KEY:

return ct.INDEX_LIST[code]

else:

if len(code) != 6:

raise IOError('code input error!')

else:

return 'sh%s'%code if code[:1] in ['5', '6'] else 'sz%s'%code

def get_url(ktype, code):

"""

功能:

验证输入的K线类型是否正确,若正确则返回url

"""

if ktype in ct.K_TYPE_KEY:

url = ct.DAY_PRICE_URL % (ct.PAGE_TYPE['http'], ct.PAGE_DOMAIN['ifeng'],

ct.K_TYPE[ktype], code)

return url

elif ktype in ct.K_TYPE_MIN_KEY:

url = ct.MIN_PRICE_URL % (ct.PAGE_TYPE['http'], ct.PAGE_DOMAIN['ifeng'],

code, ktype)

return url

else:

raise IOError('ktype input error!')

def ping_API(url):

"""

功能:

向API发送数据请求,若链接正常返回数据

"""

text = ''

try:

#req = Request(url)

text = urllib.request.urlopen(url,timeout=10).read().decode('utf-8')

if len(text) < 15:

raise IOError('no data!')

except Exception as e:

print(e)

else:

return text

#测试入口

print(get_hist_data('300291','-09-11'))

这部分代码已测试有效、可以直接使用。不过,需要提个醒(尤其是刚开始用python的童鞋):要注意代码的缩进,谁让python的解析器那么注重格式涅。。。



本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。