如上一篇笔记所述,这篇笔记用于记录如何遍历保存日线(前复权)数据。
按以下步骤实现:
1、使用mysql取得所有股票代码和上市日期,返回值是一个二维数组;
2、开始遍历股票,使用for in;
3、查找具体股票在stock_daily_qfq表中最大的交易日期;
4、开启while循环,将日期转化为数值;一年一年地获取日线数据并保存;
5、当开始时间大于当前日期时,结束while循环,继续下一只股票的遍历。
6、遍历结束。
开始修改代码,修改完成后的代码如下:
#coding=utf-8
from common import db
from common import ts
import tushare
import time #引入time类库
stock_conn = db.get_stock_conn()
stock_cursor = stock_conn.cursor()
stock_cursor.execute("select ts_code,list_date from stock_basic") #获取所有
basic_rows = stock_cursor.fetchall() #获取所有的股票
ts.set_ts_token()
pro = tushare.pro_api() #pro_bar接口需要使用pro对象
for basic_row in basic_rows: #遍历
ts_code = basic_row[0] #股票代码
print ts_code, 'start'
list_date = int(basic_row[1]) # 上市时间,转化成数字,方便计算
stock_cursor.execute("select max(trade_date) from stock_daily_qfq where ts_code = \'%s\'" % ts_code)
info = stock_cursor.fetchone()
current_date = list_date #初始化运算中的当前时间
if info[0]: #如果是空,返回是 (None,),直接判断info,会判断为有值,需判断info[0]
current_date = int(info[0])+1 #获得当前股票最大的日期,如果有存在记录,则必然比上市日期要大
today = int(time.strftime("%Y%m%d", time.localtime())) #格式化获取当前日期 20190128
while current_date <= today:
end_d = current_date + 10000 -1 #闭区间
df = tushare.pro_bar(pro_api=pro, ts_code=ts_code, adj='qfq', start_date=str(current_date), end_date=str(end_d),
ma=[5, 10, 30, 60, 13, 21, 55], factors=['tor', 'vr'])
current_date = end_d + 1 # 下一年
if df is None or len(df) == 0: #可能是None也可能是有表头但无数据的df
print current_date
continue
df = df.ix[:, 1:] #去除重复列
df.to_sql('stock_daily_qfq', ts.get_engine(), if_exists='append') #保存数据
print current_date, 'add'
print ts_code, 'success'
运行,发现有警告,类似:
Warning: Data truncated for column 'turnover_rate' at row 1
rowcount = cursor.executemany(statement, parameters)
Warning: Data truncated for column 'amount' at row 12
rowcount = cursor.executemany(statement, parameters)
这两个列都是decimal(10,2),是这个列无法正常保存值会报的警告,排查相关的数据,将一些列的decimal修改为double(16,4)。数据表做了修改,并添加了注释,新的数据表sql如下:
CREATE TABLE `stock_daily_qfq` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trade_date` varchar(10) DEFAULT '' COMMENT '交易日',
`ts_code` varchar(12) DEFAULT '' COMMENT '股票代码',
`open` decimal(10,2) DEFAULT '0.00' COMMENT '开盘价',
`high` decimal(10,2) DEFAULT '0.00' COMMENT '最高价',
`low` decimal(10,2) DEFAULT '0.00' COMMENT '最低价',
`close` decimal(10,2) DEFAULT '0.00' COMMENT '收盘价',
`pre_close` decimal(10,2) DEFAULT '0.00' COMMENT '昨日收盘价',
`change` decimal(10,2) DEFAULT '0.00' COMMENT '价格变化',
`pct_chg` double(16,4) DEFAULT '0.0000' COMMENT '涨跌幅',
`vol` decimal(10,2) DEFAULT '0.00' COMMENT '成交量(手)',
`amount` double(16,4) DEFAULT '0.0000' COMMENT '成交额(千元)',
`turnover_rate` double(16,4) DEFAULT NULL COMMENT '换手率',
`volume_ratio` decimal(10,2) DEFAULT '0.00' COMMENT '量比',
`ma5` decimal(10,2) DEFAULT '0.00' COMMENT '五日均线',
`ma_v_5` decimal(10,2) DEFAULT '0.00' COMMENT '5日指数平均值',
`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 AUTO_INCREMENT=203 DEFAULT CHARSET=utf8
继续运行代码,正常写入数据,没有再出现问题,那就等它继续运行到结束吧。
这篇笔记就到这里,下面将开始机器学习、pandas、指标分析相关的内容。