读取最新结果
find_latest_csv() 会在当前目录寻找 vcp_result_*.csv,
按文件名排序后取最新一个。
这意味着画图脚本不重新全市场筛选,而是承接前一步筛选器的结果。
VCP screening notes
这是我用来复盘 VCP 候选股的可视化脚本:读取最新筛选结果,重新拉取前复权日线, 为每只股票生成 K 线、均线、52 周高点和成交量图,方便快速判断收缩形态是否值得继续跟踪。
01
find_latest_csv() 会在当前目录寻找 vcp_result_*.csv,
按文件名排序后取最新一个。
这意味着画图脚本不重新全市场筛选,而是承接前一步筛选器的结果。
对 CSV 中的每个代码调用 AkShare 的 stock_zh_a_daily,
使用新浪财经源拉取前复权日线。代码会被转换成新浪格式:
60/68/11/51 走上交所 sh,其他默认走深交所 sz。
ThreadPoolExecutor 默认 8 个线程并发拉取数据;每只股票最多重试 4 次,
等待时间按 1.2 秒递增,适合应对代理或数据源的短暂抖动。
每只股票生成一张 Plotly 交互图,最后输出 vcp_charts_YYYYMMDD_HHMM.html。
页面顶部有候选股汇总表,下面是逐个股票的日线图。
02
股票池
筛选器从 A 股代码表开始,只保留 60 和 00 开头的沪深主板股票,
剔除 ST、退市相关名称,减少流动性和异常状态带来的噪声。
周线趋势
最新周线必须满足 Close > 周 MA10 > 周 MA30,并且 MA10、MA30
相比 4 周前都在上行。这个规则把脚本限定在中期趋势仍然抬升的股票里。
回撤位置
收盘价要站上日线 MA50;相对 52 周高点的回撤必须大于 3% 且不超过 25%; 同时收盘价要高于 52 周低点的 1.3 倍,避免选到离底部过近的弱势品种。
量能收缩
vol5/vol20 < 0.8,也就是最近 5 日平均成交量低于最近 20 日均量的 80%。
这是 VCP 中“供应减少”的量化代理。
波动收缩
日振幅定义为 (high - low) / pre_close。最近 5 日平均振幅必须小于
最近 20 日平均振幅的 80%,用来确认价格波动正在压缩。
阶梯收缩
最近 5 日再拆成前 2 日和后 3 日,要求后 3 日平均振幅小于前 2 日。 这个条件试图捕捉 VCP 末端更紧、更窄的整理状态。
03
生成页的标题会展示代码、名称、收盘价、回撤比例、vol5/vol20 和
amp5/amp20。主图包含 K 线、MA10、MA20、MA50 与 52 周高点虚线;
副图显示成交量柱,并按涨跌用红绿区分。
脚本还会去掉非交易日空隙,让 K 线横轴更贴近真实交易节奏。 如果某只股票数据拉取失败,它会被记录到失败列表并跳过,不影响其他图表生成。
04
python vcp_screener.py
python vcp_plot.py
第一行负责全市场扫描并保存 vcp_result_YYYYMMDD.csv;
第二行读取最新结果,生成可交互复盘页。这个流程更像“先筛,再看图”,
不替代交易判断,只把候选名单压缩到更值得人工观察的范围。