从数据源开始

欢迎来到 PyBroker!最好的起点是了解 DataSource 类。DataSource 从外部数据提供商获取数据,使你能够回测自己的交易策略。

雅虎财经

PyBroker 内置的数据源之一是 Yahoo Finance。要使用它,请导入 YFinance

[1]:
from pybroker import YFinance

yfinance = YFinance()
df = yfinance.query(
    ["AAPL", "MSFT"], start_date="3/1/2025", end_date="3/1/2026"
)
df
Loading bar data...
[*********************100%***********************]  2 of 2 completed
Loaded bar data: 0:00:00

[1]:
date symbol open high low close volume adj_close
0 2025-03-03 AAPL 241.789993 244.029999 236.110001 238.029999 47184000 236.574875
1 2025-03-03 MSFT 398.820007 398.820007 386.160004 388.489990 23007700 384.705231
2 2025-03-04 AAPL 237.710007 240.070007 234.679993 235.929993 53798100 234.487701
3 2025-03-04 MSFT 383.399994 392.579987 381.000000 388.609985 29342900 384.824036
4 2025-03-05 AAPL 235.419998 236.550003 229.229996 235.740005 47227600 234.298874
... ... ... ... ... ... ... ... ...
495 2026-02-25 MSFT 390.529999 401.470001 390.160004 400.600006 43625500 399.734222
496 2026-02-26 AAPL 274.950012 276.109985 270.799988 272.950012 32345100 272.463776
497 2026-02-26 MSFT 404.709991 407.489990 398.739990 401.720001 34405900 400.851807
498 2026-02-27 AAPL 272.809998 272.809998 262.890015 264.179993 72366500 263.709412
499 2026-02-27 MSFT 390.880005 396.820007 389.880005 392.739990 51367200 391.891205

500 rows × 8 columns

上述代码查询了 AAPL 和 MSFT 股票的数据,并返回一个包含结果的 Pandas DataFrame

缓存数据

为加快数据获取速度,你可以使用 PyBroker 的缓存系统来缓存查询结果。通过调用 pybroker.enable_data_source_cache(‘name’) 启用缓存,其中 name 是你的缓存标识符:

[2]:
import pybroker

pybroker.enable_data_source_cache("yfinance")
[2]:
<pybroker.cache._L1Cache at 0x7f0cf03ddbb0>

下一次调用 query 时,会将返回的数据缓存到磁盘。每个唯一的股票代码和日期范围组合都会单独缓存:

[3]:
yfinance.query(["TSLA", "IBM"], "3/1/2025", "3/1/2026")
Loading bar data...
[*********************100%***********************]  2 of 2 completed
Loaded bar data: 0:00:00

[3]:
date symbol open high low close volume adj_close
0 2025-03-03 IBM 254.740005 255.990005 248.250000 250.190002 2977700 240.611847
1 2025-03-03 TSLA 300.339996 303.940002 277.299988 284.649994 115551400 284.649994
2 2025-03-04 IBM 248.750000 255.479996 248.100006 253.210007 5342100 243.516251
3 2025-03-04 TSLA 270.929993 284.350006 261.839996 272.040009 126706600 272.040009
4 2025-03-05 IBM 251.580002 252.740005 247.009995 251.350006 4009800 241.727448
... ... ... ... ... ... ... ... ...
495 2026-02-25 TSLA 412.149994 420.339996 412.149994 417.399994 54809700 417.399994
496 2026-02-26 IBM 239.710007 247.490005 238.949997 242.009995 7343100 238.530716
497 2026-02-26 TSLA 414.420013 416.809998 403.660004 408.579987 53602500 408.579987
498 2026-02-27 IBM 238.070007 240.210007 234.570007 240.210007 6642200 236.756607
499 2026-02-27 TSLA 402.940002 407.119995 398.109985 402.510010 56890100 402.510010

500 rows × 8 columns

再次使用相同的股票代码和日期范围调用 查询 时,将返回缓存的数据:

[4]:
df = yfinance.query(["TSLA", "IBM"], "3/1/2025", "3/1/2026")
df
Loaded cached bar data.

[4]:
date symbol open high low close volume adj_close
0 2025-03-03 IBM 254.740005 255.990005 248.250000 250.190002 2977700 240.611847
1 2025-03-03 TSLA 300.339996 303.940002 277.299988 284.649994 115551400 284.649994
2 2025-03-04 IBM 248.750000 255.479996 248.100006 253.210007 5342100 243.516251
3 2025-03-04 TSLA 270.929993 284.350006 261.839996 272.040009 126706600 272.040009
4 2025-03-05 IBM 251.580002 252.740005 247.009995 251.350006 4009800 241.727448
... ... ... ... ... ... ... ... ...
495 2026-02-25 TSLA 412.149994 420.339996 412.149994 417.399994 54809700 417.399994
496 2026-02-26 IBM 239.710007 247.490005 238.949997 242.009995 7343100 238.530716
497 2026-02-26 TSLA 414.420013 416.809998 403.660004 408.579987 53602500 408.579987
498 2026-02-27 IBM 238.070007 240.210007 234.570007 240.210007 6642200 236.756607
499 2026-02-27 TSLA 402.940002 407.119995 398.109985 402.510010 56890100 402.510010

500 rows × 8 columns

你可以使用 pybroker.clear_data_source_cache 清除缓存:

[5]:
pybroker.clear_data_source_cache()

或者使用 pybroker.disable_data_source_cache 完全禁用缓存:

[6]:
pybroker.disable_data_source_cache()

请注意,在调用这些方法之前,应先调用 pybroker.enable_data_source_cache

Alpaca

PyBroker 还包括了一个 Alpaca 数据源,用于获取股票数据。要使用它,可以导入 Alpaca 并提供你的 API 密钥和密钥:

[7]:
from pybroker import Alpaca
import os

alpaca = Alpaca(os.environ["ALPACA_API_KEY"], os.environ["ALPACA_API_SECRET"])

你可以使用与 Yahoo Finance 相同的语法查询 Alpaca 的股票数据,但 Alpaca 还支持按不同时间段查询数据。例如,要查询 1 分钟的数据:

[8]:
df = alpaca.query(
    ["AAPL", "MSFT"],
    start_date="3/1/2025",
    end_date="3/1/2026",
    timeframe="1m",
)
df
Loading bar data...
Loaded bar data: 0:00:43

[8]:
date symbol open high low close volume vwap
0 2025-02-28 19:00:00-05:00 AAPL 242.0000 242.0000 242.0000 242.0000 1059.0 242.000000
1 2025-02-28 19:01:00-05:00 AAPL 242.0009 242.0009 242.0009 242.0009 231.0 242.000900
2 2025-02-28 19:04:00-05:00 MSFT 396.5000 396.5000 396.5000 396.5000 130.0 396.500000
3 2025-02-28 19:06:00-05:00 AAPL 242.0200 242.0200 242.0200 242.0200 254.0 242.020000
4 2025-02-28 19:07:00-05:00 AAPL 242.0400 242.0400 242.0400 242.0400 134.0 242.040000
... ... ... ... ... ... ... ... ...
351138 2026-02-27 19:56:00-05:00 MSFT 394.2500 394.2500 394.2500 394.2500 318.0 394.250000
351139 2026-02-27 19:57:00-05:00 MSFT 394.2300 394.2400 394.2300 394.2328 472.0 394.236786
351140 2026-02-27 19:58:00-05:00 MSFT 394.1700 394.1700 394.1500 394.1500 343.0 394.160870
351141 2026-02-27 19:59:00-05:00 AAPL 263.5000 263.5500 263.5000 263.5500 978.0 263.523256
351142 2026-02-27 19:59:00-05:00 MSFT 394.1800 394.1800 394.1500 394.1697 1152.0 394.167586

351143 rows × 8 columns

Alpaca Crypto

如果你想获取加密货币数据,可以使用 AlpacaCrypto。以下是查询 BTC/USD 每小时数据的示例:

[9]:
from pybroker import AlpacaCrypto

crypto = AlpacaCrypto(
    os.environ["ALPACA_API_KEY"], os.environ["ALPACA_API_SECRET"]
)
df = crypto.query(
    "BTC/USD", start_date="1/1/2025", end_date="2/1/2026", timeframe="1h"
)
df
Loading bar data...
Loaded bar data: 0:00:10

[9]:
symbol date open high low close volume vwap trade_count
0 BTC/USD 2024-12-31 19:00:00-05:00 93381.5825 94314.692000 93296.6825 94194.6800 0.000062 93451.940000 1.0
1 BTC/USD 2024-12-31 20:00:00-05:00 94176.1550 94176.155000 93405.4355 93405.4355 0.000000 94144.957500 0.0
2 BTC/USD 2024-12-31 21:00:00-05:00 93469.8350 93875.015000 93469.8350 93858.0560 0.005930 93732.454854 3.0
3 BTC/USD 2024-12-31 22:00:00-05:00 93800.5530 93855.050000 93560.1350 93641.1685 0.005000 93829.600000 1.0
4 BTC/USD 2024-12-31 23:00:00-05:00 93582.9550 93609.213500 93319.7705 93319.7705 0.011443 93540.704570 3.0
... ... ... ... ... ... ... ... ... ...
9499 BTC/USD 2026-01-31 15:00:00-05:00 77703.2000 80124.365482 76982.9460 77904.4375 0.130392 77512.925933 30.0
9500 BTC/USD 2026-01-31 16:00:00-05:00 77893.8200 80124.365482 77272.8190 78224.2000 0.066291 77861.126521 29.0
9501 BTC/USD 2026-01-31 17:00:00-05:00 78205.4745 78416.450000 77849.7100 78072.7840 0.025597 78210.752945 24.0
9502 BTC/USD 2026-01-31 18:00:00-05:00 78063.8095 80824.365482 77982.1000 78664.2465 0.060595 78861.674769 22.0
9503 BTC/USD 2026-01-31 19:00:00-05:00 78662.6000 79355.595500 78562.0120 78847.7850 0.013337 78960.874960 27.0

9504 rows × 9 columns

AKShare

PyBroker 还支持 AKShare 数据源,用于获取**中国**股票数据。AKShare 是一个广泛使用的开源包,专门用于获取金融数据,尤其专注于中国市场。与 Yahoo Finance 相比,这个免费工具能为中国市场提供更高质量的数据。

要使用它,请运行 pip install akshare,然后导入 PyBroker 内置的 AKShare 数据源:

[10]:
from pybroker.ext.data import AKShare

akshare = AKShare()
# You can substitute 000001.SZ with 000001, and it will still work!
# and you can set start_date as "20210301" format
# You can also set adjust to 'qfq' or 'hfq' to adjust the data,
# and set timeframe to '1d', '1w' to get daily, weekly data
df = akshare.query(
    symbols=["000001.SZ", "600000.SH"],
    start_date="3/1/2025",
    end_date="3/1/2026",
    adjust="",
    timeframe="1d",
)
df
Loading bar data...
Loaded bar data: 0:00:08

[10]:
date symbol open high low close volume
0 2025-03-03 000001.SZ 11.52 11.56 11.45 11.51 830457.0
1 2025-03-03 600000.SH 10.19 10.22 10.08 10.15 430109.0
2 2025-03-04 000001.SZ 11.47 11.55 11.44 11.51 683179.0
3 2025-03-04 600000.SH 10.10 10.19 10.10 10.10 297698.0
4 2025-03-05 000001.SZ 11.52 11.67 11.48 11.66 1080645.0
... ... ... ... ... ... ... ...
477 2026-02-25 600000.SH 9.90 9.94 9.79 9.79 874234.0
478 2026-02-26 000001.SZ 10.86 10.91 10.80 10.87 712730.0
479 2026-02-26 600000.SH 9.80 9.83 9.69 9.73 760250.0
480 2026-02-27 000001.SZ 10.86 10.92 10.84 10.90 612228.0
481 2026-02-27 600000.SH 9.73 9.84 9.70 9.72 802810.0

482 rows × 7 columns

注意:如果上述导入产生 Native library not available 错误,但是你还想使用AKShare,那么可以参考 see this issue for details on how to resolve it

自定义数据源

如果内置的数据源无法满足你的需求,PyBroker 允许你实现自己的 DataSource。例如 CSV 文件或外部 API。完整示例请参阅 创建自定义数据源

在下一篇文章中,我们将研究如何使用 DataSources 对一个简单的交易策略进行回测