TradingView-Screener:基于 Python 的 TradingView 自定义筛选器项目

A package that lets you create TradingView screeners in Python

Branch5Tags6
FilesLast commitLast 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())

可用筛选器的完整列表:stockscryptocrypto_dexcoinforexfuturesbondcfdoptions


请注意,某些字段(通常是价格和指标)提供多种时间周期供您选择,例如:
时间周期 列名
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(或你使用的任何浏览器),它将使用相同的会话。

  1. 安装 rookiepy

    pip install rookiepy
    
  2. 加载 cookie:

    import rookiepy
    cookies = rookiepy.to_cookiejar(rookiepy.chrome(['.tradingview.com']))  # 将 chrome() 替换为你的浏览器
    
  3. 查询时传入 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
  1. 访问 TradingView

  2. 打开开发者工具(Ctrl + Shift + I

  3. 导航至 Application 选项卡。

  4. 依次进入 Storage > Cookies > https://www.tradingview.com/

  5. 复制 sessionid 的值

  6. 在查询中传入该值:

    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 的具体细节。

反馈与改进

如果此软件包为您的项目带来了价值,请考虑为其点亮星标。

星标用户

Star History Chart