做商品基本面研究时,库存数据往往是判断供需节奏最直接的“体温计”。尤其是纯碱这类强周期性品种,库存连续累加往往意味着下游拿货意愿弱、供应端过剩压力正在兑现。但真正折磨人的是:官方网站和资讯平台的数据格式五花八门,发布时间不统一,有时还需要自己把周度数据手动整理成图表和信号指标。本文就以纯碱基本面分析为场景,完整演示如何用 Python 自动读取库存数据、计算累库/去库周期、标注连续累库周数,并用可视化图表辅助判断“底部区域可能出现在哪”,既适合做商品期货数据分析的新手入门,也适合有经验的人直接复用脚本逻辑。
1. 背景与核心概念:纯碱库存分析到底在分析什么
1.1 纯碱是什么,为什么基本面盯库存
纯碱(碳酸钠 Na₂CO₃)是重要的基础化工原料,下游主要集中在浮法玻璃、光伏玻璃、日用玻璃、洗涤剂、碳酸锂等领域。其中玻璃产业对纯碱的需求占比最高,因此玻璃产线的点火、冷修节奏会直接影响纯碱的表观需求。
在商品期货的基本面分析体系中,有一个常用框架叫“库存-价格”分析:库存是供需缺口的结果,当供应大于需求时,库存被动累积;当需求大于供应时,库存被动去化。因此,库存数据是判断当前市场处于“过剩”还是“紧缺”状态最核心的验证指标。
纯碱的库存主要分为几类:
- 厂家库存:纯碱生产企业的厂内库存,能直接反映生产端出货压力。
- 交割库存:期货交割库库存,会影响近月合约的交割压力。
- 社会库存:贸易商、终端用户的库存,反映中下游备货意愿。
- 下游原料库存:玻璃厂的纯碱可用天数,可以反映采购节奏。
日常跟踪时,最常用的是厂家库存周度数据,因为它发布频率高、口径相对统一,能快速反映供需边际变化。
1.2 所谓“连续六周增加”意味着什么
单周库存增加可能是偶然,比如某周物流受阻、下游临时停车。但如果库存连续多周增加,那就不是偶然波动,而是一种趋势信号,说明市场可能正处在“主动累库”阶段。
库存周期一般可以分为四个阶段:
| 阶段 | 库存变化 | 价格表现 | 供需背景 |
|---|---|---|---|
| 主动去库 | 下降 | 弱势,价格承压 | 需求弱,企业主动降价降库存 |
| 被动去库 | 下降 | 反弹 | 需求好于预期,库存被消耗 |
| 主动累库 | 上升 | 底部震荡或下跌 | 供应充足,需求不足,企业被动接受累库 |
| 被动累库 | 上升 | 承压下行 | 需求开始走弱,但供应还没有收缩 |
当纯碱库存连续六周增加,通常意味着供应端仍在放量或下游采购节奏明显放缓。此时市场最关心的问题是:累库还会持续多久?什么时候能看到累库拐点?
拐点的确认往往不能只看库存绝对值,而要结合几个辅助指标:
- 累库速度是否放缓。
- 纯碱企业开工率是否开始下降。
- 下游玻璃产线是否有点火复产预期。
- 价格是否已经跌破部分高成本企业的生产成本。
换句话说,底部不是单一指标拍出来的,而是“库存增速放缓 + 供应收缩预期 + 价格边际企稳”组合确认的过程。
1.3 为什么用 Python 来做基本面分析
基本面分析看起来是“看数据、读新闻”,但实际工作量非常大。每周要处理多个来源的 Excel、PDF、网页表格,做环比、同比、均值计算,还要画库存走势图、对比图,如果全靠手工,既容易出错又浪费时间。
用 Python 可以把整个流程自动化:
- 从 CSV、Excel、网页接口读取数据。
- 自动清洗日期、单位、缺失值。
- 计算周度环比、累库周期、库存可用天数。
- 生成库存走势图并标注关键拐点。
- 输出“连续累库 N 周”等信号文本。
本文就是围绕这一套流程,从一个 Python 脚本的角度,演示如何完成纯碱库存数据的自动化分析,为基本面研究提供可复用的工程化方案。
2. 环境准备与数据说明
2.1 开发环境
本文的示例代码以 Python 3.8+ 为基础,建议使用 Jupyter Notebook 或 VSCode 运行。以下是我的演示环境:
| 工具 | 版本/说明 |
|---|---|
| Python | 3.9 及以上 |
| pandas | 1.5.x 或以上 |
| numpy | 1.23.x 或以上 |
| matplotlib | 3.6.x 或以上 |
| 开发工具 | Jupyter Notebook / VSCode |
如果没有安装依赖库,可以先执行:
pip install pandas numpy matplotlib版本不需要完全一致,重点确认 pandas 的 DataFrame 能力、matplotlib 的画图功能可以正常使用。
2.2 数据文件说明
纯碱厂家库存数据通常以周度为单位发布,每周公布一次。为了方便演示,我构造了一个模拟数据文件soda_inventory.csv,字段结构模拟常见资讯平台的周度库存表格:
date,company_inventory,total_inventory,production_sales 2024-01-01,35.2,58.6,2.4 2024-01-08,36.5,60.2,2.9 2024-01-15,37.8,62.0,3.3 2024-01-22,38.6,63.5,4.1 2024-01-29,40.1,65.8,4.6 2024-02-05,41.7,67.9,5.2 2024-02-12,42.3,69.4,5.8字段说明:
date:发布日期,表示该周库存数据对应的时间点。company_inventory:纯碱厂家库存,单位万吨。total_inventory:包含厂家和社会库存的综合库存,单位万吨。production_sales:当周产量减去当周销量后的净增库存,单位万吨,可以直观反映累库/去库力度。
如果你有自己的数据源,只需要把列名调整为上述字段,或者修改代码中的列名映射即可。
3. 核心分析思路与指标拆解
在写代码之前,先把基本面分析中常用的几个指标定义清楚。因为指标口径不统一,是很多人在数据处理阶段最容易踩坑的地方。
3.1 库存环比变化
库存环比变化是最基础的指标,公式为:
本周库存变化 = 本周库存 - 上周库存如果变化为正,说明累库;变化为负,说明去库。实际数据处理中,我一般还会额外计算“变化率”:
库存环比变化率 = (本周库存 - 上周库存) / 上周库存 × 100%环比变化率可以消除不同库存基数之间的差异,比如 30 万吨库存累加 2 万吨与 100 万吨库存累加 2 万吨,压力完全是两个量级。
3.2 连续累库周数
连续累库周数是判断趋势强度的重要指标。如果连续 6 周库存增加,说明市场已经持续一个半月处于供应过剩状态,这种趋势很难在短时间内反转。
用 Python 统计连续累库周数时,核心逻辑是:把库存变化序列转换成布尔序列(是否累库),然后计算连续为 True 的周数。
3.3 库存可用天数
库存可用天数 = 当前库存 / 日均消耗量
这个指标更多用于评估下游玻璃企业的原料保障程度。如果纯碱厂家库存持续增加,但下游玻璃厂的纯碱可用天数也在增加,说明下游并不缺货,只是采购意愿弱,价格承压会更明显。
3.4 价格与库存的配合判断
库存只是基本面的一环,还需要结合期货价格判断:
- 库存连续增加 + 期货价格持续下跌:供需过剩逻辑正在兑现,下跌趋势可能延续。
- 库存连续增加 + 期货价格止跌横盘:可能意味着低价刺激了部分投机需求,或市场已经在交易供应收缩预期,需要观察累库拐点。
- 库存开始下降 + 期货价格低位反弹:累库周期结束,基本面边际好转,底部有望确认。
所以在脚本中,我还会设计一个可选功能:读取期货收盘价数据,把价格曲线和库存曲线画在同一张图上,方便观察“量价配合”情况。
4. 完整实战案例:Python 分析纯碱库存数据
下面进入主体代码部分。整个项目包含一个数据文件和一个 Python 脚本。脚本实现了库存数据读取、指标计算、连续累库检测、可视化输出四个功能。
4.1 创建项目结构
建议项目目录如下:
soda_analysis/ ├── data/ │ ├── soda_inventory.csv │ └── soda_price.csv ├── analysis_inventory.py └── output/data目录存放原始数据,output目录存放生成图表,analysis_inventory.py是主脚本。
4.2 准备模拟数据
由于真实数据源各有差异,这里提供一份可扩展的模拟数据,方便你直接运行脚本。实际项目中,你可以把文件替换成自己整理好的数据。
data/soda_inventory.csv:
date,company_inventory,total_inventory,production_sales 2024-01-01,35.2,58.6,2.4 2024-01-08,36.5,60.2,2.9 2024-01-15,37.8,62.0,3.3 2024-01-22,38.6,63.5,4.1 2024-01-29,40.1,65.8,4.6 2024-02-05,41.7,67.9,5.2 2024-02-12,42.3,69.4,5.8 2024-02-19,43.6,71.0,6.3 2024-02-26,44.2,72.8,7.1 2024-03-04,45.0,74.1,7.6 2024-03-11,44.8,73.9,-1.2 2024-03-18,44.1,72.5,-2.3 2024-03-25,43.2,70.8,-3.5 2024-04-01,42.0,68.9,-4.2 2024-04-08,41.5,67.6,-3.8 2024-04-15,40.8,66.2,-3.1 2024-04-22,41.2,66.8,0.9 2024-04-29,42.0,68.0,1.8 2024-05-06,42.8,69.5,2.6 2024-05-13,43.5,71.2,3.4data/soda_price.csv:
date,close 2024-01-01,2350 2024-01-08,2320 2024-01-15,2280 2024-01-22,2250 2024-01-29,2210 2024-02-05,2180 2024-02-12,2150 2024-02-19,2120 2024-02-26,2090 2024-03-04,2050 2024-03-11,2080 2024-03-18,2110 2024-03-25,2150 2024-04-01,2180 2024-04-08,2200 2024-04-15,2190 2024-04-22,2160 2024-04-29,2130 2024-05-06,2100 2024-05-13,2070值得注意的是,这份模拟数据中,从 2024-01-01 到 2024-03-04 是一个连续累库阶段,从 2024-03-11 开始库存回落,随后 4 月下旬又开始小幅累库。这样设计是为了演示脚本能自动识别不同的累库/去库波段。
4.3 编写核心分析脚本
下面创建analysis_inventory.py,完整代码如下:
# -*- coding: utf-8 -*- """ 纯碱库存基本面分析脚本 功能: 1. 读取周度库存数据 2. 计算库存环比变化与变化率 3. 检测连续累库周数 4. 结合期货收盘价绘制库存-价格对比图 """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates import os # 设置中文字体,避免图表乱码 plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "PingFang SC"] plt.rcParams["axes.unicode_minus"] = False def load_inventory_data(file_path): """ 读取库存 CSV 文件 返回:包含日期、厂家库存、总库存、产销差的 DataFrame """ if not os.path.exists(file_path): raise FileNotFoundError(f"数据文件不存在: {file_path}") df = pd.read_csv(file_path) df["date"] = pd.to_datetime(df["date"]) df = df.sort_values("date").reset_index(drop=True) return df def load_price_data(file_path): """ 读取期货收盘价数据 """ if not os.path.exists(file_path): return None df = pd.read_csv(file_path) df["date"] = pd.to_datetime(df["date"]) df = df.sort_values("date").reset_index(drop=True) return df def calculate_inventory_change(df): """ 计算库存环比变化和变化率。 同时加入累库/去库标记列。 """ df = df.copy() # 库存环比绝对变化 df["change"] = df["total_inventory"].diff() # 库存环比变化率(百分比) df["change_pct"] = df["total_inventory"].pct_change() * 100 # 是否累库:变化值 > 0 表示累库,变化值 < 0 表示去库 df["is_stocking"] = np.where(df["change"] > 0, 1, np.where(df["change"] < 0, -1, 0)) return df def detect_stocking_streak(df): """ 检测连续累库周数。 返回 DataFrame,新增列 streak 表示截至当前周的连续累库/去库周数。 连续累库用正数表示,连续去库用负数表示。 """ df = df.copy() streaks = [] current_streak = 0 for value in df["is_stocking"]: if value == 1: # 累库 if current_streak >= 0: current_streak += 1 else: # 如果之前是去库,现在转为累库,重置为 1 current_streak = 1 elif value == -1: # 去库 if current_streak <= 0: current_streak -= 1 else: # 如果之前是累库,现在转为去库,重置为 -1 current_streak = -1 else: # 库存不变,保持当前趋势但可能中断,这里简单重置为 0 current_streak = 0 streaks.append(current_streak) df["streak"] = streaks return df def merge_price_data(df, price_df): """ 将库存数据与期货价格数据按日期合并。 价格数据缺少日期时,使用最近一个已发布价格向前填充。 """ if price_df is None: df["close"] = np.nan return df merged = pd.merge_asof( df.sort_values("date"), price_df.sort_values("date"), on="date", direction="backward", ) return merged def plot_inventory_analysis(df): """ 绘制库存走势图、累库/去库柱状图,并结合价格曲线展示。 """ fig, axes = plt.subplots( 3, 1, figsize=(14, 12), sharex=True, gridspec_kw={"height_ratios": [3, 2, 2]}, ) # 第一个子图:库存走势 ax1 = axes[0] ax1.plot(df["date"], df["total_inventory"], marker="o", linewidth=2, color="#1f77b4", label="总库存") ax1.plot(df["date"], df["company_inventory"], marker="s", linewidth=1.5, color="#ff7f0e", label="厂家库存") ax1.set_ylabel("库存(万吨)") ax1.legend(loc="best") ax1.set_title("纯碱周度库存走势") ax1.grid(True, linestyle="--", alpha=0.5) # 第二个子图:累库/去库柱状图 ax2 = axes[1] colors = ["#d62728" if v > 0 else "#2ca02c" for v in df["change"]] ax2.bar(df["date"], df["change"], color=colors, alpha=0.8, label="库存环比变化") ax2.axhline(0, color="black", linewidth=0.8) ax2.set_ylabel("环比变化(万吨)") ax2.legend(loc="best") ax2.grid(True, linestyle="--", alpha=0.3) # 第三个子图:期货价格走势 ax3 = axes[2] ax3.plot(df["date"], df["close"], marker="^", linewidth=1.8, color="#9467bd", label="期货收盘价") ax3.set_ylabel("价格(元/吨)") ax3.legend(loc="best") ax3.grid(True, linestyle="--", alpha=0.3) ax3.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d")) plt.xticks(rotation=45) plt.tight_layout() return fig def print_signal_summary(df): """ 输出当前库存状态的核心结论,方便直接复制到研究笔记中。 """ latest = df.iloc[-1] print("=" * 60) print("纯碱库存信号摘要") print("=" * 60) print(f"最新日期:{latest['date'].strftime('%Y-%m-%d')}") print(f"最新总库存:{latest['total_inventory']:.2f} 万吨") print(f"最新厂家库存:{latest['company_inventory']:.2f} 万吨") print(f"本周库存环比变化:{latest['change']:+.2f} 万吨") print(f"本周库存环比变化率:{latest['change_pct']:+.2f}%") print(f"当前连续累库/去库周数:{int(latest['streak'])} 周") if latest["streak"] >= 6: print("信号:连续累库周数 >= 6,累库压力显著,需要关注供应端收缩信号。") elif latest["streak"] >= 3: print("信号:连续累库 3-5 周,基本面偏弱,关注价格是否止跌。") elif latest["streak"] <= -3: print("信号:已连续去库,基本面边际好转,关注库存拐点后的价格表现。") else: print("信号:库存处于震荡状态,建议等待方向确认。") print("=" * 60) def main(): # 读取数据 inventory_df = load_inventory_data("data/soda_inventory.csv") price_df = load_price_data("data/soda_price.csv") # 计算指标 inventory_df = calculate_inventory_change(inventory_df) inventory_df = detect_stocking_streak(inventory_df) inventory_df = merge_price_data(inventory_df, price_df) # 保存合并后的数据 os.makedirs("output", exist_ok=True) inventory_df.to_csv("output/inventory_analysis_result.csv", index=False, encoding="utf-8-sig") # 输出信号 print_signal_summary(inventory_df) # 画图 fig = plot_inventory_analysis(inventory_df) fig.savefig("output/inventory_analysis.png", dpi=150, bbox_inches="tight") plt.close(fig) print("图表已保存至:output/inventory_analysis.png") if __name__ == "__main__": main()4.4 运行与验证
在项目根目录执行:
python analysis_inventory.py预期输出:
============================================================ 纯碱库存信号摘要 ============================================================ 最新日期:2024-05-13 最新总库存:71.20 万吨 最新厂家库存:43.50 万吨 本周库存环比变化:+1.70 万吨 本周库存环比变化率:+2.45% 当前连续累库/去库周数:4 周 信号:连续累库 3-5 周,基本面偏弱,关注价格是否止跌。 ============================================================ 图表已保存至:output/inventory_analysis.png同时会在output目录下生成:
inventory_analysis_result.csv:合并后的明细数据。inventory_analysis.png:三合一的库存-价格分析图。
4.5 结果说明
从模拟数据看,整个周期内出现了两个累库波段:
- 第一波:2024-01-01 至 2024-03-04,连续累库 9 周,总库存从 58.6 万吨升至 74.1 万吨。
- 第二波:2024-04-22 至 2024-05-13,连续累库 4 周,目前仍在进行中。
第一波累库期间,价格从 2350 元/吨一路下跌到 2050 元/吨。随后 3 月中旬库存开始去化,价格出现了一波 130 元/吨的反弹。这说明脚本自动标识的库存周期与价格走势的配合关系是合理的。等到 4 月下旬库存重新累加,价格又一次走弱。
这种“库存拐点-价格拐点”的联动关系,就是基本面分析中最重要的观察窗口。实际项目里,我们可以把这段代码封装成一个每周自动运行的分析任务,数据更新后直接看输出信号即可。
5. 常见问题与排查思路
5.1 数据文件日期格式不统一
不同数据源给出的日期格式可能是2024/01/01、2024-01-01、20240101,直接读取会解析失败。
解决思路:统一在load_inventory_data中使用pd.to_datetime,并加上errors="coerce"参数,解析失败的数据再单独检查。
df["date"] = pd.to_datetime(df["date"], errors="coerce") df = df.dropna(subset=["date"])5.2 库存数据存在缺失行
如果某周数据缺失,直接diff()计算环比会跳过缺失周。此时建议先用asfreq("W")重采样生成连续周,再决定填充方式:
df = df.set_index("date").asfreq("W-FRI").reset_index() df["total_inventory"] = df["total_inventory"].interpolate()不过要注意,插值只能作为兜底方案,如果缺失周数较多,建议回到原始数据源核对,不要盲目插值。
5.3 图表中文乱码
matplotlib 在部分 Linux 服务器上无法显示中文,原因是系统缺少中文字体。
解决方案:在脚本开头设置可用中文字体:
import matplotlib.font_manager as fm # 查看本机可用字体 fonts = [f.name for f in fm.fontManager.ttflist if any(keyword in f.name for keyword in ["SimHei", "Hei", "Microsoft YaHei", "PingFang", "WenQuanYi"])] print(fonts)然后选择实际存在的字体。如果服务器完全没有中文字体,可以安装:
sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei安装后重启 Python 进程即可。
5.4 周度数据频率不一致
有的数据源带具体时间点,有的只有“第几周”。建议统一处理成每周最后一个交易日或固定星期五。
示例代码:
df["week_end"] = df["date"] + pd.to_timedelta((4 - df["date"].dt.dayofweek) % 7, unit="D")这样就能把一周内任意时间的数据归属到当周的周五标签下,方便多数据源对齐。
5.5 累计涨跌幅计算有偏差
pct_change()计算的是相邻周期的百分比变化。如果库存从 60 万吨涨到 74 万吨,累计涨幅应该是:
累计涨幅 = (74.1 - 58.6) / 58.6 × 100% ≈ 26.45%而不是把每周的环比变化率简单相加。所以需要区分“单周环比”和“区间累计变化”,避免在汇报时混淆口径。
排查建议表格:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 日期解析失败 | 数据源日期格式不统一 | 统一使用 pd.to_datetime 并检查异常值 |
| 库存环比为 NaN | 首行数据本身无上一期 | 首行变化置为 0,从第二行开始计算 |
| 连续累库周数统计不对 | 未区分累库/去库切换逻辑 | 使用状态机式逐行判断并重置 |
| 图表中文乱码 | 系统缺少中文字体 | 安装中文字体或设置 rcParams 字体 |
| 价格合并后存在 NaN | 价格数据日期与库存日期不完全一致 | 使用 merge_asof 向前填充 |
| 输出 CSV 打开乱码 | UTF-8 编码在 Excel 中兼容不佳 | 保存时使用 utf-8-sig 编码 |
6. 最佳实践与工程建议
6.1 数据口径必须写清楚
做基本面分析,数据口径不统一会导致结论完全相反。比如“厂家库存”有的数据源只算重碱厂家,有的包含轻碱;有的包含交割库库存,有的是纯厂库。
最佳实践:
- 在代码里维护一份
config.yaml或注释,写明每个字段的统计口径。 - 每次更新数据源后,确认列名和单位没有变化。
- 输出结果文件名带上数据源标识,例如
inventory_analysis_result_zhongliang.csv。
6.2 不要只看单一库存指标
纯碱基本面除了库存,还需要跟踪:
- 周度开工率。
- 周度产量。
- 周度表观消费量。
- 下游浮法玻璃产线变化。
- 光伏玻璃新增点火计划。
- 进口/出口数据。
- 上游原盐价格。
库存拐点确认最好和开工率、产销率一起看。比如本文脚本输出“连续累库 4 周”时,如果同时发现纯碱企业开工率开始从高位回落,那说明供应端已经在自我调节,底部逻辑会更扎实。
6.3 参数阈值要可配置
连续累库“6 周”这个阈值并不是固定的。不同周期、不同库存绝对值水平下,显著累库的标准不同。建议把阈值提到配置文件里:
{ "stocking_threshold": 6, "destocking_threshold": 3, "inventory_unit": "万吨" }代码中直接读取:
import json with open("config.json", "r", encoding="utf-8") as f: config = json.load(f) STOCK_THRESHOLD = config["stocking_threshold"]这样做的好处是,每周复盘时如果发现阈值不合适,不需要改代码逻辑,只改配置即可。
6.4 保存历史快照
基本面分析是一个长期跟踪过程。建议每次运行脚本后,把原始数据、计算结果、图表一起归档到带日期的目录:
output/ ├── 2024-05-13/ │ ├── inventory_analysis_result.csv │ ├── inventory_analysis.png │ └── raw_inventory.csv这样回看历史时,可以快速定位“5 月 13 日当时看到的库存状态”,避免因为数据修正导致的历史结论失真。
6.5 合规与风险提示
商品期货分析存在较高不确定性,库存数据本身有滞后性,而且不同资讯平台的调研口径可能存在偏差。以下几条务必注意:
- 文章中涉及的数据均为模拟数据,仅用于演示分析方法,不构成任何投资建议。
- 不要用单周库存变化做交易决策,至少需要结合 4 周以上趋势。
- 自动化脚本输出的“信号”应视为研究辅助工具,不能替代基本面研究员的综合判断。
- 所有数据最终以交易所和官方渠道发布为准。
7. 总结与下一步学习
本文从纯碱基本面分析中最常见的“库存连续增加”问题出发,完整演示了如何用 Python 实现纯碱库存数据的读取、清洗、指标计算、连续累库检测和可视化。通过这份脚本,你可以快速把零散的周度库存数据整理成一张带有累库周期标注的分析图,并自动输出“连续累库N周”的文本信号。
现在你应该掌握了:
- 纯碱库存数据的主要分类与口径。
- 库存周期四个阶段与价格的关系。
- 库存环比、变化率、连续累库周数的计算方法。
- 用 pandas 处理周度时间序列的核心流程。
- 用 matplotlib 绘制库存-价格对比图。
- 数据缺失、中文乱码、日期对齐等常见问题的处理方式。
下一步可以继续学习的内容:
- 把库存数据和开工率、产销率数据合并进同一套分析框架。
- 加入期货技术面指标(如均线、MACD、成交量),形成基本面+技术面的综合信号。
- 用 Python 定时任务每天自动抓取最新数据,并生成日报推送。
- 尝试用统计方法做库存拐点预测,比如库存周期均值回归模型。
在实际项目中,我更推荐你优先把数据清洗和口径统一工作做扎实,再考虑复杂的模型和预测。因为基本面数据的质量,决定了后续所有指标和图表的价值。如果原始数据本身存在较多噪音,任何高级分析都可能得出偏差较大的结论。
直接在本地把这份脚本跑起来,替换成自己关注的品种数据,你会发现:库存连续增加时,分析路径其实是可以标准化的,而“底部在哪里”的答案,往往就藏在累库拐点出现的那一刻。