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

19 篇文章 4 订阅
12 篇文章 3 订阅

传送门

本系列原创博文传送门:

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

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

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

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

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

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

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

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

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

正文

如上一篇笔记所述,这篇笔记用于记录如何遍历保存日线(前复权)数据。

按以下步骤实现:

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、指标分析相关的内容。

 

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值