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

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

传送门

本系列原创博文传送门:

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

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

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

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

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

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

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

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

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

 

正文

 

最近在忙一些要紧的大项目,有一段时间没有更新这个系列的文章了。

回过头来,发现一切变化很大。

变化一,我的电脑的mysql重装了,也就意味着以前建的数据库、数据表也不见了,幸好有这些系列文章在,可以使用以往的记录来恢复。

变化二,python2.7将在2020年不再有社区进行维护,所以需要升级到python3,我的电脑里已经安装好了python3,那么只需要将需要的库重新安装一遍即可。至于安装python3需要的坑,主要就是PYTHONPATH的问题,已经在前面的文章里有提及。

变化三,tushare的维护者升级了一部分接口,也需要调整。

然后,言归正传,我来开始恢复我的环境。

 

1、使用Pycharm新建了一个项目stock,python版本指定为python3.7

2、使用sql恢复数据库——到这里发现我的建表语句全部都无法运行成功,这是一个奇怪的事情。

于是我调整了我的恢复步骤:

3、我先修改代码:

-common/db.py 

放弃 MySqldb库(原因见前面写的文章),改用pymysql

-common/ts.py

def get_engine():
    return create_engine('mysql+pymysql://user:pwd@127.0.0.1/stock?charset=utf8')

mysql后加一个 pymysql

不然sqlalchemy会依赖MySqlDB库,然后就报错。

到load_stock_list.py文件,修改一些语法错误,主要是异常的‘,’变为‘as’,然后print需要改为函数的方式写。

4、用pip3安装依赖的库,各种需要的库都install一遍,基本上就是 pip3 install xxx

5、运行load_stock_list.py,发现运行成功,优化了下表,主要是把text类型改成varchar(20)

6、修改load_stock_daily.py,包括一些语法上的修改,现在我是那种没有数据表的情况,所以需要注释掉从数据表取数据的语句,运行了一下,发现有个错误,发现pro_bar接口没有不需要传pro_api实例了,于是去掉这个参数。

再次运行,发现有个报警,说dataframe的ix已经被废弃,应该是3.7的pandas库调整了接口。看到这个情况,检查了入库的数据,发现少了交易日期字段。

中断脚本运行,尝试输出了 print(df.head()),发现里面是有交易日期这个字段的,还发现之前字段重复的问题,已经没有了,说明tushare的维护者已经发现了这个问题并进行了修复。于是注释掉了这行代码。

再考虑到,我之前调用tushare这个接口时选择了前复权,这个虽然很适合我们人工去看,但是如果股票发生了拆股这种事情,那数据就全乱了,于是重新选择了后复权(adj参数值改为hfq),这样数据库的数据就不会乱了。

至于不用复权方式,那就需要结合股票的流通数之类的数据,当前暂不考虑。

修改后代码如下:

#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(ts_code=ts_code, adj='hfq', 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.loc[:, 1:] #去除重复列
        df.to_sql('stock_daily_hfq', ts.get_engine(), if_exists='append') #保存数据
        print(current_date, 'add')

    print(ts_code, 'success')

再次运行,发现数据正常入库,等待数据入库完毕再说吧。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值