
pyalgotrade到底能喂哪些数据
做量化回测的人常会遇到一个尴尬:策略写好了,历史数据搞不到。pyalgotrade作为一个轻量级Python回测框架,它自带的数据接口不算多,但胜在结构清晰,可以自己扩展。很多人第一次用pyalgotrade时,会下意识以为它只能拉雅虎财经的股票数据。其实它的数据加载方式分两条路:一条是官方内置的在线数据源,另一条是本地文件或自定义数据源。理解这两条路,就知道它能支持哪些市场数据集了。
内置在线数据源
pyalgotrade的pyalgotrade.barfeed模块里,直接提供了两个在线数据源类:

YahooFinanceFeed:从雅虎财经拉取日线数据。雅虎财经覆盖全球主要交易所的股票、ETF、共同基金、部分指数和外汇汇率。代码里传入股票代码如AAPL、SPY、EURUSD=X就能获取对应日线。GoogleFinanceFeed:从谷歌财经拉取日线数据。谷歌财经覆盖的品种与雅虎类似,股票、ETF为主,但谷歌财经在2020年后逐步收缩了服务接口,稳定性和数据完整性不如雅虎。
这两个feed都是日线级别,不支持分钟级或tick级。而且它们只能拉历史数据,不能用于实时交易。如果你只想快速验证一个股票或ETF的日线策略,用内置feed是最省事的。
本地CSV导入
这是pyalgotrade最实用的数据接入方式。GenericBarFeed类允许你从CSV文件加载任意市场的K线数据。CSV文件的格式要求很宽松,只要包含日期时间、开盘价、最高价、最低价、收盘价、成交量、复权因子(可选)这几列,就能被解析成bar数据。
这意味着期货、期权、加密货币、商品、甚至你从其他数据商买来的tick聚合后的分钟线,全部可以通过CSV喂给pyalgotrade。国内期货市场比如螺纹钢、铁矿石、沪深300股指期货,只要把历史数据整理成规范CSV,就能回测。加密货币的7x24小时数据同样可以。
自定义数据源
yalgotrade的架构里,数据源是一个抽象概念。BarFeed基类定义了getNextBars方法,任何继承这个基类并实现该方法的类,都可以作为数据源。你可以写一个类去连接本地MySQL、MongoDB、InfluxDB,或者调用交易所的REST API、WebSocket实时推送。
这种设计让pyalgotrade不局限于特定市场。股票、期货、外汇、数字货币、甚至体育博彩赔率数据,只要转换成OHLCV格式,就能接入策略引擎。
不同市场的支持程度
股票市场:内置feed直接支持美股、部分欧洲和亚洲股票。A股需要自己准备CSV或写自定义feed,因为雅虎和谷歌对A股覆盖有限且代码格式不同(如600000.SS)。
期货市场:没有内置feed。必须通过CSV或自定义数据源接入。国内期货数据可以从天勤、聚宽、米筐等平台导出CSV,再加载。外盘期货如CME的ES、CL,同样走CSV路径。
外汇市场:雅虎财经提供外汇日线数据,代码如EURUSD=X,可以直接用YahooFinanceFeed。分钟级外汇数据需要自定义feed。
加密货币:没有内置feed,但CSV导入非常方便。从币安、Coinbase等交易所导出历史K线,整理成CSV即可回测。由于加密货币7x24交易,回测时要注意时间戳对齐。
数据频率的限制
pyalgotrade原生设计以日线为主。内置feed只返回日线。GenericBarFeed可以加载分钟线,但需要设置timeFrame参数为bar.Frequency.MINUTE。不过框架内部的事件驱动机制对高频数据的处理效率一般,分钟级回测尚可,tick级回测不建议使用pyalgotrade。
如何选择数据接入方式
如果你做美股日线策略,直接用YahooFinanceFeed,一行代码拉数据。
如果你做国内期货或A股,从数据平台导出CSV,用GenericBarFeed加载。
如果你需要实时数据或非常规品种,写一个自定义BarFeed子类,对接你的数据源。
pyalgotrade的数据层不复杂,它的定位是让策略逻辑与数据获取解耦。你不需要改策略代码,只需要换一个feed,就能把同一个策略跑在股票、期货或加密货币上。这种灵活性比它内置多少数据源更重要。