在使用人工智能或者说目前最流行的深度学习和神经网络的时候,可能大家都有一个共识,就是数据是最重要的。事实上,深度神经网络发展到现在,或者说人工智能发展到现在,数据并没有我们想象的那么重要。
有些刚接触人工智能和深度神经网络的同学们可能会说,没有数据,你拿什么来做训练呢?其实,我们可以去通过各种方法生成我们所需要的数据,尤其是我们在数据不足的情况下。其实目前对于人工智能或者说深度学习模型来说,优质的数据太少太少了,以至于其实优质的数据和质量不够好的数据训练出来的模型的泛化准确率可以差到几个百分点。但是事实上,巨大的数据量靠人工去检查和更正是一个不可能完成的任务。
回过头来讨论我们今天的话题,前面我说了,这个专题是《深度学习与金融市场》这个专题的延续,在上一个专题我们已经讨论过数据闭环的重要性。而这个专题我们来讨论具体的实现方法和逻辑。
本文里我们仅仅讨论日线数据闭环,原因是因为篇幅不够,我会采用tushare的接口来实现部分的代码给大家。事实上我自己是没有用tushare的接口,我使用的是完全自己开发的数据接口,主要是因为更稳定,后期不用去为此修改代码!初期大家可以使用tushare的开源接口,等到使用人工智能量化投资稳定盈利了,再开发自己的数据接口。
可能有的同学会觉得tushare的数据接口已经很好用了,事实上我们实战的时候其实就知道,这只是一个基础接口,并且实时数据的部分也是缺失的。而我们即便是做日线,也是需要实时的数据的,比如我需要一个14:30的策略,那么其实tushare都是在15:00到16:00间更新日线数据的。但是,我们用来做一些基础的研究也勉强够用了。
事实上我自己抓取的OHLCV是分钟数据,其他的我都没有去抓,因为其他的数据都可以由分钟数据计算出来。本文中,为大家介绍抓取日线数据,因为tushare的分钟数据并不完善,我们可以通过日线数据建立我们的数据闭环。
我们来列出我们的数据接口需要实现哪些功能。
一、获得单只股票的历史OHLCV数据。
二、获得指定多只股票的历史OHLCV数据。
三、获得所有股票的历史OHLCV数据。
四、获得单只股票的实时OHLCV数据。
五、获得指定多只股票的实时OHLCV数据。
六、获得所有股票的实时OHLCV数据。
七、将所有股票的OHLCV数据更新到最新。
接下来我们逐一来实现这些功能,当然我们会将这些数据根据需要写入到本地,避免重复低效劳动,我们会将每只股票的数据按其代码作为文件名来存储为CSV文件。事实上,我自己在做的时候是存储为数据库的,本质上也没有太大的差别,主要由于我存储的是分钟线数据,相对来讲数据量较大。
其中历史数据的部分,我会用tushare来实现一个给大家,完全是现写给大家,因为我自己并不用这个接口。而实时数据的部分,我们也说了tushare并不方便去获取。因此我们本文中只实现获得历史数据的部分,其实对于我们刚刚使用人工智能量化来说,历史数据也仅仅是没有当天的数据而已,也是够用的。我们本文只实现一、二、三、七四个功能。
这四个功能我们分两个方法来完成,我这里的方法是指的类中的方法。我们直接根据代码来讲吧!为了方便截图,我的代码中没有加注释,我们在文章中来解释。首先我们import一些我们需要的包。
然后我们来定义一个名为OHLCV的类,我们先来看看我们的__init__里面要做些什么事情?首先我们定义一个路径,用来存放我们的数据,这是必须的,我们不可能每次都从网络上去抓取数据,所以建立本地数据库,并不断去同步到最新是非常有必要的。接下来我们定义了token,这个是tushare的接口所必须要的。这两个变量我们在实例化对象的时候会指定。接下来我们定义了一个countPerRead的变量,这是因为tushare一次只能读取4000个数据。然后我们实例化了一个tushare的pro的类,这样我们在后面就不用再去实例化了。
然后我们来看一些在我们主要的两个方法里会用到的一些基础方法。get_local_date这个方法用来取得本地的时间,也就是说是你电脑的时间,当然我们也可以从网络上去取这个时间,但是一般大家的电脑时间都是准确的。get_basic_info这个方法则是用来获取A股所有上市公司的基本信息,在这里主要是为get_stock_list和get_IPO_date这两个方法所用,一个是用来获得所有上市公司的代码列表,一个是用来获得股票的上市时间供我们抓取历史数据的时候使用。
接下来就进入到我们重头戏了,get_one_history用来获取一只股票的历史数据。我们先来介绍一下参数,股票代码是必须的;而后是是否从网络更新数据到本地,这意味着你有可能只想从本地读取数据;而后就是开始和结束日期了。
首先,我们读取本地的数据,如果本地数据存在,我们将我们从网络抓取数据的起始时间设置为本地数据最后一条的时间。如果本地数据不存在,我们将起始时间设置为股票的上市日期。而结束时间我们一律设置为当天的时间。然后我们判断是否需要更新本地数据,一种情况是本地数据已经是最新,另一种情况是你只想读取本地数据,这两种情况下我们都直接返回本地数据对应的日期段。
其次,我们就要通过tushare的接口来读取数据,由于tushare一次只能读取4000条,那么我们用一个循环来读取,并且我们将循环读取的数据连接起来。当一次读取小于4000条的时候,我们认为读取结束,跳出循环后,我们将删除日期重复的行,为什么会用重复呢?因为我们在每次循环里选取日期的时候,我们使用的是上一次读取的数据里的最后一条日期。
最后,删除重复数据之后,我们再使用tushare的另一个接口读取所有的复权因子,没有复权因子的OHLCV是没有灵魂的。然后我们将复权因子和历史OHLCV用concat做成一个Dataframe。现在我们就有了一段OHLCV数据,然后我们把它和我们本地读取到的历史数据连接起来,这样就构成了我们这只股票的所有的历史数据,并且这个历史数据是带复权因子的。我们就可以返回我们所需要历史数据段,并且将更新的数据写入到我们本地,保证我们本地数据是最新的。
到这里,get_one_history就讲完了。接下来我们看看get_multi_history这个方法,其实就很简单了对吗,我们针对每一只列表里的股票去做get_one_history就好了。
我们来看看,基础逻辑是这样,我们判断有没有传codeList,如果没有,我们就认为你需要的是所有的A股上市公司,如果有,那么codeList就是你指定的列表。然后我们对每一只股票来做get_one_history。你只需要选定update为True,那么你的本地数据都会全部被更新到最新。
接下来我们来看实际调用的例子,我们分别来获得单只、多只和所有股票的数据。
我们来看看data1和data2的打印结果,data3由于太过庞大,我们就不打印了,大家可以自行试试。
所以大家其实可以看到,这样的数据才是我们所需要的数据,为什么我说网上这些个数据接口都不实用,因为这些人并不是做人工智能量化的,所以在数据的组织和结构上并不能很好的适应我们的使用,实际上在大家跟我后面的内容的时候就会发现,合适的数据接口,能事半功倍。当然我们这里的数据接口还缺实时数据接口,如果做日线,我们需要的实时性并不是特别高。
本文代码,同学们可以加关注后私信或者留言向我索取。
人工智能与深度学习做量化请关注:AI量化(https://t.zsxq.com/RvfY37y) 星球限时免费,如需加入,请私信我获得免费邀请码!
零基础学习Python与深度学习应用请关注星球:Python与深度学习 https://t.zsxq.com/bUFayZ3
微信公众号:QTechAI
网友评论