定时使用Tushare下载日线交易数据到Sqlite3数据库

Tushare是一款开源的python财经数据软件包,可以提供中国股市所有股票自2010年以来的所有交易数据。于是,将想到了使用Tushare,将4800余只股票每交易日产生的日线数据,自动更新下载到个人电脑中供数据分析使用。

1 准备工作

python 3.7及以上

Tushare库(pip install tushare)

ubuntu 20.04(每日自动运行python数据下载脚本)

sqlite3数据库(python自带,db格式的数据库文件方便迁移)

在Tushare官方网址Tushare大数据社区注册账号,登陆后,在个人主页可以看到接口token,复制下来。

cron定时任务(sudo apt-get install cron)

2 数据下载的Python脚本(dailyTaskNotice.py)

import tushare as ts

import time, datetime, sqlite3,logging

from tqdm import tqdm



def downLoadData(pro):

    # 查询当前所有正常上市交易的股票列表

    data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')

    # 创建sqlite3的股票列表数据表,如果不存在则创建

    conn = sqlite3.connect("./db/tushare.db")

    cursor = conn.cursor()

    try:

        cursor.execute("DROP TABLE share_index")

    except:

        pass

    sql = "CREATE TABLE if not exists share_index(ts_code,symbol,name,area,industry,list_date)"

    cursor.execute(sql)

    # 将股票列表数据存入sqlite3的股票列表数据表,如果存在则替换

    data.to_sql('share_index', conn, if_exists='replace', index = False)

    conn.commit()

    # print(data)




    # 创建sqlite3的股票日线行情数据表,如果不存在则创建

    # amount:成交额,千元; vol:成交手数,百股

    sql = "CREATE TABLE if not exists stock_all(ts_code text,trade_date text,open real,high real,low real,close real,pre_close real,\

        change real,pct_chg real,vol real,amount real,UNIQUE(ts_code, trade_date))"

    cursor.execute(sql)

    # 设定获取日线行情的初始日期和终止日期,其中终止日期设定为昨天。

    start_dt = '20100101'

    time_temp = datetime.datetime.now() - datetime.timedelta(days=1)

    end_dt = time_temp.strftime('%Y%m%d')

    stock_pool = data['ts_code']

    total = len(stock_pool)

    # 循环获取单个股票的日线行情

    for i in tqdm(range(len(stock_pool))):

        # print("正在更新日线:", i)

        try:

            df = pro.daily(ts_code=stock_pool[i], start_date=start_dt, end_date=end_dt)

            time.sleep(0.121)

            # print(df.head())

            # 打印进度

            info = 'Seq: ' + str(i+1) + ' of ' + str(total) + '   Code: ' + str(stock_pool[i])

            c_len = df.shape[0]

            # print("c_len", c_len)

        except Exception as aa:

            print(aa)

            print('No DATA Code: ' + str(i))

            continue

        for j in range(c_len):

            resu0 = list(df.iloc[c_len-1-j])

            # print("resu0", resu0)

            resu = []

            for k in range(len(resu0)):

                if str(resu0[k]) == 'nan':

                    resu.append(-1)

                else:

                    resu.append(resu0[k])

                    # print("resu0[k]", resu0[k])

            state_dt = (datetime.datetime.strptime(resu[1], "%Y%m%d")).strftime('%Y-%m-%d')

            # print('state_dt', state_dt)

            sql = "insert or ignore into stock_all(trade_date,ts_code,open,close,high,low,vol,amount,pre_close,change,pct_chg) VALUES ('%s', '%s', '%.2f', '%.2f','%.2f','%.2f','%i','%.2f','%.2f','%.2f','%.2f')" % (state_dt,str(resu[0]),float(resu[2]),float(resu[5]),float(resu[3]),float(resu[4]),float(resu[9]),float(resu[10]),float(resu[6]),float(resu[7]),float(resu[8]))

            try:

                cursor.execute(sql)

                conn.commit()

                logging.info(info)

            except Exception as err:

                print(err)

    cursor.close()

    conn.execute("VACUUM")

    conn.close()

    print('All Finished!')


ts.set_token('**************************************) #将引号内的*换成自己账号的token

pro = ts.pro_api()

downLoadData(pro)

3 在ubuntu下设置cron定时任务

由于python可能不在ubuntu系统的任意个人目录里,直接在cron里面设置运行python,可能会出现找不到python脚本的问题。这个问题可以通过写一个sh批处理文件来解决。

可以在python程序的同级目录下新建dailyTask.sh文件,用chmod 777 命令将文件权限设置为可执行 。(笔者的sh文件路径为/root/shareResearch/dailyTask.sh,而python文件的路径为/root/shareResearch/dailyTaskNotice.py)

sh文件的内容为:

cd /root/shareResearch
python3 /root/shareResearch/dailyTaskNotice.py >> /root/shareResearch/record.log

先cd到python脚本所在路径,再执行python脚本,并将运行情况保存到og日志文件。

接下来,再cron工具里设置sh脚本的运行规则。

在ubuntu终端运行 crontab -e,即可进入cron的规则编辑环境,增加一行规则:

15 00 * * 2-6 sh /root/shareResearch/dailyTask.sh

上述脚本代表每周二到周六的00:15,运行一次sh脚本(官网上介绍tushare的数据更新时间是交易日的晚上21:00,发现不是很准时,干脆设置到次日凌晨)。

设置好cron规则后,可以用service cron restart重启cron服务,使之生效。

常用的cron服务指令如下:

service cron start -- 启动
service cron restart -- 重启
service cron stop -- 停止
service cron status -- 检查状态
service cron -- 查询cron可用命令
crontab -l -- 检查crontab工具是否安装/查看所有定时任务

4 关于定时运行下载的用时

由于服务器的使用成本巨大,tushare对的初级用户的数据接口访问频次进行了限速。

初级用户第一次运行本文中程序,会从零开始下载2010年以来的数据,笔者测试了耗时约为8h。

第一次下载完成历史数据后,接下来的每次只需要下载当日新增的数据,运行时间会大幅减少,笔者测试了大约为70分钟(凌晨00:15开始,凌晨01:25结束)。每日早上醒来时,所需数据也在电脑里了。

更进一步,可以将数据分析的策略程序,也做成定时任务,并将策略结果推送至个人邮箱,这样,就做成一个自动化的量化分析工具的雏形。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值