A package that lets you create TradingView screeners in Python
| Files | Last commit | Last update |
|---|---|---|
| 3 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 4 months ago | ||
| 3 months ago | ||
| 3 years ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago |
概述
pip install tradingview-screener
tradingview-screener 是一个 Python 包,可让您使用 TradingView 的官方 API 创建自定义股票筛选器。此包直接从 TradingView 检索数据,无需网页抓取或 HTML 解析。
主要功能
- 股票(约 70 个国家/地区)、期权、加密货币、外汇、差价合约、期货、债券等。
- 3000+ 数据字段:OHLC 数据、技术指标、基本面指标(如市盈率、每股收益),甚至是 TradingView 内部专用字段。
- 时间周期:支持 1 分钟、5 分钟、15 分钟、30 分钟、1 小时、2 小时、4 小时、1 日、1 周和 1 月 — 可按字段自由混合时间周期,无需订阅。
- 筛选功能:类 SQL 语法,全面支持
AND/OR逻辑。
链接
请注意,在整个文档中,“field”和“column”可互换使用。“Scanner”和“Screener”也是如此。
快速入门
以下是一个简单的示例,助您快速上手:
from tradingview_screener import Query
x = (Query()
.select('name', 'close', 'volume', 'market_cap_basic')
.get_scanner_data())
print(x)
输出:
(17580,
ticker name close volume market_cap_basic
0 NASDAQ:NVDA NVDA 127.25 298220762 3.130350e+12
1 AMEX:SPY SPY 558.70 33701795 NaN
2 NASDAQ:TSLA TSLA 221.10 73869589 7.063350e+11
3 NASDAQ:QQQ QQQ 480.26 29102854 NaN
4 NASDAQ:AMD AMD 156.40 76693809 2.531306e+11
.. ... ... ... ... ...
45 NASDAQ:PDD PDD 144.22 8653323 2.007628e+11
46 NYSE:JPM JPM 214.52 5639973 6.103447e+11
47 NYSE:JNJ JNJ 160.16 7274621 3.855442e+11
48 NASDAQ:SQQQ SQQQ 7.99 139721164 NaN
49 NASDAQ:ASTS ASTS 34.32 32361315 9.245616e+09
[50 rows x 5 columns])
默认情况下,结果限制为 50 行。你可以调整此限制,但要注意服务器负载和可能的封禁。
一个更高级的查询:
from tradingview_screener import Query, col
(Query()
.select('name', 'close', 'close|1', 'close|5', 'volume', 'relative_volume_10d_calc')
.where(
col('market_cap_basic').between(1_000_000, 50_000_000),
col('relative_volume_10d_calc') > 1.2,
col('MACD.macd|1') >= col('MACD.signal|1') # 1 minute MACD
)
.order_by('volume', ascending=False)
.offset(5)
.limit(25)
.get_scanner_data())
其他筛选器
from tradingview_screener import stocks, crypto, options
# top stocks by market cap in Italy
stocks('italy').limit(5).get_scanner_data()
# top CEX crypto pairs by 24 h volume
crypto().limit(5).get_scanner_data()
# AAPL options chain
options('NASDAQ:AAPL').limit(5).get_scanner_data()
所有筛选器函数均返回一个 Query 对象,因此您可以在它们的基础上链式调用任何常用方法(.select()、.where()、.order_by() 等):
from tradingview_screener import options, col
(options('NASDAQ:AAPL')
.select('name', 'close', 'ask', 'bid', 'expiration', 'volume')
.where(col('expiration') == 20260427) # 2026/4/27
.order_by('strike')
.limit(10)
.get_scanner_data())
可用筛选器的完整列表:stocks、crypto、crypto_dex、coin、forex、futures、bond、cfd、options。
请注意,某些字段(通常是价格和指标)提供多种时间周期供您选择,例如:
| 时间周期 | 列名 |
|---|---|
| 1 分钟 | close|1 |
| 5 分钟 | close|5 |
| 15 分钟 | close|15 |
| 30 分钟 | close|30 |
| 1 小时 | close|60 |
| 2 小时 | close|120 |
| 4 小时 | close|240 |
| 1 天 | close |
| 1 周 | close|1W |
| 1 月 | close|1M |
实时数据访问
要访问实时数据,您需要传递会话 cookie,因为即使是免费的实时数据也需要身份验证。
验证更新模式
您可以运行此查询来获取每个交易所的 update_mode 概览:
from tradingview_screener import Query
_, df = Query().select('exchange', 'update_mode').limit(1_000_000).get_scanner_data()
df = df.groupby('exchange')['update_mode'].value_counts()
print(df)
exchange update_mode
AMEX delayed_streaming_900 3255
NASDAQ delayed_streaming_900 4294
NYSE delayed_streaming_900 2863
OTC delayed_streaming_900 7129
使用rookiepy
rookiepy 是一个能从本地浏览器加载 cookie 的库。
因此,如果你已登录 Chrome(或你使用的任何浏览器),它将使用相同的会话。
-
安装
rookiepy:pip install rookiepy -
加载 cookie:
import rookiepy cookies = rookiepy.to_cookiejar(rookiepy.chrome(['.tradingview.com'])) # 将 chrome() 替换为你的浏览器 -
查询时传入 cookie:
Query().get_scanner_data(cookies=cookies)
现在,如果你重新运行更新模式检查:
_, df = Query().select('exchange', 'update_mode').limit(1_000_000).get_scanner_data(cookies=cookies)
df = df.groupby('exchange')['update_mode'].value_counts()
print(df)
exchange update_mode
AMEX streaming 3256
NASDAQ streaming 4286
NYSE streaming 2860
OTC delayed_streaming_900 7175
我们现在获取所有交易所的实时数据,但不包括 OTC(因为我的订阅不包含 OTC 交易对的实时数据)。
加载 Cookie 的其他方法
手动提取 Cookie
-
访问 TradingView
-
打开开发者工具(
Ctrl + Shift + I) -
导航至
Application选项卡。 -
依次进入
Storage > Cookies > https://www.tradingview.com/ -
复制
sessionid的值 -
在查询中传入该值:
cookies = {'sessionid': '<your-session-id>'} Query().get_scanner_data(cookies=cookies)
通过 API 进行身份验证
虽然可以直接通过 API 进行身份验证,但 TradingView 对登录频率有限制,这可能会导致 CAPTCHA 请求和账户标记(这意味着在冷却期结束且 CAPTCHA 消失之前,此方法将无法再次使用)。
如果您仍希望继续,请按以下步骤操作:
from http.cookiejar import CookieJar
import requests
from tradingview_screener import Query
def authenticate(username: str, password: str) -> CookieJar:
session = requests.Session()
r = session.post(
'https://www.tradingview.com/accounts/signin/',
headers={'User-Agent': 'Mozilla/5.0', 'Referer': 'https://www.tradingview.com'},
data={'username': username, 'password': password, 'remember': 'on'},
timeout=60,
)
r.raise_for_status()
if r.json().get('error'):
raise Exception(f'Failed to authenticate: \n{r.json()}')
return session.cookies
cookies = authenticate('<your-username-or-email>', '<your-password>')
Query().get_scanner_data(cookies=cookies)
与同类包的比较
不同于其他具备特定功能(如提取市场情绪等)的 Python 库,本包只是 TradingView 的 /screener API 端点的一个(底层)包装器。
它仅通过列出所有可用的函数和操作、可使用的不同字段、市场、金融工具(甚至包括一些 TradingView 网站上找不到的工具)等内容,来对该端点进行文档说明。
该库同时也是一个包装器,旨在简化那些冗长 JSON 负载的生成过程。
稳健性与持久性
本包的设计注重未来适应性。包内不包含任何硬编码值,所有字段/列和市场均在网站上进行文档说明,并通过 GitHub Actions 脚本每日更新。
工作原理
当使用 select() 或 where() 等方法时,Query 对象会构建一个表示 API 请求的字典。以下是生成的字典示例:
{
'markets': ['america'],
'symbols': {'query': {'types': []}, 'tickers': []},
'options': {'lang': 'en'},
'columns': ['name', 'close', 'volume', 'relative_volume_10d_calc'],
'sort': {'sortBy': 'volume', 'sortOrder': 'desc'},
'range': [5, 25],
'filter': [
{'left': 'market_cap_basic', 'operation': 'in_range', 'right': [1000000, 50000000]},
{'left': 'relative_volume_10d_calc', 'operation': 'greater', 'right': 1.2},
{'left': 'MACD.macd', 'operation': 'egreater', 'right': 'MACD.signal'},
],
}
get_scanner_data() 方法会将此字典作为 JSON 负载发送至 TradingView API,使您能够使用类 SQL 语法查询数据,而无需了解该 API 的具体细节。
反馈与改进
如果此软件包为您的项目带来了价值,请考虑为其点亮星标。
星标用户
Introduction
一款允许您使用Python语言创建TradingView筛选器的软件包。【此简介由AI生成】