CNN模型预测股票涨跌的始末过程——(一)股票数据的获取【附源码和数据】

  • 股票数据的获取
  • Choice数据 — 东方财富
  • Tushare
  • BigQuant
  • 最后列一下我下载成功的数据


股票数据的获取

股票数据的获取一向是比较繁琐与复杂的,下面我来列举一下我尝试获得数据的几种方法。也欢迎大家来提出更多的好用的方法~

Choice数据 — 东方财富

http://choice.eastmoney.com

cnn2d股价预测 cnn 股票_cnn2d股价预测


这个网站对于炒过股票的小伙伴来说也许并不陌生,它在数据的获取上十分便捷,不过如果想要导出的数据量在千万级以上,那么它也许不是一个很好的选择。

使用流程:
【1】注册账号
【2】完成认证(学生证或者身份证都是可以的,认证过程是人工的,所以时间上大概要等2-3天)
【3】通过认证成为免费用户,可以拥有一个月的使用期限,在一个月中可以从Choice数据上面下载所需要的指标数据,但是无论是通过Excel插件还是API(也就是代码)的方式都有流量的限制,具体的流量我在后面会给出详细介绍。

  1. Choice金融终端 ,这是Choice数据的客户端软件,可以在上面进行指标的计算,但是导出数据并不方便(请注意哦,这里没有mac版的终端,据说是还在开发中);
  2. Excel插件,Excel插件是极为便捷的方法。
    在终端的最上一栏找到Excel插件,点击“启动Excel插件”,就会在电脑的Excel中自动安装Choice数据;

    安装成功后,打开Excel,工具栏中显示“Choice数据”。

(1)函数向导

cnn2d股价预测 cnn 股票_机器学习_02


通过点击所需要的指标,下方会生成函数,将函数复制到表格中,通过更改参数来实现目标。

cnn2d股价预测 cnn 股票_股票预测_03

(2)历史行情
历史行情没有什么好说的,只要跟着每一步的操作指示就好了。

  • 这里有一点需要注意:数据导出每日都是有固定额度的,超过一定的限度会提示的,每次导出的数据量要在200万以下,不然会无法导出。
  • 这是我当时同Choice客服的部分聊天截图,免费用户一周最多重置2次流量,每天最多重置1次,每次重置都需要找客服。
  • 重要·重要·重要:我之前说过免费用户有一个月的使用时间,在使用期间内通过Choice中的函数导出的数据是可以使用的,但是一旦超过使用期间,这些数据就会消失,整个Sheet一起消失掉~~~。
  • 所以提醒小伙伴们,如果要想长期使用这些数据的话,要及时复制—粘贴Values到另一个新的sheet中。

(3)其他版块
其他版块用到的时候较少,大家自己慢慢探索~


  1. 量化接口

用户进入“量化接口官网”—“下载中心”,找到合适自己电脑系统和编程语言的。

下载之后,按照文档里的提示步骤完成即可。

过程很简单,不过需要提前联系客服开通权限,否则是不能完成激活的。
【客服的服务态度真的是超级超级好,第一次感受到这么棒的服务,四个后台技术人员在群里帮忙解答我一个人提出来的问题,只要是在他们工作时间来提出问题,无论是安装、代码还是遇到的一些乱七八糟的问题都可以给出很快的解决答案,为他们点赞☺】

这一部分提供用户使用编程语言的方式来编写代码导出数据,导出数据的速度非常快,但是每一个版块的函数都是有限定流量的,点击流量查询即可。

cnn2d股价预测 cnn 股票_股票涨跌_04


注意,如果某一项的流量用尽之后,在下周才可以进行流量重置。


Tushare

http://tushare.org/ Tushare是一个免费、开源的python财经数据接口包。
通过pip install tushare在电脑中安装接口包。

import tushare as ts

因为我需要的技术指标(technical index),在tushare里面是没有的,所以我又查找了生成这些技术指标的函数,后来我找到了talib库,这个库里面有很多量化分析会用到的指标,用起来真的超级方便,但是有一点需要注意,这里面生成的有些指标可能和股票软件中的这些指标数据会有偏差存在,所以如果所需要的数据并不是很多还是推荐从股票软件中直接导出。

talib中文文档talib中文文档

不过talib的安装要费些事,
下面是下载talib的网站,找到适合自己电脑系统和python版本的进行下载就好了:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

在安装成功之后,可以参考文档来编写代码进行数据的生成。
示例代码见下

import talib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from talib import *
import tushare as ts

stock_code = ['601398', '601328', '600036', '601998']
for i in range(len(stock_code)):
    df = ts.get_h_data(stock_code[i], '1998-01-01', '2018-12-30')
    
    # 调用talib计算指数移动平均线的值
    df['EMA12'] = talib.EMA(df.close, timeperiod=6)
    df['EMA26'] = talib.EMA(df.close, timeperiod=12)
    # 调用talib计算MACD指标
    df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(df.close, fastperiod=12, slowperiod=26, signalperiod=9)
    
    # 调用talib计算RSI指标
    df['RSI'] = talib.RSI(df.open, timeperiod=12) # RSI的天数一般是6,12,24

    # 调用talib计算ROC指标
    df['ROC'] = talib.ROC(df.close, timeperiod=10)

    # 调用talib计算KDJ指标
    df['k'], df['d'] = talib.STOCH(df.high, df.low, df.close,
                               fastk_period=9,
                               slowk_period=3, slowk_matype=0,
                               slowd_period=3, slowd_matype=0)
    df['j'] = 3*df.k - 2*df.d
    # 调用talib计算ROLL指标
    df['UP'], df['MB'], df['DN'] = talib.BBANDS(df.close, matype=talib.MA_Type.T3)
    df['diff1'] = df['UP']-df['MB']
    df['diff2'] = df['MB']-df['DN']

    # 调用talib计算OBV指标
    df['OBV'] = talib.OBV(df.close, df.volume)
    
    # 设置csv_name
    csv_name = '/Users/changan/stock' + stock_code[i][0:6] + '.csv'
    print(csv_name)
    df.to_csv(csv_name)

在文章结尾我会附上全部股票代码的csv文件的获取方式。

BigQuant

https://bigquant.com/

对于用过tushare的小伙伴们可能了解,如果通过ts.get_h_data函数来获取股票数据的话,有两点需要保证:
(1)每次获取数据的间隔在5分钟,(2)对网络的要求较高。

df = ts.get_h_data(stock_code[i], '1998-01-01', '2018-12-30')

而如果使用ts.get_hist_data函数来获取股票数据的话,虽然没有时间上的限制了,但是却只能读取近3年的数据。

df = ts.get_hist_data(stock_code[i], '1998-01-01', '2018-12-30')

所以我在使用tushare下载数据的时候就遇到了这个问题,我需要下载近3000支股票的数据,所以时间上的消耗可想而知,即使是在网络始终保持稳定的情况下,也需要至少 5*3000min = 15000min = 250h = 10.441666天 !!!
尤其是我家里的网络还极其不稳定,在下载了两支股票后,我放弃了这个方法。


在我比较迷茫的时候我想起来之前曾经用过的BigQuant,那个上面有自带的函数可以用来下载股票数据,起始日期是2005-01-01, 代码见下.

stock_code = D.instruments()
for i in range(len(stock_code)):
	df = D.history_data(stock_code[i], 
	start_date='2005-01-01', end_date='2019-01-17',
    fields=['open','close', 'adjust_factor', 'volume'])

示例代码见下.

import talib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from talib import *

stock_code = D.instruments()
for i in range(len(stock_code)):
    df = D.history_data(stock_code[i], start_date='2005-01-01', end_date='2019-01-17',
                    fields=['open','close', 'high', 'low', 'adjust_factor', 'volume', 'amount'])
    df['open'] /= df['adjust_factor']
    df['high'] /= df['adjust_factor']
    df['low'] /= df['adjust_factor']
    df['close'] /= df['adjust_factor']
    
    # 计算change
    df['change'] = df['close']/df['close'].shift(1)-1
    
    # 调用talib计算指数移动平均线的值
    df['EMA12'] = talib.EMA(df.close, timeperiod=6)
    df['EMA26'] = talib.EMA(df.close, timeperiod=12)
    # 调用talib计算MACD指标
    df['MACD'], df['MACDsignal'], df['MACDhist'] = talib.MACD(df.close, fastperiod=12, slowperiod=26, signalperiod=9)
    
    # 调用talib计算RSI指标
    df['RSI'] = talib.RSI(df.open, timeperiod=14) 

    # 调用talib计算ROC指标
    df['ROC'] = talib.ROC(df.close, timeperiod=10)

    # 调用talib计算KDJ指标
    df['k'], df['d'] = talib.STOCH(df.high, df.low, df.close, 
                               fastk_period=9,
                               slowk_period=3, slowk_matype=0,
                               slowd_period=3, slowd_matype=0)
    df['j'] = 3*df.k - 2*df.d
    # 调用talib计算ROLL指标
    df['ROLL_UP'], df['ROLL_MB'], df['ROLL_DN'] = talib.BBANDS(df.close, matype=talib.MA_Type.T3)
    df['diff1'] = df['ROLL_UP']-df['ROLL_MB']
    df['diff2'] = df['ROLL_MB']-df['ROLL_DN']

    # 调用talib计算OBV指标
    df['OBV'] = talib.OBV(df.close, df.volume)
    
    # 设置csv_name
    csv_name = stock_code[i][0:6] + '.csv'
    print(csv_name)
    df.to_csv(csv_name)

不过这些数据是下载不到电脑本地的,所有生成的文件都会显示在左侧的策略栏中,如下图所示。

cnn2d股价预测 cnn 股票_股票预测_05


然后再点击要下载的文件进行下载,这是一个及其繁琐枯燥无聊的过程,需要重复点击几个小时……不过好在这个方法是完全可行的。

需要注意的是,我咨询过客服,她告诉我上传和下载的文档大小都是有限制的,大小都不能超过10M,所以大家要合理导出数据。

【这里给出一个参考:包含28(变量)*3414(条)数据的csv大小是1,306KB】


最后列一下我下载成功的数据

股票数据格式如下:
(2005-01-01至2019-01-17)

股票包含深证000001 – 002783,300000 – 300330

以及上证600000 – 601999, 603000 – 603999

共计2773支股票的数据

cnn2d股价预测 cnn 股票_cnn2d股价预测_06


cnn2d股价预测 cnn 股票_股票预测_07


包含的变量如下:

cnn2d股价预测 cnn 股票_机器学习_08


[1]

MACD是计算两条不同速度(长期与中期)的异同移动平均线(EMA)的差离状况来作为研判行情的基础。

DIF

⒈首先分别计算出收市价SHORT日异同移动平均线与LONG日异同移动平均线,分别记为EMA(SHORT)与EMA(LONG)。

⒉求这两条异同移动平均线的差,即:DIF=EMA(SHORT)-EMA(LONG)

DIF组成的线叫做MACD线

DEA

⒊再计算DIFF的M日的平均的异同移动平均线,记为DEA。

DEA组成的线叫做Signal线

Histogram

⒋最后用DIFF减DEA,得Histogram,通常绘制成围绕零轴线波动的柱形图。

在绘制的图形上,DIF与DEA形成了两条快慢移动平均线,买进卖出信号也就决定于这两条线的交叉点。很明显,MACD是一个中长期趋势的投资技术工具。缺省时,系统在副图上绘制SHORT=12,LONG=26,MID=9时的DIFF线、DEA线、MACD线(柱状线)。


谢谢大家的阅读和支持,欢迎大家提出更多更好用的股票数据获取方法~