从零开始用Python实现股票量化交易之小白笔记(4)

这篇笔记主要记录对当前项目的一些代码结构上的优化,并选定获取的接口开始获取日线数据。

 

笔者在项目里,将数据库和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,这篇笔记就到这里。

虽然笔记记录的内容不长,但是在探索过程中,还是遇到不少的坑,笔记里是都是成功的操作。

下一篇笔记用于记录如何遍历补充获取日线行情数据。

 

 

你可能感兴趣的:(python,量化交易,股票,数据分析,pandas)