量化系统QTYX使用攻略|“数据源”篇——QMTvs爬虫,覆盖日线分钟线(更新3.4.3)
搭建自己的量化系统股票量化交易系统QTYX是一个即可以用于学习也可以用于实战炒股分析的系统。分享QTYX系统目的是提供给大家一个搭建量化系统的模版最终帮助大家搭建属于自己的系统。因此我们提供源码可以根据自己的风格二次开发。关于QTYX的使用攻略可以查看链接QTYX使用攻略QTYX一直迭代更新当前版本V3.4.3。后续升级版本会同步更新文档内容。功能概述股票数据是从事量化交易的源头。对于小散而言理想的数据源应具备这些特点一是免费降低入门门槛二是数据质量可靠满足分析需求三是持续维护确保时效性和准确性四是获取高效不拖策略后腿。基于这个思路QTYX内置了两种数据源——miniQMT和爬虫。两者都支持股票和ETF的日线、分钟线数据只是底层实现不同miniQMT适合已开户的朋友数据稳定可靠适合实盘有合作的低佣券商。使用时要登录QMT极简模式填写安装路径和账号到trade_para.json文件中。爬虫适合未开户的朋友无需门槛选股研究够用在配置界面“日线行情获取方式”和“分钟行情获取方式”配置即可。市面上不少数据平台提供了Python接口单只股票获取很方便。但全市场5000多只股票一次性下载非常耗时每天全市场选股往往要花1-2小时。 原因在于这些接口受限于平台服务器的积分、频次、数据量等限制。 QTYX的高速下载方案则突破了这一瓶颈下载全市场5000多只股票的历史行情数据通常只需30分钟左右。电脑配置好的话开启多任务并发还能更快。 我们开放了并发数量设置让你放心加速下载日线行情数据。日线行情数据日线行情数据主要用于“形态选股”功能。在工具顶部左上角菜单栏两个按钮的功能如下“开始下载”工具开始增量下载股票从上市至最新交易日的全部数据 “停止下载”下载过程中停止下载任务。 点击离线数据下载—开始下载。 其实也可以在形态选股的时候勾选“同步行情数据”这样可以边下载数据边选股如果已经更新过数据下一次选股可以取消勾选“同步行情数据”。这个对话框可以通过条件删选数量如果选了“否”就是全市场的数量。下载过程中会有“进度条”提供进度QTYX的工程下路径DataFiles/stock_history用于存储股票数据文件每个股票一个csv文件。数据内容包含收盘价、开盘价、最高价、最低价、成交量外还包含了涨跌幅、换手率、总市值等等还是比较丰富的。我们可以双击个股名称或者点击高级功能查看行情数据。下载完成后在“日志区”会统计下载的情况。日志上显示共更新4924支股票4924支股票增加数据1支股票更新失败。共耗时2888秒电脑配置好的话多开几个并发任务还可以加快。存储了全市场的股票数据之后针对于全市场的选股就可以展开了下面列举相关功能函数大家可以找到源码进行调试和学习。UserFrame.py_ev_click_menu_start菜单栏-开始下载-事件触发_ev_click_menu_fresh菜单栏-刷新文件-事件触发_ev_click_menu_compt菜单栏-补全下载-事件触发_ev_click_menu_stop菜单栏-停止下载-事件触发CrawlerThread多线程回调爬虫行情数据接口DefProgress.pyProgressBarDialog操作进度条元素DownloadDataThread多线程更新进度条HistoryOCHLV.py爬虫获取网易财经数据驱动DatHandle.pyday_to_qfq前复权处理day_to_hfq后复权处理分钟行情数据分钟行情数据主要用于交易界面的“六边形量化框架”功能。选择不同周期的选项会返回对应周期的数据用于实盘策略执行。“日级别”是“历史日线 盘中分钟数据”的融合让日线分析真正实现实时化。无论盘中任何时刻都能看到包含最新交易数据的日线K线为盘中决策提供更及时的技术分析依据。“日级别”的自动扫描周期是60分钟。比如当前是3月24日14点30分常规数据源只能获取到3月23日的收盘数据而本功能系统获取的是当天盘中实时重采样的日线数据展示的是包含最新价格14:30时刻的动态日线。同时支持股票和ETF将日线级别的决策从收盘后提前到盘中任意时刻让量化策略的响应速度从次日提升到实时1. 盘中及时捕捉买卖信号场景MACD金叉/死叉策略传统方式必须等收盘后才能看到日线MACD是否金叉第二天开盘再操作可能错过最佳买点本功能盘中14:30就能看到日线MACD金叉信号立即下单抓住当天上涨行情2. 避免T1交易滞后场景A股T1交易制度传统方式看到昨天日线信号今天买入明天才能卖出可能遭遇次日低开本功能盘中看到信号当天买入第二天就能卖出提高资金周转效率3. 回撤止盈及时触发场景止盈止损策略传统方式日线回撤止盈信号收盘后才知道可能已经回撤很多了本功能盘中实时监测日线回撤幅度达到条件立即止盈锁定更多利润4. 轮动策略盘中调仓场景ETF轮动策略传统方式收盘后计算排名第二天调仓可能错过当天强势品种本功能盘中实时计算日线排名当天即可调仓换股跟上热点轮动5. 突发事件快速反应场景利空/利好突发传统方式收盘后日线才能反映影响决策滞后本功能盘中实时看到日线走势变化第一时间做出反应核心代码逻辑在TradeFrame.py文件中# 在 ev_analy_timer 方法中当选择“日级别”周期时if period_value u日级别: # 步骤1获取历史日线数据 daily_result self.call_method( self.event_task[get_etf_ochlv] if ETF in self.select_pools_cbox.GetValue() else self.event_task[get_stock_ochlv], st_codecode ) # 兼容返回格式字典或DataFrame if isinstance(daily_result, dict): daily_data daily_result.get(data, pd.DataFrame()) else: daily_data daily_result # 重命名列名中文→英文 daily_data daily_data.rename(columns{ 开盘价: Open, 最高价: High, 最低价: Low, 收盘价: Close, 成交量: Volume })[[Open, High, Low, Close, Volume]] # 步骤2判断今天是否已有日线数据 now datetime.now() today now.date() last_date daily_data.index[-1].date() # 步骤3如果今天没有日线数据盘中未收盘 if last_date ! today: # 获取今天的5分钟数据 intraday_result self.call_method( self.event_task[get_etf_ochlv_min] if ETF in self.select_pools_cbox.GetValue() else self.event_task[get_stock_ochlv_min], st_codecode, st_period5分钟, st_authself.st_auth, sdate_objdatetime(today.year, today.month, today.day), edate_objself.edate_obj ) # 兼容分钟数据返回格式 if isinstance(intraday_result, dict): intraday_data intraday_result.get(data, pd.DataFrame()) else: intraday_data intraday_result if not intraday_data.empty: # 筛选今天的分钟数据 today_intraday intraday_data[intraday_data.index.date today] if not today_intraday.empty: # 步骤4从5分钟数据重采样为日线 today_daily today_intraday.resample(D).agg({ 开盘: first, # 开盘价当天第一根5分钟的open 最高: max, # 最高价到今天为止的最高价 最低: min, # 最低价到今天为止的最低价 收盘: last, # 收盘价最新一根5分钟的close 成交量: sum # 成交量到今天为止的累计成交量 }).dropna() # 重命名列名 today_daily today_daily.rename(columns{ 开盘: Open, 最高: High, 最低: Low, 收盘: Close, 成交量: Volume })[[Open, High, Low, Close, Volume]] # 步骤5合并历史日线和今日重采样数据 stock_dat pd.concat([daily_data, today_daily]) else: # 今天已有日线数据已收盘直接使用 stock_dat daily_data数据复权处理我们获取到的日线数据是除权的数据对于像双底形态识别、跳空缺口识别这类的形态分析方法如果使用除权的股票价格那么会对选股的结果产生一些影响。什么是除权和复权除权通常是除权除息的简称。除权除息前后的股价是需要等价换算的换算是根据“除权前后流通股股东价值不变”原理来确定的。因此除息要去除股价分红的影响。除权要去除股票数量增加的影响。 假如一只股票除息前股价5元通告今天是股权登记日当日每10股分红5元。那么明天为除息日除息后的股价变为4.5元。 假如一只股票除权前股价20元通告今天是股权登记日公司决定每10股送10股。那么明天为除权日股价变为10块股本增加1倍原来持有100股在除权日就变为200股。 这两种情况会在走势图上出现不同程度的下跌缺口我们称为除权缺口。 除权除息会使投资者误认为是一个向下跳空缺口如下所示 如果根据除权的股价去计算股票涨跌幅显然是不对的同花顺软件里面显示的是-52.49%。同样计算得到的各类指标也是毫无参考价值的。 为了使得走势图能真实反映各股价趋势让投资者更好做出判断除权除息后的价格就不能直接和以前的价格比而是要经过复权处理后才有可比性。 复权处理是根据“除权前后流通股股东价值不变”原理。保持现有股价不变调整以前的价格就叫做前复权。 同样保持以前的股价不变调整除权后的股价就叫做后复权。 如何得到复权后的股价呢其实非常简单无论前复权还是后复权数据都是可以通过复权涨跌幅转换得到的。复权涨跌幅即是股票的真实涨跌幅。 比如得到了股票第一天的价格之后通过简单的连乘计算自然就可以计算出之后每一天的复权价这个叫做后复权价。 同样的知道了股票最后一天的价格那么反向处理也就可以计算出之前每一天的价格这个叫做前复权价。行情软件中的前后复权价格其实也是这么算出来的。 QTYX的行情数据源支持股票数据的复权处理。 使用方法非常简单。点击 【选股流程】-【开始选股】-【形态驱动型选股】会出现选股数据参数对话框包含了【股票周期】、【股票复权】、【选股模型】等栏目。 我们根据需求在【股票复权】下拉选项中选择【不复权】、【前复权】和【后复权】中的一个即可。 想要了解代码是如何实现复权的话可以查看QTYX/ApiData/Csvdata.py文件的load_history_st_data()函数。 不少星友会留意到有时候同一只股票在不同的行情软件里面显示的复权价格是不一样的。这里需要和星友们说明下关于复权后股价数据不一致的原因。 数据不一致的主要原因是不同系统间采用复权方式可能不一致。比如QTYX使用的是“涨跌幅复权法”进行复权而同花顺或者通达信等软件可能是不同的。 其实复权是非常复杂的处理真实的情况下有分红、转增、增发、配股、可转债等非常复杂的情况。即使是专业的数据库也都会在复权计算中出现错误。 所以大家更多还是结合自身使用的情况去考虑复权数据的影响。比如对于形态选股而言只要把除权缺口弥补即可对价格的微小误差并不敏感。 如果是在回测中则应该使用真实价格的回测模式。 比如当回测到“历史时刻1”时使用“历史时刻1”的复权因子对之前的价格进行前复权如果出现成交就和真实价格撮合成交当回测到“历史时刻2”时“对“历史时刻2之前的价格进行前复权。总结我们长期维护这个数据源当数据服务器出现问题的时候我们会采用替代方案修复接口。比如之前爬虫接口采用某财经常被封IP于是我们换了某浪亲测5000只股票可以顺利完成下载。说明想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利知识星球介绍点击知识星球《玩转股票量化交易》精华内容概览