Python量化全流程实战:TradingView-Screener高效股票数据筛选指南

📅 发布时间:2026/7/9 13:01:03 👁️ 浏览次数:
Python量化全流程实战:TradingView-Screener高效股票数据筛选指南
Python量化全流程实战TradingView-Screener高效股票数据筛选指南【免费下载链接】TradingView-ScreenerA package that lets you create TradingView screeners in Python项目地址: https://gitcode.com/gh_mirrors/tr/TradingView-Screener在量化投资领域快速准确地筛选股票数据是制定有效策略的基础。本文将以基础认知→核心功能→实战案例→进阶技巧的四阶架构全面介绍如何利用TradingView-Screener这款强大的Python量化工具实现从环境部署到策略回测的全流程操作。无论你是Python量化新手还是有经验的开发者都能通过本文掌握高效股票数据处理的关键技能构建属于自己的量化分析系统。一、基础认知从零开始的量化筛选入门零基础环境部署3步完成TradingView-Screener安装如何在5分钟内搭建起专业的股票数据筛选环境TradingView-Screener提供了两种简单高效的安装方式满足不同用户的需求。✅步骤1选择安装方式# 方式一使用pip快速安装 pip install tradingview-screener # 方式二通过源码安装推荐开发者使用 git clone https://gitcode.com/gh_mirrors/tr/TradingView-Screener cd TradingView-Screener poetry install✅步骤2验证安装# 验证安装是否成功 from tradingview_screener import Query print(TradingView-Screener安装成功版本:, Query().version)✅步骤3解决依赖问题# 确保安装必要依赖库 pip install pandas requests matplotlib避坑指南安装前请确保Python版本≥3.8过低版本可能导致依赖库安装失败。如果遇到找不到poetry命令的错误请先执行pip install poetry安装依赖管理工具。核心模块解析5分钟了解工具架构当你开始使用一个新工具时了解其内部结构能帮助你更快上手。TradingView-Screener采用模块化设计主要包含以下核心组件模块路径功能描述核心类/函数应用场景src/tradingview_screener/query.py查询构建与执行Query,And(),Or()创建复杂筛选条件src/tradingview_screener/column.py筛选条件定义Column, 比较运算符定义价格、成交量等筛选规则src/tradingview_screener/models.py数据模型定义FilterOperationDict,ScreenerDict数据结构与类型定义src/tradingview_screener/util.py辅助功能format_technical_rating()数据格式化与转换避坑指南各模块之间存在依赖关系例如query.py依赖column.py中定义的条件类。在修改源码时需注意保持模块间接口的兼容性。传统筛选vs程序化筛选效率对比分析为什么需要使用程序化筛选工具让我们通过一组数据对比传统人工筛选与使用TradingView-Screener的效率差异筛选场景传统人工方式TradingView-Screener效率提升倍数单条件筛选如价格503-5分钟/次0.1秒/次约300倍多条件组合筛选15-30分钟/次0.3秒/次约1000倍跨市场数据筛选1-2小时/次2秒/次约1800倍指数成分股分析2-3小时/次5秒/次约1440倍通过对比可以清晰看到程序化筛选不仅大幅节省时间还能避免人工操作可能产生的错误使分析师能够将精力集中在策略设计而非数据处理上。二、核心功能掌握高效数据筛选的关键技能三步实现基础数据筛选从查询到结果展示如何快速实现一个基础的股票筛选只需三个简单步骤即可完成从查询构建到结果展示的全过程。✅步骤1创建查询对象from tradingview_screener import Query # 初始化查询对象默认返回美国市场股票数据 basic_query Query()✅步骤2定义筛选条件from tradingview_screener.column import Column as col # 设置筛选条件收盘价20成交量500万 filtered_query ( basic_query .select(name, close, volume, market_cap_basic) # 选择需要的列 .where( col(close) 20, # 收盘价大于20 col(volume) 5_000_000 # 成交量大于500万 ) )✅步骤3执行查询并展示结果# 获取筛选结果 total_count, data_frame filtered_query.get_scanner_data() # 展示结果 print(f共找到 {total_count} 只符合条件的股票) print(前5只股票数据:) print(data_frame.head()) # 显示前5行数据避坑指南首次运行可能会遇到API请求限制建议将初始查询的返回数量限制在100以内避免触发频率限制。可使用.limit(100)方法控制返回数据量。多条件逻辑组合构建复杂筛选策略现实中的投资策略往往需要多个条件的组合判断。TradingView-Screener提供了灵活的逻辑组合功能让你轻松实现复杂条件筛选。问题如何筛选出价格在50-100元之间且成交量较昨日增长50%以上或市值大于100亿的科技类股票from tradingview_screener.query import And, Or # 创建复杂逻辑条件 complex_strategy ( Query() .select(name, close, volume, market_cap_basic, sector) .where2( And( col(sector) Technology, # 科技板块 Or( # 条件A价格在50-100元成交量增长50%以上 And( col(close).between(50, 100), col(volume) col(volume).prev(1) * 1.5 ), # 条件B市值大于100亿 col(market_cap_basic) 10_000_000_000 ) ) ) ) _, df complex_strategy.get_scanner_data() print(df[[name, close, market_cap_basic, sector]])避坑指南逻辑组合时注意括号的使用避免因运算优先级导致条件判断错误。建议使用括号明确各组条件的逻辑关系提高代码可读性。全球市场定位跨区域资产筛选技巧如何在3分钟内完成跨市场数据筛选TradingView-Screener支持全球67个国家和地区的市场数据让你轻松实现多市场资产筛选。# 多市场筛选示例 global_market_query ( Query() .select(name, close, market, country, currency) .set_markets(america, europe, asia) # 同时筛选美洲、欧洲和亚洲市场 .where( col(market_cap_basic) 5_000_000_000, # 市值大于50亿 col(close) 10 # 收盘价大于10 ) .order_by(market_cap_basic, ascendingFalse) # 按市值降序排列 ) _, df global_market_query.get_scanner_data() print(跨市场筛选结果:) print(df.groupby(market).size()) # 按市场统计数量 print(df[[name, country, close, market_cap_basic]].head(10))避坑指南不同市场的列名可能存在差异例如市值在某些市场可能使用不同的字段名。建议先通过基础查询获取目标市场的列信息再构建具体筛选条件。三、实战案例从数据获取到策略可视化指数成分股分析一键筛选标普500成长股如何快速获取并分析特定指数的成分股以下案例展示如何筛选标普500指数中符合成长特征的股票。# 筛选标普500成分股中的成长股 sp500_growth_query ( Query() .select(name, close, market_cap_basic, earnings_growth_annual, revenue_growth_annual) .set_index(SPX) # 标普500指数 .where( col(earnings_growth_annual) 0.15, # 年化 earnings 增长率 15% col(revenue_growth_annual) 0.10, # 年化收入增长率 10% col(close) 50 # 收盘价 50 ) .order_by(earnings_growth_annual, ascendingFalse) # 按盈利增长率排序 ) _, growth_stocks sp500_growth_query.get_scanner_data() # 展示结果 print(f标普500成长股数量: {len(growth_stocks)}) print(growth_stocks[[name, earnings_growth_annual, revenue_growth_annual]].head(10))避坑指南指数代码可能随时间变化若筛选结果为空可通过TradingView网站确认最新的指数代码。常见指数代码标普500(SPX)、纳斯达克100(NDX)、道琼斯工业平均指数(DJI)。三步实现数据可视化从原始数据到K线图表如何将筛选出的股票数据转化为直观的可视化图表以下案例展示如何使用mplfinance库绘制专业的K线图。✅步骤1获取股票数据# 获取单只股票的OHLCV数据 stock_data_query ( Query() .select(open, high, low, close, volume) .set_tickers(NASDAQ:NVDA) # NVIDIA股票 .limit(60) # 获取60天数据 ) _, stock_data stock_data_query.get_scanner_data()✅步骤2数据预处理import pandas as pd # 转换为时间序列数据 stock_data[date] pd.date_range(endpd.Timestamp.today(), periodslen(stock_data)) stock_data.set_index(date, inplaceTrue)✅步骤3绘制K线图import mplfinance as mpf # 绘制K线图 mpf.plot( stock_data, typecandle, # 蜡烛图类型 volumeTrue, # 显示成交量 titleNVIDIA Stock Price (60 Days), # 图表标题 ylabelPrice ($), # Y轴标签 ylabel_lowerVolume, # 成交量Y轴标签 figratio(12,6), # 图表比例 mav(5, 20), # 添加5日和20日均线 savefignvidia_chart.png # 保存图表 )避坑指南mplfinance库对中文显示支持不佳如果需要在图表中显示中文需额外配置字体。可在plot函数中添加rcParams参数设置中文字体。常见场景解决方案应对量化分析中的典型问题场景1如何处理大量数据查询当需要筛选大量数据时分页查询是避免请求超时的有效方法def paginated_data_fetch(query, page_size100): 分页获取数据 all_results [] offset 0 while True: # 分页查询 _, df query.offset(offset).limit(page_size).get_scanner_data() if len(df) 0: break # 没有更多数据时退出循环 all_results.append(df) offset page_size print(f已获取 {offset} 条数据...) # 合并所有结果 return pd.concat(all_results, ignore_indexTrue) # 使用分页查询获取大量数据 large_query ( Query() .select(name, close, volume, market_cap_basic) .where(col(volume) 10_000_000) # 成交量大于1000万 ) all_data paginated_data_fetch(large_query) print(f总共获取 {len(all_data)} 条记录)场景2如何实现多线程并行查询使用多线程并行获取不同市场数据大幅提升效率import concurrent.futures def fetch_market_data(market): 获取单个市场的股票数据 return ( Query() .select(name, close, market, volume) .set_markets(market) .limit(50) # 每个市场取50条数据 .get_scanner_data()[1] ) # 要查询的市场列表 markets [america, europe, asia, japan, australia] # 使用线程池并行查询 with concurrent.futures.ThreadPoolExecutor() as executor: results list(executor.map(fetch_market_data, markets)) # 合并所有市场数据 combined_data pd.concat(results, ignore_indexTrue) print(各市场数据量统计:) print(combined_data.groupby(market).size())四、进阶技巧提升量化分析效率的高级方法策略回测基础构建均值回归策略模板如何验证一个交易策略的有效性以下是一个简单的均值回归策略回测框架def mean_reversion_strategy(data): 均值回归策略实现 # 计算20日移动平均线 data[MA20] data[close].rolling(window20).mean() # 计算价格与均线的偏差百分比 data[deviation] (data[close] - data[MA20]) / data[MA20] * 100 # 生成交易信号低于均线2%买入高于均线2%卖出 data[signal] 0 data.loc[data[deviation] -2, signal] 1 # 买入信号 data.loc[data[deviation] 2, signal] -1 # 卖出信号 return data # 获取测试数据 _, test_data ( Query() .select(close) .set_tickers(NASDAQ:AAPL) # 苹果公司股票 .limit(120) # 获取120天数据 .get_scanner_data() ) # 应用策略 result mean_reversion_strategy(test_data) print(策略信号示例:) print(result[[close, MA20, deviation, signal]].tail(15))避坑指南回测结果受数据周期影响较大建议使用至少1年以上的数据进行测试并注意避免过度拟合。实际交易中还需考虑交易成本和滑点等因素。API请求优化提升数据获取效率的5个技巧频繁的API请求可能导致性能问题或触发限制以下是5个提升请求效率的实用技巧请求频率控制import time def rate_limited_query(query, delay2): 带频率限制的查询 time.sleep(delay) # 请求间隔至少2秒 return query.get_scanner_data()结果缓存机制import os import pickle from datetime import timedelta def cached_query(query, cache_key, cache_dircache, ttltimedelta(hours1)): 带缓存的查询 os.makedirs(cache_dir, exist_okTrue) cache_path os.path.join(cache_dir, f{cache_key}.pkl) # 检查缓存是否有效 if os.path.exists(cache_path): modified_time os.path.getmtime(cache_path) if time.time() - modified_time ttl.total_seconds(): with open(cache_path, rb) as f: return pickle.load(f) # 执行查询并缓存结果 result query.get_scanner_data() with open(cache_path, wb) as f: pickle.dump(result, f) return result # 使用缓存查询 _, df cached_query(Query().select(close).limit(10), basic_query)批量请求合并# 一次请求获取多只股票数据 multi_ticker_query ( Query() .select(name, close, volume) .set_tickers(NASDAQ:AAPL, NASDAQ:MSFT, NASDAQ:GOOG) # 多只股票 )必要字段筛选# 只选择需要的字段减少数据传输量 minimal_query ( Query() .select(name, close, volume) # 仅选择必要字段 .where(col(volume) 1_000_000) )错误重试机制def retry_query(query, max_retries3): 带重试机制的查询 for attempt in range(max_retries): try: return query.get_scanner_data() except Exception as e: print(f查询失败 (尝试 {attempt1}/{max_retries}): {str(e)}) if attempt max_retries - 1: time.sleep(2 ** attempt) # 指数退避策略 raise Exception(达到最大重试次数)量化生态整合与TA-Lib技术分析库联用TradingView-Screener可以与其他量化工具无缝集成以下是与TA-Lib技术分析库结合的示例import talib import numpy as np # 获取原始价格数据 _, price_data ( Query() .select(open, high, low, close, volume) .set_tickers(NASDAQ:MSFT) # 微软股票 .limit(100) # 获取100天数据 .get_scanner_data() ) # 转换为numpy数组以便TA-Lib处理 close_prices np.array(price_data[close]) high_prices np.array(price_data[high]) low_prices np.array(price_data[low]) # 使用TA-Lib计算技术指标 price_data[RSI] talib.RSI(close_prices, timeperiod14) price_data[MACD], price_data[MACD_signal], price_data[MACD_hist] talib.MACD( close_prices, fastperiod12, slowperiod26, signalperiod9 ) price_data[BB_upper], price_data[BB_middle], price_data[BB_lower] talib.BBANDS( close_prices, timeperiod20 ) # 显示计算结果 print(price_data[[close, RSI, MACD, BB_upper, BB_lower]].tail(10))避坑指南TA-Lib对输入数据有严格要求需确保数据中没有NaN值否则可能导致计算错误。可使用price_data.dropna()或talib.set_unstable_period处理数据中的缺失值。附录实用策略模板模板1动量策略筛选器def momentum_strategy(): 动量策略筛选近期表现强势的股票 return ( Query() .select(name, close, performance.1M, performance.3M, volume) .where( col(performance.1M) 0.1, # 1个月涨幅10% col(performance.3M) 0.2, # 3个月涨幅20% col(volume) 5_000_000 # 成交量500万 ) .order_by(performance.1M, ascendingFalse) .limit(50) ) # 使用策略 _, momentum_stocks momentum_strategy().get_scanner_data() print(动量策略筛选结果:) print(momentum_stocks[[name, performance.1M, performance.3M]].head(10))模板2价值投资筛选器def value_investing_strategy(): 价值投资策略筛选低PE、低PB的优质股票 return ( Query() .select(name, close, P/E, P/B, dividend_yield, market_cap_basic) .where( col(P/E) 15, # 市盈率15 col(P/B) 2, # 市净率2 col(dividend_yield) 0.03, # 股息率3% col(market_cap_basic) 5_000_000_000 # 市值50亿 ) .order_by(P/E, ascendingTrue) .limit(50) ) # 使用策略 _, value_stocks value_investing_strategy().get_scanner_data() print(价值投资策略筛选结果:) print(value_stocks[[name, P/E, P/B, dividend_yield]].head(10))模板3技术指标组合策略def technical_combination_strategy(): 技术指标组合策略多指标共振筛选 return ( Query() .select(name, close, RSI, MACD.macd, Stochastic.K, ADX) .where( col(RSI).between(30, 70), # RSI在合理区间 col(MACD.macd) col(MACD.signal), # MACD金叉 col(Stochastic.K) col(Stochastic.D), # 随机指标金叉 col(ADX) 25 # ADX显示趋势强度 ) .limit(50) ) # 使用策略 _, technical_stocks technical_combination_strategy().get_scanner_data() print(技术指标组合策略筛选结果:) print(technical_stocks[[name, RSI, MACD.macd, ADX]].head(10))通过本文介绍的基础操作、核心功能、实战案例和进阶技巧你已经掌握了使用TradingView-Screener进行高效股票数据筛选的关键技能。无论是简单的条件筛选还是复杂的策略回测这款工具都能为你提供强大的支持。随着实践的深入你可以不断优化策略构建属于自己的量化分析系统在投资决策中获得数据驱动的竞争优势。【免费下载链接】TradingView-ScreenerA package that lets you create TradingView screeners in Python项目地址: https://gitcode.com/gh_mirrors/tr/TradingView-Screener创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考