这篇笔记主要记录对当前项目的一些代码结构上的优化,并选定获取的接口开始获取日线数据。
笔者在项目里,将数据库和ts配置相关的代码做了抽取,放在common文件夹下。
/common/db.py #获取本地数据库连接
/common/ts.py #设置tushare的token,也可获取engine
抽取完后,整个代码变成如下:
/quantization/load_stock_list.py
#coding=utf-8
from common import db #数据库配置抽取
from common import ts #tushare配置相关的抽取
import tushare
ts.set_ts_token()
pro = tushare.pro_api()
data = ''
try:
data = pro.stock_basic(fields='ts_code,symbol,name,area,industry,list_date,market,is_hs,list_status,exchange,delist_date,curr_type')
except Exception, e:
print e
exit(0)
stock_conn = db.get_stock_conn()
stock_cursor = stock_conn.cursor()
stock_cursor.execute('truncate table stock_basic')
stock_conn.commit()
engine = ts.get_engine()
data.to_sql('stock_basic', engine, if_exists='append')
这样配置就和我们隔离了。
然后我们继续下面的内容。
我们获取到了所有的股票列表,那么我们就需要遍历这些股票,获取各类数据。
第一个要获取的就是正常的日线行情数据,可以通过pro里的通用行情接口获取,也可以通过日线行情接口获取,我选择后者。
先从数据库stock_basic表里取出第一个股票数据,打印它的ts_code,追加以下代码:
stock_cursor.execute("select ts_code from stock_basic limit 1")
basic_row = stock_cursor.fetchone()
ts_code = basic_row[0]
print ts_code
输出结果:
000001.SZ
看了下,是平安银行。看了下它的上市时间是19910403。
然后我们去获取它的数据,从官网上看最早的数据是从2010年开始,还有的说是三年,试着看看有没有可能更早。
新建文件:
/quantization/load_stock_daily.py
代码如下:
#coding=utf-8
from common import db
from common import ts
import tushare
stock_conn = db.get_stock_conn()
stock_cursor = stock_conn.cursor()
stock_cursor.execute("select ts_code,list_date from stock_basic limit 1")
basic_row = stock_cursor.fetchone()
ts_code = basic_row[0]
list_date = basic_row[1]
ts.set_ts_token()
pro = ts.get_ts_pro()
df = pro.daily(ts_code='000001.SZ', start_date='19910403', end_date='19920101')
print df
发现在1991年,平安银行有165天是在正常交易的。
也就是说,可以从股票的上市日期开始获取数据,然后笔者尝试了下,发现每次最多取4000条,按1年365天算,一只股票可以每次取10年的数据。
对比了下通用行情接口,发现通用接口还能够获取股票因子(换手率、量比)和均线数据,且能够设置复权参数(对于小白来讲,前复权会比较直观,对于机器学习,我认为未复权会比较合适,因为未复权会体现除权的动作,而股票行情里,是有一种叫填权的行情的。不过使用未复权行情数据的话,我认为需要加入每日指标来进行补充,那么现在就直接考虑前复权即可,这个最为方便),老的历史行情接口已经不再维护,综合之下,选择通用行情接口(https://tushare.pro/document/2?doc_id=109)。
调整代码如下:
#coding=utf-8
from common import db
from common import ts
import tushare
stock_conn = db.get_stock_conn()
stock_cursor = stock_conn.cursor()
stock_cursor.execute("select ts_code,list_date from stock_basic limit 1")
basic_row = stock_cursor.fetchone()
ts_code = basic_row[0]
list_date = basic_row[1]
end_d = str(int(list_date) + 10000) #取一年数据
ts.set_ts_token()
pro = tushare.pro_api()
df = tushare.pro_bar(pro_api=pro, ts_code=ts_code, adj='qfq', start_date=list_date, end_date=end_d,
ma=[5, 10, 30, 60, 13, 21, 55], factors=['tor', 'vr'])
df = df.ix[:, 1:] #遇到了返回值有相同列,做了这个处理
df.to_sql('stock_daily_qfq', ts.get_engine(), if_exists='append')
发现数据表成功创建,里面有数据。
***经测试,这个开始时间和结束时间是闭区间。
调整优化数据表设计,将sql附上:
CREATE TABLE `stock_daily_qfq` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trade_date` varchar(10) DEFAULT '',
`ts_code` varchar(12) DEFAULT '',
`open` decimal(10,2) DEFAULT '0.00',
`high` decimal(10,2) DEFAULT '0.00',
`low` decimal(10,2) DEFAULT '0.00',
`close` decimal(10,2) DEFAULT '0.00',
`pre_close` decimal(10,2) DEFAULT '0.00',
`change` decimal(10,2) DEFAULT '0.00',
`pct_chg` decimal(10,2) DEFAULT '0.00',
`vol` decimal(10,2) DEFAULT '0.00',
`amount` decimal(10,2) DEFAULT '0.00',
`turnover_rate` decimal(10,2) DEFAULT '0.00',
`volume_ratio` decimal(10,2) DEFAULT '0.00',
`ma5` decimal(10,2) DEFAULT '0.00',
`ma_v_5` decimal(10,2) DEFAULT '0.00',
`ma10` decimal(10,2) DEFAULT '0.00',
`ma_v_10` decimal(10,2) DEFAULT '0.00',
`ma30` decimal(10,2) DEFAULT '0.00',
`ma_v_30` decimal(10,2) DEFAULT '0.00',
`ma60` decimal(10,2) DEFAULT '0.00',
`ma_v_60` decimal(10,2) DEFAULT '0.00',
`ma13` decimal(10,2) DEFAULT '0.00',
`ma_v_13` decimal(10,2) DEFAULT '0.00',
`ma21` decimal(10,2) DEFAULT '0.00',
`ma_v_21` decimal(10,2) DEFAULT '0.00',
`ma55` decimal(10,2) DEFAULT '0.00',
`ma_v_55` decimal(10,2) DEFAULT '0.00',
PRIMARY KEY (`id`),
UNIQUE KEY `uni_key` (`trade_date`,`ts_code`) USING BTREE,
KEY `ts_code` (`ts_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ok,这篇笔记就到这里。
虽然笔记记录的内容不长,但是在探索过程中,还是遇到不少的坑,笔记里是都是成功的操作。
下一篇笔记用于记录如何遍历补充获取日线行情数据。