从数据源开始
欢迎来到 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
自定义数据源
如果内置的数据源无法满足你的需求,PyBroker 允许你实现自己的 DataSource。例如 CSV 文件或外部 API。完整示例请参阅 创建自定义数据源。