一般在做回测的时候,如果不是实时策略,都没有必要实时从Tushare拉取数据。通常做法就是,将历史数据提前下载到本地数据库,然后每天设定定时任务进行更新。
在python里面有个定时器组件可以完成指定的任务
# pip install schedule
import schedule
import time
from dao import jobs
# 具体的定时任务调用,通过字符串调用函数
def on_timer(method):
getattr(jobs, method)()
schedule.every().day.at("19:30").do(on_timer, "update_basic")
schedule.every().day.at("20:30").do(on_timer, "update_trade")
在jobs.py里的更新日交易数据
# 每天更新股票交易数据
def update_trade():
if is_holiday():
return False
global pro
day = time.strftime("%Y%m%d", time.localtime())
daily = pro.daily(trade_date=day)
pd.io.sql.to_sql(daily, 'trade_data', con=engine, index=False, if_exists='append', chunksize=500)
print('%s更新了%s条记录' % (day,len(daily)))
以上是实现每日更新股票数据的核心代码。
如果表很大的情况下,为了提高回测代码的执行效率,我们拆分出最近6年的数据到一张新表里,并定时每天更新。数据库分表定时更新的实现,既可以通过在Python里编写定时逻辑,也可以在MySQL中设置定时事件的方式,后期如果有合适的使用场景再介绍MySQL定时事件,当前我们选择是直接在Python中编写代码逻辑来实现。