Compare commits
22 Commits
f0a785f8f8
...
feat-catl
| Author | SHA1 | Date | |
|---|---|---|---|
| a46de853a0 | |||
| f646ee6718 | |||
| 3a3d19d5dd | |||
| a15b3f8027 | |||
| 417116b928 | |||
| a6387f8220 | |||
| 2a38778fa3 | |||
| bab02e1efd | |||
| 44c6437b64 | |||
| 9605228c3f | |||
| b3c7c30a1f | |||
| d093a322d3 | |||
| 04105ad6eb | |||
| 143cd1fbf8 | |||
| 2555453b79 | |||
| d51890a450 | |||
| d010b107aa | |||
| e5c21c6148 | |||
| 7aab3d7134 | |||
| 5ecc554aaa | |||
| 2fe0f245e3 | |||
| 25781f2ee6 |
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
import {
|
import {
|
||||||
PALETTE, FONT, axisCommon, periodAxis, titleStyle,
|
PALETTE, FINANCIAL_COLORS, BRIDGE_COLORS, CHANNEL_COLORS, FONT, axisCommon, periodAxis, titleStyle,
|
||||||
lineSeries, barSeries, standardLegend, footnote, watermarks, LAYOUT,
|
lineSeries, lineDataWithSafeLabels, barSeries, standardLegend, footnote, watermarks, LAYOUT,
|
||||||
} from '../theme.js';
|
} from '../theme.js';
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -22,18 +22,53 @@ import {
|
|||||||
```bash
|
```bash
|
||||||
node test/regress.mjs ppmt_ip_share # 改了一张,就只测这一张
|
node test/regress.mjs ppmt_ip_share # 改了一张,就只测这一张
|
||||||
node test/regress.mjs ppmt_ip_share ppmt_core_margin # 改了多张,列出来
|
node test/regress.mjs ppmt_ip_share ppmt_core_margin # 改了多张,列出来
|
||||||
npm test # 全量,只在改了 theme.js / csv.js 等公共模块时才跑
|
pnpm test # 全量,只在改了 theme.js / csv.js 等公共模块时才跑
|
||||||
```
|
```
|
||||||
|
|
||||||
全量跑纯属浪费,而且十几张无关图表的输出会盖住本次改动的真实问题。不传参数时才是全量,所以 `npm test` 保持向后兼容。
|
全量跑纯属浪费,而且十几张无关图表的输出会盖住本次改动的真实问题。不传参数时才是全量,所以 `pnpm test` 保持向后兼容。
|
||||||
|
|
||||||
它会断言 `legend.top`、`grid.top`、折线 `symbolSize`/`borderWidth`,并检查 SVG 字体引号。加新图记得同步往 `regress.mjs` 顶部的 `all` 数组加一行,否则不会被测到。
|
它会断言 `legend.top`、`grid.top`、折线 `symbolSize`/`borderWidth`,并检查 SVG 字体引号。回归测试直接遍历 `manifest.json` 的 `chartCatalog`,新增图只要完成 registry 与 manifest 登记就会被测到。
|
||||||
|
|
||||||
|
**带参数的图要另外跑参数测试。** 通用回归永远按默认值渲染,跑不到手输参数那条路径:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test:param # 甜蜜击球区「现价」参数:标线位置 + 插值结果(两家公司 6 张图)
|
||||||
|
```
|
||||||
|
|
||||||
|
**手输参数的图还要量几何、而且必须扫全价位。** 参数测试只查数值对不对,查不出「标签撞在一起」;而碰撞窗口常常只有几个价位宽 —— 甜蜜击球区实测:现价贴数据区下沿时顶部标注会撞左上角的区域带标签(宁德只有 220–240 会撞,抽查 310/400/700 全绿),现价落进关键价位旁一个数据格时两个数据标签会叠(宁德只在 265±20、腾讯只在 404.5±17):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp ~/.workbuddy/skills/smart-fin-chart-add-chart/scripts/geometry_check.mjs tmp_geometry.mjs
|
||||||
|
node tmp_geometry.mjs --sweep sweet-tencent-price-ev sweet-catl-any-price # 全价位扫描
|
||||||
|
node tmp_geometry.mjs --w=940 sweet-tencent-price-ev # 换画布宽度
|
||||||
|
rm tmp_geometry.mjs
|
||||||
|
```
|
||||||
|
|
||||||
|
## 图表参数(tab 级控件)
|
||||||
|
|
||||||
|
可手输的参数在 `manifest.json` 的 **tab** 上声明,不是在卡片上 —— 同一 tab 里的图共用一套口径(现价对三张击球区图是同一个事实),卡片级会变成三个各说各话的输入框:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"tabs": [{ "id": "catl", "name": "宁德时代",
|
||||||
|
"controls": [{ "id": "price", "type": "number", "label": "现价", "unit": "元",
|
||||||
|
"value": 316.21, "min": 220, "max": 700, "step": 1 }],
|
||||||
|
"chartRefs": ["..."] }]
|
||||||
|
```
|
||||||
|
|
||||||
|
- 链路:`renderTabControls`(ui.js,纯 DOM)→ `applyTabParam`(main.js,校验 + 防抖)→ `refreshChartParams`(复用实例 `setOption`,不 dispose 重建)→ 图表 builder 的第三个参数 `params`。
|
||||||
|
- **位置**:`shell.params` 是页面里独立的一行,钉在 tab 栏正下方,与 tab 栏同处一个 sticky 容器 `.tab-header`(两行各自 sticky 就得给参数行算「tab 栏高度」的偏移,而 tab 栏会换行、窄屏还横向滚动,高度不固定)。没有 `controls` 的 tab 由 JS 置 `hidden`,整行含虚线分隔一并消失。改动这里要连带核对 `.card` 的 `scroll-margin-top`(桌面 128px / ≤880px 160px,= 页头底边 + 18px 呼吸)。
|
||||||
|
- builder 签名写成 `(rows, { width, height, params })`,取值用 `resolvePrice(params)` 之类带兜底的解析函数:**没有 params 时必须回落到默认值**,否则 SSR 回归测试与脚本会拿到 NaN。
|
||||||
|
- **可输区间 = 数据区,不是坐标轴**:手输值靠相邻行线性插值取值,落在数据区外只能得到 NaN。轴可以比数据区宽一点(留白),输入区间不行。
|
||||||
|
- 手输值通常不是数据行,所以那些「只标关键价位」的 `labeledPrices` 要按数据行命中与否决定是否带上它,并做避让(见 `sweet_spot.js` 的 `refLabels`):现价与某个关键价位落在**同一个数据格**内时只留现价 —— 两个标签数值几乎相同、包围盒会实打实叠在一起。阈值取数据格步长(20)而不是现算像素,因为标签宽约 43px、每元约 1.8px,像素阈值会随轴范围漂。
|
||||||
|
- **「现价」这类跟随输入变化的 graphic 标注要画在绘图区上方那条留白带里**(`top: LAYOUT.gridTop - 30`),不要贴绘图区顶边(`gridTop + 4`):贴边时它和绘图区顶行的文字抢位置,手输值落在低价端必然相撞(宁德 220 元时与「卖出区 >30x」重叠 35×8px)。画在外面只剩居中的图例在它上方,永不相交,顺带消除了「换个价、标注就上下跳」。
|
||||||
|
- **纵轴下限要给「区域带名字」那一条留位置。** 纵向区域带的名字画在绘图区底边上方 12–25px,若数据线能压到接近下限,线标签就会和带名字重叠(宁德图 3 的「仅价差年化」在 700 元处跌到 -4.7%,轴下限 -10 只留 5.3pp 余量,手输 680 元时「-3.8%」压住「卖出区」22×7px)。改轴下限比挪标签便宜:图 3 的纵轴两家现在都是 -20 起。
|
||||||
|
- 默认值的同源方要写在注释里。现价这套:`sweet_spot.js` 的 `profile.priceDefault`、manifest 的 `controls[].value`、`build_sweet_spot_catl.py` / `build_sweet_spot_tencent.py` 三处一起改。
|
||||||
|
|
||||||
**右侧纵向图例的图会报 `legend.top=middle (期望85)`,这是预期的,不要去"修"。** 那条断言的 85px 基准是给顶部横向图例定的,对 `orient: 'vertical'` + `top: 'middle'` 的图不适用(`ppmt_ip_share`、`ppmt_ip_share_history` 都会报)。
|
**右侧纵向图例的图会报 `legend.top=middle (期望85)`,这是预期的,不要去"修"。** 那条断言的 85px 基准是给顶部横向图例定的,对 `orient: 'vertical'` + `top: 'middle'` 的图不适用(`ppmt_ip_share`、`ppmt_ip_share_history` 都会报)。
|
||||||
|
|
||||||
## 踩过的坑
|
## 踩过的坑
|
||||||
|
|
||||||
**不要用 `...legendStyle`。** 它遗留 `top: 62` 且曾带 `icon: 'roundRect'`——后者会盖掉 ECharts 按系列类型自动生成的图例(折线本该是「短线+空心圆」)。用 `standardLegend()`。
|
**优先用 `standardLegend()`,且不要手工设置 `legend.icon`。** ECharts 会按系列类型自动生成图例:柱状图为矩形,折线图为「短线 + 空心圆」。需要特殊位置时可扩展 `legendStyle`,但不得覆盖这一自动类型图标。
|
||||||
|
|
||||||
**`label.position` 不接受函数。** 写了会被静默忽略、退化成默认位置,实测确认过。要让同一系列内不同点朝向不同,只能逐点覆盖 `data`:`{ value, label: { position: 'top' } }`。
|
**`label.position` 不接受函数。** 写了会被静默忽略、退化成默认位置,实测确认过。要让同一系列内不同点朝向不同,只能逐点覆盖 `data`:`{ value, label: { position: 'top' } }`。
|
||||||
|
|
||||||
@@ -45,6 +80,10 @@ npm test # 全量,只在改了 t
|
|||||||
|
|
||||||
## 数据口径
|
## 数据口径
|
||||||
|
|
||||||
|
**底稿与图表数据分层。** `data/{company}/rawData/` 是唯一可维护的数据层。当前泡泡玛特的维护入口是其中的 `泡泡玛特_财报分析底稿.xlsx`:人工或 AI 从 PDF、截图、XLSX 提取的基础值先写入这份底稿,并保留来源文件、工作表和定位信息。`data/{company}/*.csv` 是图表运行时投影,只能由脚本生成,禁止手工编辑。
|
||||||
|
|
||||||
|
**维护明细,不维护可推导结果。** 收入、门店数、财报科目等基础值应保存;占比、同比、利润率、H2 单半年和分析分类小计应由脚本生成。若财报披露了占比,可作为核对值保留,但不是图表的唯一输入。资产负债表的“类现金/经营类资产/有息负债”等分类以独立规则映射明细科目,不复制成第二套人工数字。
|
||||||
|
|
||||||
**数值默认保留一位小数。** CSV 数据列与图表展示(柱/点标签、tooltip)统一保留一位小数(如 `71.1`、`311.4%`),四舍五入;确实需要其他精度时必须在 `footnote()` 或代码注释里说明原因。
|
**数值默认保留一位小数。** CSV 数据列与图表展示(柱/点标签、tooltip)统一保留一位小数(如 `71.1`、`311.4%`),四舍五入;确实需要其他精度时必须在 `footnote()` 或代码注释里说明原因。
|
||||||
|
|
||||||
**CSV 存四位年份**(`2026H1`),简写只在显示层做。核对数据时无歧义。
|
**CSV 存四位年份**(`2026H1`),简写只在显示层做。核对数据时无歧义。
|
||||||
@@ -57,8 +96,33 @@ npm test # 全量,只在改了 t
|
|||||||
|
|
||||||
**桥图/瀑布图要验算闭合。** 各项占营收比是税前口径,加总到净利率前须乘税盾 `(1 - 有效税率)`;税率变化单独成项。恒等式 `净利率 = 税前利润率 × (1-税率)`,分解为 `Δ净 = Δ税前×(1-t₁) − 税前₂×Δt`。改完核对首尾误差应 < 0.05pct。
|
**桥图/瀑布图要验算闭合。** 各项占营收比是税前口径,加总到净利率前须乘税盾 `(1 - 有效税率)`;税率变化单独成项。恒等式 `净利率 = 税前利润率 × (1-税率)`,分解为 `Δ净 = Δ税前×(1-t₁) − 税前₂×Δt`。改完核对首尾误差应 < 0.05pct。
|
||||||
|
|
||||||
|
## 甜蜜击球区板块(股价 ↔ 估值)
|
||||||
|
|
||||||
|
菜单 id `sweet-spot`,两个 tab(`catl` 宁德时代 / `tencent` 腾讯控股),各三张图,**共用一套通用 builder**:
|
||||||
|
|
||||||
|
| | 宁德时代 | 腾讯控股 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 纵轴口径 | `PE = 市值 ÷ 2026E 归母净利` | `EV/EBIT =(市值 − 非经营资产)÷ TTM EBIT` |
|
||||||
|
| 扣什么 | 类现金 2,263.8 亿(纯现金,准现金) | 净现金 581.9 + 上市投资 4,872.0 + 非上市投资 387.9 = 5,841.8 亿(股权,会波动) |
|
||||||
|
| 甜蜜区锚 | 13 / 15.5 / 25 / 30x(资料库原表五档) | 8 / 10 / 12x(巴菲特原始锚,白送 / 甜点 / 上沿) |
|
||||||
|
| 数据区 / 输入区 | 220–700 元 | 240–640 港元 |
|
||||||
|
| 默认现价 | 316.21 元(2026-09-15) | 426.8 港元(2026-09-17) |
|
||||||
|
|
||||||
|
**两家的口径差异不是随意选的**:宁德的类现金是现金,扣掉不改变分子的性质,PE 口径成立;腾讯的「类现金」主体是 5,260 亿投资组合(股权会波动),只扣净现金 581.9 亿几乎不改变倍数(少 0.23x),必须连投资组合一起扣才是经营资产的真实价格 —— 图 2 的三层线(不扣 / 只扣净现金 / 全扣)就是为把「漏扣投资组合会得出超上沿的假阴性」这件事画出来。
|
||||||
|
|
||||||
|
- 代码结构:`js/charts/sweet_spot.js` 里 `PROFILES = { catl, tencent }` 两个配置块 + 三个通用 builder(`buildMultipleChart` / `buildAssetTierChart` / `buildAnyPriceChart`),导出 6 个图表函数。**加第三家公司不要复制粘贴 builder**,照着配置块的字段补齐即可。
|
||||||
|
- CSV 由 `scripts/build_sweet_spot_catl.py` / `build_sweet_spot_tencent.py` 生成,禁止手工编辑。改股本、汇率、利润预期 → 改脚本常量 → 重跑 → 图表自动跟着走(区域边界是从 CSV 反解的,没写死)。
|
||||||
|
- 区域边界的**股价**必须从数据反解(`multToPrice`),缺席的阈值**留 `null` 占位不要 filter 掉**,否则后面档位整体前移一格(表现为「偏贵」色带铺到轴右端、最贵那档退化成零宽,且不报错)。
|
||||||
|
- 验证:`node test/sweet_spot_param.mjs`(42 项,独立复算公式)+ `geometry_check.mjs --sweep`(全价位量几何)。
|
||||||
|
|
||||||
## 配色
|
## 配色
|
||||||
|
|
||||||
|
**正式方向:轻快消费。** 柱线组合图的现金流、利润与同比使用 `FINANCIAL_COLORS`,渠道结构使用 `CHANNEL_COLORS`,瀑布图使用 `BRIDGE_COLORS`(蓝色基准、青绿色正向、珊瑚红负向);不要在图表文件里为相同财务/渠道语义重写十六进制颜色。柱状系列负责分类,折线只保留一条高辨识度强调色。
|
||||||
|
|
||||||
|
**一张图只留一个视觉主角。** 辅助柱使用中等饱和度;避免红、橙、紫等多个强调色同时竞争。分类色要同时拉开色相和明度;折线除颜色外还使用线宽、实虚线、空心圆和标签优先级辅助区分。
|
||||||
|
|
||||||
|
**柱线组合的标签不能压在柱体端点。** 使用 `lineDataWithSafeLabels(rows, { lineKey, barKeys })`:正值标签在上、负值标签在下,接近柱值时自动增加距离,并配合 ECharts `labelLayout` 兜底;不要按某个年份写特判。
|
||||||
|
|
||||||
先分清两件事,别混用同一个门槛。**选色的功夫要和系列数成正比**——两个系列的图不该选半天。
|
先分清两件事,别混用同一个门槛。**选色的功夫要和系列数成正比**——两个系列的图不该选半天。
|
||||||
|
|
||||||
**① 同一张图内的系列要能互相区分。** 这条永远要满足,是可读性问题:
|
**① 同一张图内的系列要能互相区分。** 这条永远要满足,是可读性问题:
|
||||||
@@ -85,6 +149,6 @@ npm test # 全量,只在改了 t
|
|||||||
|
|
||||||
## 脚注
|
## 脚注
|
||||||
|
|
||||||
`footnote()` 单行约 60 字符封顶(1200px 画布),超了用 `\n` 手动断行。结尾统一 `| @思考的Joey`。
|
`footnote()` 单行约 60 字符封顶(1200px 画布),超了用 `\n` 手动断行。结尾统一 `| @Joey知行记`。
|
||||||
|
|
||||||
水印文案在 `theme.js` 的 `WATERMARK_TEXT`,改一处全局生效。
|
水印文案在 `theme.js` 的 `WATERMARK_TEXT`,改一处全局生效。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 财报图表 · Joey 谨制
|
# 财报图表 · Joey 谨制
|
||||||
|
|
||||||
基于 **ECharts 5.5** 的财报数据可视化项目,模仿"方木博制"风格。
|
基于 **ECharts 5.5** 的财报数据可视化项目,采用“Joey 风格”。
|
||||||
|
|
||||||
修改 CSV 数据,刷新页面即可更新图表;每张图表都可独立导出为高清 PNG。
|
修改 CSV 数据,刷新页面即可更新图表;每张图表都可独立导出为高清 PNG。
|
||||||
|
|
||||||
@@ -8,24 +8,38 @@
|
|||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
### 1. 启动本地服务器
|
首次使用时,在项目根目录安装依赖:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 方案 A:Python 3(Mac/Linux 自带)
|
pnpm install
|
||||||
python3 -m http.server 8899
|
```
|
||||||
|
|
||||||
# 方案 B:Node.js(需要先安装 Node)
|
### 1. 启动开发服务器(支持热更新)
|
||||||
npx http-server -p 8899
|
|
||||||
|
|
||||||
# 方案 C:PHP(Mac 自带)
|
```bash
|
||||||
php -S localhost:8899
|
# 方案 A:Vite 开发服务器
|
||||||
|
pnpm dev
|
||||||
|
|
||||||
|
# 方案 B:直接双击项目根目录的 `.start.command`
|
||||||
|
# 脚本会启动 Vite 并自动打开浏览器
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. 打开浏览器
|
### 2. 打开浏览器
|
||||||
|
|
||||||
访问 **http://localhost:8899**。页面左侧选择公司,中间用 Tab 切换分析维度,右侧可跳转到当前分类的图表。
|
访问 **http://localhost:8899**。页面左侧选择公司,中间用 Tab 切换分析维度,右侧可跳转到当前分类的图表。
|
||||||
|
|
||||||
当前 manifest 内登记了 5 张示例图表和 14 张泡泡玛特财报图表:
|
修改 `js/` 或 `css/` 后页面会热更新;修改 `manifest.json` 或 `data/**/*.csv` 后页面会自动整页刷新。
|
||||||
|
|
||||||
|
需要生成静态发布文件时:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm build
|
||||||
|
pnpm preview
|
||||||
|
```
|
||||||
|
|
||||||
|
构建结果位于 `dist/`,其中包含运行所需的 manifest 与 CSV,不包含 `data/ppmt/raw/` 中的原始 PDF/XLSX。
|
||||||
|
|
||||||
|
当前 manifest 内登记了 5 张示例图表和 22 张泡泡玛特财报图表:
|
||||||
|
|
||||||
**示例图表:**
|
**示例图表:**
|
||||||
1. **存货、营收与存货周转天数** — 双柱 + 折线,双 Y 轴
|
1. **存货、营收与存货周转天数** — 双柱 + 折线,双 Y 轴
|
||||||
@@ -49,6 +63,8 @@ php -S localhost:8899
|
|||||||
17. **主要 IP 收入占比(2026H1)** — 饼图,右侧图例带收入与占比
|
17. **主要 IP 收入占比(2026H1)** — 饼图,右侧图例带收入与占比
|
||||||
18. **各 IP 半年收入占比(21H1-26H1)** — 归一化堆叠柱状图,看收入结构变迁
|
18. **各 IP 半年收入占比(21H1-26H1)** — 归一化堆叠柱状图,看收入结构变迁
|
||||||
19. **除 THE MONSTERS 外的 IP 收入及同比** — 柱 + 折线双轴,剔掉爆款看其余盘子
|
19. **除 THE MONSTERS 外的 IP 收入及同比** — 柱 + 折线双轴,剔掉爆款看其余盘子
|
||||||
|
20. **区域渠道分布(2026H1)** — 左右堆叠条形图,对比各区域线上与线下渠道收入
|
||||||
|
21. **区域渠道同比增速趋势** — 热力图查看区域 × 渠道的历史同比变化
|
||||||
|
|
||||||
### 3. 修改数据
|
### 3. 修改数据
|
||||||
|
|
||||||
@@ -77,6 +93,7 @@ smart-fin-chart/
|
|||||||
├── data/ # 数据文件(按公司划分)
|
├── data/ # 数据文件(按公司划分)
|
||||||
│ ├── demo/
|
│ ├── demo/
|
||||||
│ └── ppmt/
|
│ └── ppmt/
|
||||||
|
│ └── raw/ # 用户提供的原始 xlsx / PDF
|
||||||
├── js/
|
├── js/
|
||||||
│ ├── main.js # 入口:读取 manifest、渲染、导出 PNG
|
│ ├── main.js # 入口:读取 manifest、渲染、导出 PNG
|
||||||
│ ├── ui.js # 三栏 UI 构建
|
│ ├── ui.js # 三栏 UI 构建
|
||||||
@@ -92,7 +109,7 @@ smart-fin-chart/
|
|||||||
## 测试
|
## 测试
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm test
|
pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
用 ECharts 的 SSR 模式遍历 manifest 中的图表并渲染成 SVG,断言:
|
用 ECharts 的 SSR 模式遍历 manifest 中的图表并渲染成 SVG,断言:
|
||||||
@@ -139,7 +156,7 @@ A:
|
|||||||
1. 在 `data/` 下创建新 CSV
|
1. 在 `data/` 下创建新 CSV
|
||||||
2. 在 `js/charts/` 下创建新 `.js`,从 `theme.js` 取共享配置(`lineSeries()`、`barSeries()`、`standardLegend()`、`periodAxis`),不要手写等价值
|
2. 在 `js/charts/` 下创建新 `.js`,从 `theme.js` 取共享配置(`lineSeries()`、`barSeries()`、`standardLegend()`、`periodAxis`),不要手写等价值
|
||||||
3. 在 `js/charts/index.js` 注册 chart key
|
3. 在 `js/charts/index.js` 注册 chart key
|
||||||
4. 在 `manifest.json` 对应公司与 Tab 中添加图表配置
|
4. 在 `manifest.json` 对应公司的 `chartCatalog` 中登记图表配置,再在需要展示的 Tab 的 `chartRefs` 中引用它;概览可直接引用同一图表 ID,无需复制配置
|
||||||
5. 跑 `node test/regress.mjs <chart-id>`;浏览器检查标签、颜色和脚注
|
5. 跑 `node test/regress.mjs <chart-id>`;浏览器检查标签、颜色和脚注
|
||||||
|
|
||||||
**Q:能改水印文字吗?**
|
**Q:能改水印文字吗?**
|
||||||
@@ -152,7 +169,7 @@ A:编辑 `js/theme.js` 的 `PALETTE` 对象,所有图表自动同步。
|
|||||||
|
|
||||||
## 技术细节
|
## 技术细节
|
||||||
|
|
||||||
- **ECharts 5.5.1**:从 jsDelivr CDN 加载,无需 npm install
|
- **ECharts 5.5.1**:从 jsDelivr CDN 加载,无需额外安装 ECharts
|
||||||
- **ES6 Modules**:用原生 `<script type="module">`,无构建步骤
|
- **ES6 Modules**:用原生 `<script type="module">`,无构建步骤
|
||||||
- **Canvas 渲染**:页面用 canvas(性能好),导出时用 ECharts 自带的 `getDataURL` 生成 PNG
|
- **Canvas 渲染**:页面用 canvas(性能好),导出时用 ECharts 自带的 `getDataURL` 生成 PNG
|
||||||
- **响应式**:window resize 时重绘(水印数量跟着画布尺寸变化)
|
- **响应式**:window resize 时重绘(水印数量跟着画布尺寸变化)
|
||||||
@@ -162,3 +179,27 @@ A:编辑 `js/theme.js` 的 `PALETTE` 对象,所有图表自动同步。
|
|||||||
## 许可
|
## 许可
|
||||||
|
|
||||||
本项目代码采用 MIT 协议,数据仅供示例。
|
本项目代码采用 MIT 协议,数据仅供示例。
|
||||||
|
|
||||||
|
## 估值工具
|
||||||
|
|
||||||
|
左侧选择「估值工具」,打开「目标收益反推增长率」Tab。支持反推所需归母利润年复合增长率、计算预期年化 IRR、反推最高买入价;可调整安全边际、股息、股本变化率、基期和币种汇率。参数自动保存在当前浏览器,点击「恢复示例参数」可重置。
|
||||||
|
|
||||||
|
入口:`#/valuation-tools/stock-return-valuation`。默认数字是教学情景假设,不是实时行情或财报。计算口径来自 `stock-return-valuation` 技能 v1.2.0,浏览器引擎位于 `js/tools/stock-return-math.js`,界面位于 `js/tools/stock-return-calculator.js` 和同名 HTML 模板。
|
||||||
|
|
||||||
|
单独运行估值检查:`npm run test:valuation`;`npm test` 同时运行图表回归与估值检查。
|
||||||
|
|
||||||
|
「DCF 估值」Tab(`#/valuation-tools/dcf`)采用分段工作台,可设置 1—5 个增长阶段,每段输入年数与现金流年增长率,总预测期不超过 30 年。支持 FCFF/WACC 与 FCFE/股权资本成本两种口径、永续增长终值、股权价值调整和逐年折现明细。
|
||||||
|
|
||||||
|
总股本在基础参数区单独填写,单位为亿股;每股价值 = 股权价值(亿元)÷ 当前总股本(亿股)。每家公司的股本、股本日期、现金流和增长假设独立保存在当前浏览器,也可新增公司。真实公司初次使用时,现金流与股本留空,需自行核实后填写;教学示例的 10 亿股仅为假设。当前模型使用人民币金额与预测期内不变的股本。
|
||||||
|
|
||||||
|
公司以按钮形式展示,点击即可切换;当前股价、股价日期和区间阈值也按公司自动保存到 LocalStorage,兼容原有 DCF 本地记录。股价需要手动输入,不自动请求行情。未填或填错股价不影响已完成的 DCF 计算,也不会保留上次股价标记。
|
||||||
|
|
||||||
|
ECharts 区间图以 DCF 每股价值为基准,默认低于其 80% 为低估、高于其 120% 为高估,两端边界均包含在合理区间内。「区间设置」可分别修改低估折价(同时作为安全边际)与高估溢价阈值。这是当前假设下的自定义价格分区,不是独立的投资结论;无正股权价值时不显示区间。
|
||||||
|
|
||||||
|
「目标收益交叉验证」共用当前公司的股价、股本、基期和 DCF 参考价。输入独立的归母净利润及预计利润增速后,可比较现价、DCF 含安全边际参考价两种买入情景的所需利润 CAGR 与预计 IRR,并查看悲观/基准/乐观退出 PE 情景。计算复用独立「目标收益反推增长率」工具的数学引擎。
|
||||||
|
|
||||||
|
首屏顶部并列展示当前股价、按现价计算的预计年化 IRR、达到目标收益所需的利润年增速;后两项采用基准退出 PE,与下方现价情景结果同步。修改参数或切换公司后即时更新,参数不完整或无效时清除旧值。
|
||||||
|
|
||||||
|
FCFE 模式可选择以用户提供的基期现金转化率(FCFE ÷ 归母净利润)估算利润;该值会明确标注为估算,不作为独立财报验证。FCFF 模式要求单独填写归母净利润。真实公司的利润、转化率和预计利润增速默认留空,新增验证参数仍按公司保存在原有 LocalStorage 记录中。
|
||||||
|
|
||||||
|
双买入价格表按各自实际买入价反推增速及计算 IRR,不额外叠加安全边际。「共同参考买入上限」取 DCF 参考价和目标收益模型参考价的较低值,两边各应用一次安全边际。分红按独立路径计算;交叉验证中的股本变化仅影响收益模型,DCF 仍采用固定股本假设。验证参数缺失或无效时只隐藏验证结果,不影响有效的 DCF 结果。
|
||||||
|
|||||||
+984
@@ -0,0 +1,984 @@
|
|||||||
|
/* Share the application palette; keep semantic valuation bands subdued. */
|
||||||
|
.dcf-calculator {
|
||||||
|
--df-bg:var(--surface);
|
||||||
|
--df-paper:var(--surface);
|
||||||
|
--df-ink:var(--ink);
|
||||||
|
--df-muted:#75716c;
|
||||||
|
--df-line:var(--line);
|
||||||
|
--df-accent:var(--accent);
|
||||||
|
--df-soft:var(--accent-soft);
|
||||||
|
--df-field:#faf9f7;
|
||||||
|
--df-accent-line:#d7c7b6;
|
||||||
|
--df-chart-secondary:#cbbba9;
|
||||||
|
--df-error:#a63f32;
|
||||||
|
--df-error-bg:#fff1ee;
|
||||||
|
--df-low:#e8ece5;
|
||||||
|
--df-fair:#eee9df;
|
||||||
|
--df-high:#eee5e1;
|
||||||
|
--df-good:#64715e;
|
||||||
|
--df-fair-ink:#786950;
|
||||||
|
--df-high-ink:#866d65;
|
||||||
|
--df-warning-bg:#f6f2eb;
|
||||||
|
background:var(--df-bg);
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
color:var(--df-ink);
|
||||||
|
border-radius:16px;
|
||||||
|
grid-template-columns:minmax(0,1fr);
|
||||||
|
gap:20px;
|
||||||
|
padding:28px;
|
||||||
|
font-size:13px;
|
||||||
|
line-height:1.6;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator * {
|
||||||
|
box-sizing:border-box}
|
||||||
|
.dcf-calculator>* {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator [hidden] {
|
||||||
|
display:none!important}
|
||||||
|
.dcf-calculator h2 {
|
||||||
|
letter-spacing:-.8px;
|
||||||
|
margin:4px 0 5px;
|
||||||
|
font-size:27px;
|
||||||
|
font-weight:600;
|
||||||
|
line-height:1.5}
|
||||||
|
.dcf-calculator h3 {
|
||||||
|
margin:0;
|
||||||
|
font-size:14px;
|
||||||
|
font-weight:600}
|
||||||
|
.dcf-calculator p {
|
||||||
|
margin:0}
|
||||||
|
.dcf-calculator .df-muted {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:11px;
|
||||||
|
line-height:1.7}
|
||||||
|
.dcf-calculator .df-eyebrow {
|
||||||
|
letter-spacing:1.5px;
|
||||||
|
color:var(--df-accent);
|
||||||
|
font-size:10px;
|
||||||
|
font-weight:600}
|
||||||
|
.dcf-calculator .df-eyebrow span {
|
||||||
|
color:var(--df-muted);
|
||||||
|
letter-spacing:.5px;
|
||||||
|
font-weight:400}
|
||||||
|
.dcf-calculator .df-header {
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:center;
|
||||||
|
gap:16px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-subtitle {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:12px}
|
||||||
|
.dcf-calculator .df-header-mark {
|
||||||
|
color:var(--df-muted);
|
||||||
|
white-space:nowrap;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-header-actions {
|
||||||
|
display:flex;
|
||||||
|
align-items:center;
|
||||||
|
flex-shrink:0;
|
||||||
|
gap:12px}
|
||||||
|
.dcf-calculator .df-help-trigger {
|
||||||
|
display:grid;
|
||||||
|
place-items:center;
|
||||||
|
width:34px;
|
||||||
|
height:34px;
|
||||||
|
padding:0;
|
||||||
|
color:var(--df-muted);
|
||||||
|
border-radius:50%}
|
||||||
|
.dcf-calculator .df-help-trigger:hover {
|
||||||
|
color:var(--df-accent)}
|
||||||
|
.dcf-calculator .df-help-dialog {
|
||||||
|
width:min(860px,calc(100% - 32px));
|
||||||
|
max-width:none;
|
||||||
|
max-height:calc(100vh - 32px);
|
||||||
|
max-height:calc(100dvh - 32px);
|
||||||
|
margin:auto;
|
||||||
|
padding:0;
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
border-radius:12px;
|
||||||
|
background:var(--df-paper);
|
||||||
|
color:var(--df-ink);
|
||||||
|
box-shadow:0 18px 60px rgb(51 51 51 / 15%);
|
||||||
|
overflow:hidden}
|
||||||
|
.dcf-calculator .df-help-dialog[open] {
|
||||||
|
display:flex;
|
||||||
|
flex-direction:column}
|
||||||
|
.dcf-calculator .df-help-dialog::backdrop {
|
||||||
|
background:rgb(51 51 51 / 35%)}
|
||||||
|
.dcf-calculator .df-help-head {
|
||||||
|
display:flex;
|
||||||
|
align-items:center;
|
||||||
|
justify-content:space-between;
|
||||||
|
gap:16px;
|
||||||
|
padding:20px 24px 16px;
|
||||||
|
border-bottom:1px solid var(--df-line)}
|
||||||
|
.dcf-calculator .df-help-head h2 {
|
||||||
|
margin:0 0 4px;
|
||||||
|
font-size:20px;
|
||||||
|
letter-spacing:0}
|
||||||
|
.dcf-calculator .df-help-close {
|
||||||
|
flex-shrink:0;
|
||||||
|
width:32px;
|
||||||
|
height:32px;
|
||||||
|
padding:0;
|
||||||
|
font-size:22px;
|
||||||
|
line-height:1;
|
||||||
|
color:var(--df-muted)}
|
||||||
|
.dcf-calculator .df-help-nav {
|
||||||
|
display:flex;
|
||||||
|
flex-shrink:0;
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap:8px;
|
||||||
|
padding:12px 24px;
|
||||||
|
border-bottom:1px solid var(--df-line);
|
||||||
|
background:var(--df-field)}
|
||||||
|
.dcf-calculator .df-help-body {
|
||||||
|
min-height:0;
|
||||||
|
overflow-y:auto;
|
||||||
|
overscroll-behavior:contain;
|
||||||
|
padding:20px 24px 24px;
|
||||||
|
font-size:13px;
|
||||||
|
line-height:1.85}
|
||||||
|
.dcf-calculator .df-help-lead {
|
||||||
|
padding:14px 16px;
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-radius:7px}
|
||||||
|
.dcf-calculator .df-help-body section {
|
||||||
|
padding-top:24px;
|
||||||
|
outline-offset:-2px}
|
||||||
|
.dcf-calculator .df-help-body h3 {
|
||||||
|
margin-bottom:10px;
|
||||||
|
color:var(--df-accent);
|
||||||
|
font-size:15px}
|
||||||
|
.dcf-calculator .df-help-body section p+p {
|
||||||
|
margin-top:10px}
|
||||||
|
.dcf-calculator .df-help-formula {
|
||||||
|
margin:12px 0;
|
||||||
|
padding:12px 14px;
|
||||||
|
border-left:3px solid var(--df-accent-line);
|
||||||
|
background:var(--df-field);
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
overflow-wrap:anywhere}
|
||||||
|
.dcf-calculator .df-help-table {
|
||||||
|
margin:12px 0;
|
||||||
|
overflow-x:auto}
|
||||||
|
.dcf-calculator .df-help-table table {
|
||||||
|
font-size:12px;
|
||||||
|
white-space:normal}
|
||||||
|
.dcf-calculator .df-help-table :is(th,td) {
|
||||||
|
padding:10px;
|
||||||
|
text-align:left}
|
||||||
|
.dcf-calculator .df-help-source {
|
||||||
|
margin-top:24px;
|
||||||
|
padding-top:14px;
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
font-size:11px;
|
||||||
|
color:var(--df-muted)}
|
||||||
|
.dcf-calculator .df-help-source a {
|
||||||
|
color:var(--df-accent);
|
||||||
|
text-underline-offset:3px}
|
||||||
|
@media (width<=680px) {
|
||||||
|
.dcf-calculator .df-header-actions {gap:6px}
|
||||||
|
.dcf-calculator .df-help-head {padding:16px}
|
||||||
|
.dcf-calculator .df-help-nav {padding:12px 16px;gap:6px}
|
||||||
|
.dcf-calculator .df-help-body {padding:16px}
|
||||||
|
.dcf-calculator .df-help-table :is(th,td) {padding:8px 6px}
|
||||||
|
}
|
||||||
|
.dcf-calculator .df-live-dot {
|
||||||
|
background:var(--df-accent);
|
||||||
|
border-radius:50%;
|
||||||
|
width:6px;
|
||||||
|
height:6px;
|
||||||
|
margin-right:7px;
|
||||||
|
display:inline-block}
|
||||||
|
.dcf-calculator button {
|
||||||
|
font:inherit;
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-paper);
|
||||||
|
color:var(--df-accent);
|
||||||
|
cursor:pointer;
|
||||||
|
border-radius:7px;
|
||||||
|
padding:7px 11px;
|
||||||
|
font-size:11px;
|
||||||
|
transition:background .15s,border-color .15s}
|
||||||
|
.dcf-calculator button:hover {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-color:var(--df-accent-line)}
|
||||||
|
.dcf-calculator button:disabled {
|
||||||
|
opacity:.4;
|
||||||
|
cursor:default}
|
||||||
|
.dcf-calculator :is(input,select,button,summary):focus-visible {
|
||||||
|
outline-offset:3px;
|
||||||
|
outline:2px solid var(--df-accent)}
|
||||||
|
.dcf-calculator [data-section] {
|
||||||
|
scroll-margin-top:88px}
|
||||||
|
.dcf-calculator [data-section]:focus {
|
||||||
|
outline:none}
|
||||||
|
.dcf-calculator label {
|
||||||
|
color:var(--df-ink);
|
||||||
|
align-content:start;
|
||||||
|
gap:6px;
|
||||||
|
min-width:0;
|
||||||
|
font-size:11px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator input,.dcf-calculator select {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-field);
|
||||||
|
width:100%;
|
||||||
|
min-width:0;
|
||||||
|
height:39px;
|
||||||
|
color:var(--df-ink);
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
border-radius:6px;
|
||||||
|
padding:8px 10px;
|
||||||
|
font-family:inherit;
|
||||||
|
font-size:13px}
|
||||||
|
.dcf-calculator input:focus,.dcf-calculator select:focus {
|
||||||
|
border-color:var(--df-accent);
|
||||||
|
background:var(--df-paper)}
|
||||||
|
.dcf-calculator input::placeholder {
|
||||||
|
color:var(--muted);
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-profile-bar {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
align-items:center;
|
||||||
|
gap:8px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-company-buttons {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap:6px;
|
||||||
|
min-width:0;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-company-buttons button {
|
||||||
|
color:var(--df-muted);
|
||||||
|
overflow-wrap:anywhere;
|
||||||
|
max-width:100%;
|
||||||
|
padding:7px 13px}
|
||||||
|
.dcf-calculator .df-company-buttons button[aria-pressed=true] {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-color:var(--df-accent-line);
|
||||||
|
color:var(--df-accent);
|
||||||
|
font-weight:600}
|
||||||
|
.dcf-calculator [data-new-company] {
|
||||||
|
background:0 0;
|
||||||
|
border-style:dashed}
|
||||||
|
.dcf-calculator .df-save-status {
|
||||||
|
color:var(--df-muted);
|
||||||
|
margin-left:auto;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-new-company {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
align-items:end;
|
||||||
|
gap:10px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-new-company label {
|
||||||
|
flex:1;
|
||||||
|
min-width:160px}
|
||||||
|
.dcf-calculator .df-jumpnav {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap:24px;
|
||||||
|
padding-top:12px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-jumpnav button {
|
||||||
|
color:var(--df-muted);
|
||||||
|
background:0 0;
|
||||||
|
border:0;
|
||||||
|
padding:0;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-jumpnav button:first-child {
|
||||||
|
color:var(--df-accent);
|
||||||
|
font-weight:600}
|
||||||
|
.dcf-calculator .df-jumpnav button:hover {
|
||||||
|
color:var(--df-accent);
|
||||||
|
text-decoration:underline}
|
||||||
|
.dcf-calculator .df-overview {
|
||||||
|
grid-template-columns:minmax(240px,1.05fr) minmax(0,2.2fr);
|
||||||
|
align-items:stretch;
|
||||||
|
gap:14px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-output {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-hero {
|
||||||
|
color:var(--df-ink);
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-radius:11px;
|
||||||
|
height:100%;
|
||||||
|
padding:22px 24px}
|
||||||
|
.dcf-calculator .df-hero .df-muted {
|
||||||
|
color:var(--df-muted)}
|
||||||
|
.dcf-calculator .df-number {
|
||||||
|
letter-spacing:-1.8px;
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
overflow-wrap:anywhere;
|
||||||
|
margin:8px 0 3px;
|
||||||
|
font-size:45px;
|
||||||
|
font-weight:500;
|
||||||
|
line-height:1.25}
|
||||||
|
.dcf-calculator .df-value-note {
|
||||||
|
color:var(--df-muted);
|
||||||
|
border-top:1px solid var(--df-accent-line);
|
||||||
|
margin-top:16px;
|
||||||
|
padding-top:12px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-value-note b {
|
||||||
|
color:var(--df-accent);
|
||||||
|
letter-spacing:-.4px;
|
||||||
|
margin-left:7px;
|
||||||
|
font-size:19px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator [data-shares-note] {
|
||||||
|
margin-top:4px}
|
||||||
|
.dcf-calculator .df-top-comparison {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-paper);
|
||||||
|
border-radius:11px;
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
gap:0;
|
||||||
|
padding:22px 0;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-top-comparison>div {
|
||||||
|
min-width:0;
|
||||||
|
padding:0 18px}
|
||||||
|
.dcf-calculator .df-top-comparison>div+div {
|
||||||
|
border-left:1px solid var(--df-line)}
|
||||||
|
.dcf-calculator .df-top-comparison h3 {
|
||||||
|
color:var(--df-muted);
|
||||||
|
min-height:36px;
|
||||||
|
font-size:11px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-top-return-value,.dcf-calculator .df-market-price {
|
||||||
|
letter-spacing:-.8px;
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
overflow-wrap:anywhere;
|
||||||
|
font-size:29px;
|
||||||
|
font-weight:500;
|
||||||
|
line-height:1.4}
|
||||||
|
.dcf-calculator .df-top-return-value {
|
||||||
|
color:var(--df-accent);
|
||||||
|
margin:5px 0 8px}
|
||||||
|
.dcf-calculator .df-price-readout {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
align-items:baseline;
|
||||||
|
gap:5px;
|
||||||
|
margin:5px 0 8px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-zone-badge {
|
||||||
|
white-space:nowrap;
|
||||||
|
border-radius:4px;
|
||||||
|
padding:1px 5px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-zone-badge[data-zone=低估] {
|
||||||
|
background:var(--df-low);
|
||||||
|
color:var(--df-good)}
|
||||||
|
.dcf-calculator .df-zone-badge[data-zone=合理] {
|
||||||
|
background:var(--df-fair);
|
||||||
|
color:var(--df-fair-ink)}
|
||||||
|
.dcf-calculator .df-zone-badge[data-zone=高估] {
|
||||||
|
background:var(--df-high);
|
||||||
|
color:var(--df-high-ink)}
|
||||||
|
.dcf-calculator .df-decision {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border:1px solid var(--df-accent-line);
|
||||||
|
border-radius:9px;
|
||||||
|
align-items:center;
|
||||||
|
gap:20px;
|
||||||
|
padding:13px 17px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-decision>div {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
align-items:baseline;
|
||||||
|
gap:7px;
|
||||||
|
min-width:220px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-decision .df-eyebrow {
|
||||||
|
letter-spacing:0;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-decision strong {
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
font-size:23px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-decision p {
|
||||||
|
color:var(--df-muted);
|
||||||
|
flex:1;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-decision button {
|
||||||
|
white-space:nowrap;
|
||||||
|
background:0 0;
|
||||||
|
border:0}
|
||||||
|
.dcf-calculator .df-decision[data-ok=false] {
|
||||||
|
background:var(--df-warning-bg);
|
||||||
|
border-color:var(--df-line)}
|
||||||
|
.dcf-calculator .df-market {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-paper);
|
||||||
|
border-radius:11px;
|
||||||
|
padding:20px 22px}
|
||||||
|
.dcf-calculator .df-market-head {
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:center;
|
||||||
|
gap:18px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-market h3 {
|
||||||
|
margin:3px 0}
|
||||||
|
.dcf-calculator .df-price-fields {
|
||||||
|
grid-template-columns:150px 150px;
|
||||||
|
gap:10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-price-chart {
|
||||||
|
width:100%;
|
||||||
|
min-width:0;
|
||||||
|
height:180px;
|
||||||
|
overflow:hidden}
|
||||||
|
.dcf-calculator .df-zone-keys {
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
gap:12px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-zone-key {
|
||||||
|
background:var(--df-field);
|
||||||
|
border-radius:5px;
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:center;
|
||||||
|
gap:8px;
|
||||||
|
padding:8px 12px;
|
||||||
|
font-size:10px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-zone-key:nth-child(2) {
|
||||||
|
background:var(--df-field)}
|
||||||
|
.dcf-calculator .df-zone-key:nth-child(3) {
|
||||||
|
background:var(--df-field)}
|
||||||
|
.dcf-calculator .df-zone-key strong {
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
font-size:11px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-zone-dot {
|
||||||
|
background:var(--df-good);
|
||||||
|
border-radius:50%;
|
||||||
|
width:5px;
|
||||||
|
height:5px;
|
||||||
|
margin-right:6px;
|
||||||
|
display:inline-block}
|
||||||
|
.dcf-calculator .df-zone-key:nth-child(2) .df-zone-dot {
|
||||||
|
background:var(--df-fair-ink)}
|
||||||
|
.dcf-calculator .df-zone-key:nth-child(3) .df-zone-dot {
|
||||||
|
background:var(--df-high-ink)}
|
||||||
|
.dcf-calculator .df-interval-rule {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:start;
|
||||||
|
gap:16px;
|
||||||
|
margin-top:14px;
|
||||||
|
padding-top:12px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-interval-rule>span {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-interval-rule details {
|
||||||
|
border:0;
|
||||||
|
min-width:90px;
|
||||||
|
padding:0}
|
||||||
|
.dcf-calculator .df-interval-fields {
|
||||||
|
max-width:320px;
|
||||||
|
margin-top:12px}
|
||||||
|
.dcf-calculator .df-market-message {
|
||||||
|
margin-top:12px}
|
||||||
|
.dcf-calculator .df-layout {
|
||||||
|
grid-template-columns:minmax(0,1fr) minmax(0,1.25fr);
|
||||||
|
align-items:start;
|
||||||
|
gap:20px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-form,.dcf-calculator .df-analysis {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-paper);
|
||||||
|
border-radius:11px;
|
||||||
|
min-width:0;
|
||||||
|
padding:20px}
|
||||||
|
.dcf-calculator .df-form {
|
||||||
|
gap:22px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-form>section+section,.dcf-calculator .df-results {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
padding-top:20px}
|
||||||
|
.dcf-calculator .df-column-heading {
|
||||||
|
align-items:center;
|
||||||
|
gap:10px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-column-heading>span {
|
||||||
|
width:29px;
|
||||||
|
height:29px;
|
||||||
|
color:var(--df-accent);
|
||||||
|
border:1px solid var(--df-accent-line);
|
||||||
|
border-radius:50%;
|
||||||
|
place-items:center;
|
||||||
|
font-size:10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-column-heading p {
|
||||||
|
color:var(--df-muted);
|
||||||
|
margin-top:2px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-column-heading>b {
|
||||||
|
letter-spacing:1px;
|
||||||
|
color:var(--df-muted);
|
||||||
|
margin-left:auto;
|
||||||
|
font-size:10px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-section-head {
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:center;
|
||||||
|
gap:10px;
|
||||||
|
margin-bottom:12px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-section-head h3 {
|
||||||
|
font-size:12px}
|
||||||
|
.dcf-calculator .df-fields {
|
||||||
|
grid-template-columns:repeat(2,minmax(0,1fr));
|
||||||
|
gap:12px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-share-field small {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-stages {
|
||||||
|
gap:8px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-stage-row {
|
||||||
|
background:var(--df-field);
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
border-radius:7px;
|
||||||
|
grid-template-columns:minmax(55px,1fr) 65px minmax(70px,1fr) 22px;
|
||||||
|
align-items:center;
|
||||||
|
gap:8px;
|
||||||
|
padding:10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-stage-row input {
|
||||||
|
background:var(--df-paper);
|
||||||
|
height:34px;
|
||||||
|
padding:6px}
|
||||||
|
.dcf-calculator .df-stage-row button {
|
||||||
|
color:var(--df-muted);
|
||||||
|
background:0 0;
|
||||||
|
border:0;
|
||||||
|
padding:2px;
|
||||||
|
font-size:17px}
|
||||||
|
.dcf-calculator .df-stage-name {
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-stage-name small {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:9px;
|
||||||
|
display:block}
|
||||||
|
.dcf-calculator .df-stage-key {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-total {
|
||||||
|
margin-top:8px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-result-line {
|
||||||
|
justify-content:space-between;
|
||||||
|
align-items:baseline;
|
||||||
|
gap:10px;
|
||||||
|
padding:8px 0;
|
||||||
|
font-size:11px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-result-line span {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-result-line b {
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
white-space:nowrap;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-result-line.df-sum {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
margin-top:4px;
|
||||||
|
padding-top:10px}
|
||||||
|
.dcf-calculator .df-composition {
|
||||||
|
background:var(--df-line);
|
||||||
|
border-radius:3px;
|
||||||
|
gap:2px;
|
||||||
|
height:6px;
|
||||||
|
margin:15px 0 8px;
|
||||||
|
display:flex;
|
||||||
|
overflow:hidden}
|
||||||
|
.dcf-calculator .df-segment-a {
|
||||||
|
background:var(--df-accent)}
|
||||||
|
.dcf-calculator .df-segment-b {
|
||||||
|
background:var(--df-chart-secondary)}
|
||||||
|
.dcf-calculator .df-legend {
|
||||||
|
color:var(--df-muted);
|
||||||
|
justify-content:space-between;
|
||||||
|
margin-bottom:4px;
|
||||||
|
font-size:10px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-crosscheck {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-cross-shared {
|
||||||
|
background:var(--df-field);
|
||||||
|
border-radius:5px;
|
||||||
|
margin:16px 0;
|
||||||
|
padding:8px 10px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator details {
|
||||||
|
border:0;
|
||||||
|
padding:0}
|
||||||
|
.dcf-calculator summary {
|
||||||
|
color:var(--df-accent);
|
||||||
|
cursor:pointer;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-cross-inputs>summary {
|
||||||
|
margin-bottom:13px}
|
||||||
|
.dcf-calculator .df-cross-inputs>summary span {
|
||||||
|
margin-left:6px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-cross-grid {
|
||||||
|
grid-template-columns:minmax(0,1fr) minmax(0,1fr);
|
||||||
|
align-items:start;
|
||||||
|
gap:16px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-grid>* {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-cross-bridge {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-radius:6px;
|
||||||
|
gap:10px;
|
||||||
|
margin-top:12px;
|
||||||
|
padding:12px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-derived {
|
||||||
|
gap:6px;
|
||||||
|
font-size:11px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-derived b {
|
||||||
|
font-size:18px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-cross-profit,.dcf-calculator .df-cross-growth {
|
||||||
|
margin-top:12px}
|
||||||
|
.dcf-calculator .df-cross-source-note {
|
||||||
|
margin-top:7px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-cross-pe {
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
gap:6px;
|
||||||
|
margin-top:12px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-pe label {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-cross-pe input {
|
||||||
|
padding:8px}
|
||||||
|
.dcf-calculator .df-cross-pe label:nth-child(2) input {
|
||||||
|
background:var(--df-field);
|
||||||
|
border-color:var(--df-accent-line)}
|
||||||
|
.dcf-calculator .df-cross-pe-note {
|
||||||
|
margin-top:10px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-cross-advanced {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
margin-top:16px;
|
||||||
|
padding-top:13px}
|
||||||
|
.dcf-calculator .df-cross-advanced .df-fields {
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
margin-top:12px}
|
||||||
|
.dcf-calculator .df-cross-results {
|
||||||
|
gap:22px;
|
||||||
|
margin-top:22px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-results>* {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-cross-joint {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border:1px solid var(--df-accent-line);
|
||||||
|
border-radius:8px;
|
||||||
|
padding:16px}
|
||||||
|
.dcf-calculator .df-cross-joint-grid {
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
gap:10px;
|
||||||
|
margin-bottom:10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-joint-grid>div {
|
||||||
|
gap:5px;
|
||||||
|
font-size:10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-joint-grid b {
|
||||||
|
letter-spacing:-.5px;
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
overflow-wrap:anywhere;
|
||||||
|
font-size:21px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-cross-joint-grid>div:last-child {
|
||||||
|
color:var(--df-accent);
|
||||||
|
border-left:1px solid var(--df-accent-line);
|
||||||
|
padding-left:10px}
|
||||||
|
.dcf-calculator .df-cross-joint .df-muted {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-scenario-grid {
|
||||||
|
grid-template-columns:repeat(3,minmax(0,1fr));
|
||||||
|
gap:8px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-scenario-card {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-field);
|
||||||
|
border-radius:7px;
|
||||||
|
gap:8px;
|
||||||
|
min-width:0;
|
||||||
|
padding:12px 10px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-scenario-card[data-base=true] {
|
||||||
|
background:var(--df-soft);
|
||||||
|
border-color:var(--df-accent-line)}
|
||||||
|
.dcf-calculator .df-scenario-card>span:first-child {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-scenario-card strong {
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
letter-spacing:-.8px;
|
||||||
|
overflow-wrap:anywhere;
|
||||||
|
font-size:24px;
|
||||||
|
font-weight:500}
|
||||||
|
.dcf-calculator .df-scenario-card small {
|
||||||
|
color:var(--df-muted);
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-scenario-status {
|
||||||
|
color:var(--df-high-ink);
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-scenario-card[data-ok=true] .df-scenario-status {
|
||||||
|
color:var(--df-good)}
|
||||||
|
.dcf-calculator .df-cross-sensitivity .df-section-head {
|
||||||
|
margin-bottom:0}
|
||||||
|
.dcf-calculator .df-cross-sensitivity th:nth-child(3),.dcf-calculator .df-cross-sensitivity td:nth-child(3) {
|
||||||
|
background:var(--df-field)}
|
||||||
|
.dcf-calculator .df-cross-prices {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
padding-top:16px}
|
||||||
|
.dcf-calculator .df-cross-prices>.df-section-head {
|
||||||
|
margin-top:16px}
|
||||||
|
.dcf-calculator .df-cross-checks {
|
||||||
|
grid-template-columns:repeat(2,minmax(0,1fr));
|
||||||
|
gap:10px;
|
||||||
|
margin-top:16px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-cross-checks>div {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
border-radius:6px;
|
||||||
|
padding:12px;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-cross-checks strong {
|
||||||
|
margin-top:5px;
|
||||||
|
font-size:11px;
|
||||||
|
display:block}
|
||||||
|
.dcf-calculator .df-cross-checks p {
|
||||||
|
margin-top:5px}
|
||||||
|
.dcf-calculator .df-cross-verdict {
|
||||||
|
color:var(--df-fair-ink);
|
||||||
|
background:var(--df-warning-bg);
|
||||||
|
border-radius:6px;
|
||||||
|
margin-top:12px;
|
||||||
|
padding:12px;
|
||||||
|
font-size:11px}
|
||||||
|
.dcf-calculator .df-cross-table-note {
|
||||||
|
margin-top:10px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-cross-tag {
|
||||||
|
color:var(--df-fair-ink);
|
||||||
|
background:var(--df-fair);
|
||||||
|
border-radius:4px;
|
||||||
|
padding:2px 6px;
|
||||||
|
font-size:10px;
|
||||||
|
display:inline-block}
|
||||||
|
.dcf-calculator .df-cross-tag[data-ok=true] {
|
||||||
|
background:var(--df-low);
|
||||||
|
color:var(--df-good)}
|
||||||
|
.dcf-calculator .df-table-wrap {
|
||||||
|
max-width:100%;
|
||||||
|
margin-top:12px;
|
||||||
|
overflow-x:auto}
|
||||||
|
.dcf-calculator table {
|
||||||
|
border-collapse:collapse;
|
||||||
|
white-space:nowrap;
|
||||||
|
font-variant-numeric:tabular-nums;
|
||||||
|
width:100%;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator th,.dcf-calculator td {
|
||||||
|
text-align:right;
|
||||||
|
border-bottom:1px solid var(--df-line);
|
||||||
|
padding:10px 8px}
|
||||||
|
.dcf-calculator th {
|
||||||
|
color:var(--df-muted);
|
||||||
|
background:var(--df-field);
|
||||||
|
font-weight:400}
|
||||||
|
.dcf-calculator th:first-child,.dcf-calculator td:first-child {
|
||||||
|
text-align:left}
|
||||||
|
.dcf-calculator .df-table-section {
|
||||||
|
border:1px solid var(--df-line);
|
||||||
|
background:var(--df-paper);
|
||||||
|
border-radius:9px;
|
||||||
|
padding:17px 20px}
|
||||||
|
.dcf-calculator .df-foot {
|
||||||
|
color:var(--df-muted);
|
||||||
|
flex-wrap:wrap;
|
||||||
|
justify-content:space-between;
|
||||||
|
gap:8px;
|
||||||
|
font-size:10px;
|
||||||
|
display:flex}
|
||||||
|
.dcf-calculator .df-note {
|
||||||
|
border-top:1px solid var(--df-line);
|
||||||
|
padding-top:14px;
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-error {
|
||||||
|
color:var(--df-error);
|
||||||
|
background:var(--df-error-bg);
|
||||||
|
border:1px solid var(--df-high);
|
||||||
|
border-radius:7px;
|
||||||
|
padding:12px 14px;
|
||||||
|
font-size:12px}
|
||||||
|
.dcf-calculator .df-warning {
|
||||||
|
color:var(--df-fair-ink);
|
||||||
|
background:var(--df-warning-bg);
|
||||||
|
border-radius:7px;
|
||||||
|
padding:12px 14px;
|
||||||
|
font-size:12px}
|
||||||
|
@media (width>=1500px) {
|
||||||
|
.tools-layout .content:has(.dcf-calculator) {
|
||||||
|
max-width:1280px}
|
||||||
|
}
|
||||||
|
@media (width<=1200px) {
|
||||||
|
.dcf-calculator {
|
||||||
|
padding:22px}
|
||||||
|
.dcf-calculator .df-overview {
|
||||||
|
grid-template-columns:1fr}
|
||||||
|
.dcf-calculator .df-hero {
|
||||||
|
grid-template-columns:1fr 1fr;
|
||||||
|
column-gap:20px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-hero>.df-muted:first-child {
|
||||||
|
grid-column:1}
|
||||||
|
.dcf-calculator .df-number {
|
||||||
|
grid-area:2/1}
|
||||||
|
.dcf-calculator .df-hero>.df-muted:nth-child(3) {
|
||||||
|
grid-column:1}
|
||||||
|
.dcf-calculator .df-value-note {
|
||||||
|
border-top:0;
|
||||||
|
border-left:1px solid var(--df-accent-line);
|
||||||
|
grid-area:1/2/4;
|
||||||
|
align-self:center;
|
||||||
|
margin:0;
|
||||||
|
padding:10px 0 10px 24px}
|
||||||
|
.dcf-calculator .df-top-comparison h3 {
|
||||||
|
min-height:0}
|
||||||
|
.dcf-calculator .df-layout {
|
||||||
|
grid-template-columns:1fr}
|
||||||
|
.dcf-calculator .df-cross-grid {
|
||||||
|
gap:24px}
|
||||||
|
.dcf-calculator .df-top-comparison {
|
||||||
|
padding:18px 0}
|
||||||
|
}
|
||||||
|
@media (width<=680px) {
|
||||||
|
.dcf-calculator {
|
||||||
|
border-radius:10px;
|
||||||
|
gap:16px;
|
||||||
|
padding:16px}
|
||||||
|
.dcf-calculator .df-header-mark {
|
||||||
|
display:none}
|
||||||
|
.dcf-calculator h2 {
|
||||||
|
font-size:24px}
|
||||||
|
.dcf-calculator .df-save-status {
|
||||||
|
width:100%;
|
||||||
|
margin-left:0}
|
||||||
|
.dcf-calculator .df-jumpnav {
|
||||||
|
gap:15px}
|
||||||
|
.dcf-calculator .df-jumpnav button {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-decision {
|
||||||
|
flex-wrap:wrap;
|
||||||
|
gap:8px}
|
||||||
|
.dcf-calculator .df-decision>div {
|
||||||
|
min-width:0}
|
||||||
|
.dcf-calculator .df-decision p {
|
||||||
|
flex:100%;
|
||||||
|
order:3}
|
||||||
|
.dcf-calculator .df-decision button {
|
||||||
|
margin-left:auto}
|
||||||
|
.dcf-calculator .df-market-head {
|
||||||
|
flex-wrap:wrap}
|
||||||
|
.dcf-calculator .df-price-fields {
|
||||||
|
grid-template-columns:repeat(2,minmax(0,1fr));
|
||||||
|
width:100%}
|
||||||
|
.dcf-calculator .df-market {
|
||||||
|
padding:16px}
|
||||||
|
.dcf-calculator .df-zone-key {
|
||||||
|
gap:3px;
|
||||||
|
padding:8px;
|
||||||
|
display:grid}
|
||||||
|
.dcf-calculator .df-zone-key strong {
|
||||||
|
font-size:10px}
|
||||||
|
.dcf-calculator .df-interval-rule {
|
||||||
|
flex-wrap:wrap}
|
||||||
|
.dcf-calculator .df-form,.dcf-calculator .df-analysis {
|
||||||
|
padding:16px}
|
||||||
|
.dcf-calculator .df-top-comparison>div {
|
||||||
|
padding:0 12px}
|
||||||
|
.dcf-calculator .df-top-return-value,.dcf-calculator .df-market-price {
|
||||||
|
font-size:26px}
|
||||||
|
}
|
||||||
|
@media (width<=460px) {
|
||||||
|
.dcf-calculator .df-hero {
|
||||||
|
padding:20px;
|
||||||
|
display:block}
|
||||||
|
.dcf-calculator .df-value-note {
|
||||||
|
border-top:1px solid var(--df-accent-line);
|
||||||
|
border-left:0;
|
||||||
|
margin-top:16px;
|
||||||
|
padding:12px 0 0}
|
||||||
|
.dcf-calculator .df-top-comparison {
|
||||||
|
grid-template-columns:repeat(2,minmax(0,1fr));
|
||||||
|
gap:16px;
|
||||||
|
padding:16px 0}
|
||||||
|
.dcf-calculator .df-top-comparison>div:first-child {
|
||||||
|
border-bottom:1px solid var(--df-line);
|
||||||
|
grid-column:1/-1;
|
||||||
|
padding-bottom:12px}
|
||||||
|
.dcf-calculator .df-top-comparison>div:nth-child(2) {
|
||||||
|
border-left:0}
|
||||||
|
.dcf-calculator .df-cross-grid {
|
||||||
|
grid-template-columns:1fr;
|
||||||
|
gap:16px}
|
||||||
|
.dcf-calculator .df-cross-pe {
|
||||||
|
gap:10px}
|
||||||
|
.dcf-calculator .df-cross-checks,.dcf-calculator .df-cross-advanced .df-fields {
|
||||||
|
grid-template-columns:1fr}
|
||||||
|
.dcf-calculator .df-stage-row {
|
||||||
|
grid-template-columns:minmax(48px,1fr) 52px minmax(65px,1fr) 20px;
|
||||||
|
gap:6px;
|
||||||
|
padding:8px}
|
||||||
|
.dcf-calculator input,.dcf-calculator select {
|
||||||
|
font-size:16px}
|
||||||
|
.dcf-calculator .df-scenario-grid {
|
||||||
|
gap:6px}
|
||||||
|
.dcf-calculator .df-scenario-card {
|
||||||
|
padding:10px 8px}
|
||||||
|
.dcf-calculator .df-scenario-card strong {
|
||||||
|
font-size:21px}
|
||||||
|
.dcf-calculator .df-cross-joint-grid {
|
||||||
|
gap:8px}
|
||||||
|
.dcf-calculator .df-cross-joint-grid b {
|
||||||
|
font-size:19px}
|
||||||
|
.dcf-calculator .df-cross-inputs>summary span {
|
||||||
|
margin-left:14px;
|
||||||
|
display:block}
|
||||||
|
}
|
||||||
|
@media (prefers-reduced-motion:reduce) {
|
||||||
|
.dcf-calculator * {
|
||||||
|
transition:none!important}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Annual cash-flow chart remains visible below the collapsible detail table. */
|
||||||
|
.dcf-calculator .df-cashflow-section {padding:20px;background:var(--df-paper);border:1px solid var(--df-line);border-radius:11px;min-width:0;}
|
||||||
|
.dcf-calculator .df-cashflow-section .df-section-head {align-items:start;flex-wrap:wrap;}
|
||||||
|
.dcf-calculator .df-cashflow-section h3 {margin-bottom:4px;}
|
||||||
|
.dcf-calculator .df-cashflow-chart {height:320px;width:100%;min-width:0;}
|
||||||
|
@media(max-width:560px){.dcf-calculator .df-cashflow-section{padding:16px;}.dcf-calculator .df-cashflow-chart{height:280px;}}
|
||||||
|
|
||||||
|
/* Deletion appears only after dwelling on a company for three seconds. */
|
||||||
|
.dcf-calculator .df-company-buttons {gap:10px;}
|
||||||
|
.dcf-calculator .df-company-chip {position:relative;display:inline-flex;min-width:0;max-width:100%;}
|
||||||
|
.dcf-calculator .df-company-buttons .df-company-delete {position:absolute;top:-7px;right:-7px;display:grid;place-items:center;width:20px;height:20px;padding:0;border:1px solid var(--df-accent-line);border-radius:50%;background:var(--df-paper);color:var(--df-muted);font-size:16px;line-height:1;z-index:1;opacity:0;visibility:hidden;transition:opacity .15s,visibility 0s;}
|
||||||
|
.dcf-calculator .df-company-chip:is(:hover,:focus-within) .df-company-delete {opacity:1;visibility:visible;transition:opacity .15s 3s,visibility 0s 3s;}
|
||||||
|
.dcf-calculator .df-company-buttons .df-company-delete:hover {color:var(--df-error);border-color:var(--df-error);background:var(--df-error-bg);}
|
||||||
|
.dcf-calculator .df-company-empty {padding:28px 20px;border:1px dashed var(--df-line);border-radius:10px;color:var(--df-muted);text-align:center;}
|
||||||
|
.dcf-calculator[data-empty="true"] :is(.df-jumpnav,.df-overview,.df-decision,.df-market,.df-layout,.df-table-section,.df-cashflow-section,.df-foot,.df-note,.df-error,.df-warning) {display:none!important;}
|
||||||
|
@media(hover:none){.dcf-calculator .df-company-buttons .df-company-delete{opacity:1;visibility:visible;transition:none;}}
|
||||||
|
@media(prefers-reduced-motion:reduce) and (hover:hover){.dcf-calculator .df-company-chip:is(:hover,:focus-within) .df-company-delete{transition:visibility 0s 3s!important;}}
|
||||||
+400
-34
@@ -24,27 +24,14 @@ button {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-header {
|
|
||||||
min-height: 76px;
|
|
||||||
padding: 16px 28px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 24px;
|
|
||||||
background: var(--surface);
|
|
||||||
border-bottom: 1px solid var(--line);
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-brand h1,
|
|
||||||
.app-brand p,
|
|
||||||
.card-title,
|
.card-title,
|
||||||
.sidebar-title { margin: 0; }
|
.sidebar-title { margin: 0; }
|
||||||
|
|
||||||
.app-brand h1 { font-size: 21px; font-weight: 600; }
|
|
||||||
.app-brand p { margin-top: 4px; color: var(--muted); font-size: 13px; }
|
|
||||||
|
|
||||||
.reload-button,
|
.reload-button,
|
||||||
.export-button {
|
.export-button,
|
||||||
|
.cart-button,
|
||||||
|
.cart-export-button,
|
||||||
|
.primary-button {
|
||||||
padding: 7px 13px;
|
padding: 7px 13px;
|
||||||
border: 1px solid var(--line);
|
border: 1px solid var(--line);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
@@ -53,13 +40,223 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.reload-button {
|
.reload-button {
|
||||||
|
position: fixed;
|
||||||
|
top: 16px;
|
||||||
|
right: 18px;
|
||||||
|
z-index: 10;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
padding: 0;
|
||||||
|
display: grid;
|
||||||
|
place-items: center;
|
||||||
|
color: #fff;
|
||||||
|
background: var(--accent);
|
||||||
|
border-color: var(--accent);
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 图标继承按钮的 color(currentColor),尺寸只在这里定义,换图标不用动 JS。
|
||||||
|
20px 是配 36px 圆钮的光学最优值:新图标的弧线比原 ↻ 字形细,19px 会显轻。 */
|
||||||
|
.reload-button .reload-icon {
|
||||||
|
display: block;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
fill: currentColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 悬停转一圈:刷新语义的标准反馈,比原先 ↻ 字形的 -45° 倾斜更贴合新图标 */
|
||||||
|
.reload-button:hover { opacity: .88; }
|
||||||
|
.reload-button:hover .reload-icon { animation: reload-spin .6s ease-in-out; }
|
||||||
|
|
||||||
|
@keyframes reload-spin {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.reload-button:hover .reload-icon { animation: none; }
|
||||||
|
}
|
||||||
|
.export-button:hover { color: var(--accent); border-color: var(--accent); }
|
||||||
|
|
||||||
|
/* ── 合并队列(购物车)────────────────────────────── */
|
||||||
|
|
||||||
|
.cart-button { font-size: 12px; }
|
||||||
|
.cart-button:hover { color: var(--accent); border-color: var(--accent); }
|
||||||
|
.cart-button[data-in-cart="true"] {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
border-color: var(--accent);
|
border-color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.reload-button:hover { opacity: .88; }
|
.cart-bar[hidden] { display: none; }
|
||||||
.export-button:hover { color: var(--accent); border-color: var(--accent); }
|
|
||||||
|
.cart-bar {
|
||||||
|
position: fixed;
|
||||||
|
left: 50%;
|
||||||
|
bottom: 18px;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
z-index: 20;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
max-width: min(1160px, calc(100vw - 32px));
|
||||||
|
padding: 9px 12px;
|
||||||
|
background: rgba(255, 255, 255, .97);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 6px 24px rgba(0, 0, 0, .12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-label {
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-chips {
|
||||||
|
display: flex;
|
||||||
|
gap: 6px;
|
||||||
|
max-width: 44vw;
|
||||||
|
overflow-x: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
|
}
|
||||||
|
.cart-chips::-webkit-scrollbar { display: none; }
|
||||||
|
|
||||||
|
.cart-chip {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
gap: 2px;
|
||||||
|
padding: 3px 4px 3px 10px;
|
||||||
|
background: var(--accent-soft);
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-chip-name {
|
||||||
|
max-width: 150px;
|
||||||
|
overflow: hidden;
|
||||||
|
color: var(--ink);
|
||||||
|
font-size: 12px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-chip-button {
|
||||||
|
padding: 2px 4px;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
.cart-chip-button:hover:not(:disabled) { color: var(--accent); }
|
||||||
|
.cart-chip-button:disabled { opacity: .3; cursor: default; }
|
||||||
|
|
||||||
|
.cart-divider { width: 1px; height: 22px; background: var(--line); }
|
||||||
|
|
||||||
|
.cart-modes {
|
||||||
|
display: flex;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
padding: 2px;
|
||||||
|
background: #f4f2ee;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-mode-button {
|
||||||
|
padding: 4px 8px;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 5px;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.cart-mode-button[data-active="true"] {
|
||||||
|
color: var(--accent);
|
||||||
|
background: var(--surface);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-export-button { color: #fff; background: var(--accent); border-color: var(--accent); white-space: nowrap; }
|
||||||
|
.cart-export-button:hover { opacity: .9; }
|
||||||
|
.cart-clear-button { padding: 7px 8px; border: 0; background: transparent; color: var(--muted); font-size: 12px; white-space: nowrap; }
|
||||||
|
.cart-clear-button:hover { color: #a63f32; }
|
||||||
|
|
||||||
|
/* ── 合并预览弹窗 ────────────────────────────────── */
|
||||||
|
|
||||||
|
.modal-overlay {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
z-index: 30;
|
||||||
|
display: grid;
|
||||||
|
place-items: center;
|
||||||
|
padding: 24px;
|
||||||
|
background: rgba(51, 51, 51, .45);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
max-width: min(860px, 100%);
|
||||||
|
max-height: calc(100vh - 48px);
|
||||||
|
background: var(--surface);
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-head {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title { margin: 0; font-size: 14px; }
|
||||||
|
.modal-notice { color: #a67c2b; font-size: 12px; }
|
||||||
|
|
||||||
|
.modal-close {
|
||||||
|
margin-left: auto;
|
||||||
|
padding: 2px 8px;
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.modal-close:hover { color: var(--ink); }
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
display: grid;
|
||||||
|
gap: 20px;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-item {
|
||||||
|
display: grid;
|
||||||
|
gap: 10px;
|
||||||
|
justify-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-canvas {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-foot {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-top: 1px solid var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
.primary-button { color: #fff; background: var(--accent); border-color: var(--accent); }
|
||||||
|
.primary-button:hover { opacity: .9; }
|
||||||
|
|
||||||
.app-layout {
|
.app-layout {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -67,7 +264,7 @@ button {
|
|||||||
gap: 24px;
|
gap: 24px;
|
||||||
max-width: 1600px;
|
max-width: 1600px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 28px 24px 64px;
|
padding: 20px 24px 64px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar {
|
.sidebar {
|
||||||
@@ -126,27 +323,109 @@ button {
|
|||||||
|
|
||||||
.content { min-width: 0; }
|
.content { min-width: 0; }
|
||||||
|
|
||||||
|
/* ── 页头:tab 栏 + 参数行 ─────────────────────────
|
||||||
|
sticky 只挂在容器上,里面两行一起钉住。底色比过去(.6)更实、并加一层模糊:
|
||||||
|
现在压在卡片上方的是两行内容,透过去的字会干扰读数。 */
|
||||||
|
.tab-header {
|
||||||
|
position: sticky;
|
||||||
|
top: 20px;
|
||||||
|
z-index: 5;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
padding: 5px;
|
||||||
|
background: rgba(255, 255, 255, .82);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 9px;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
.tabs {
|
.tabs {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
margin-bottom: 18px;
|
|
||||||
padding: 5px;
|
|
||||||
background: rgba(255, 255, 255, .6);
|
|
||||||
border: 1px solid var(--line);
|
|
||||||
border-radius: 9px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-button { padding: 7px 11px; }
|
.tab-button { padding: 7px 11px; }
|
||||||
|
|
||||||
|
/* ── tab 级参数控件(现价) ─────────────────────────
|
||||||
|
独立一行,贴在 tab 栏下沿;一条虚线分隔说明「这不是导航,是改口径的输入」。
|
||||||
|
没有参数的 tab 会被 JS 置 hidden,此时整行(含分隔线)不占位。 */
|
||||||
|
|
||||||
|
.tab-controls {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
margin-top: 5px;
|
||||||
|
padding: 6px 3px 1px;
|
||||||
|
border-top: 1px dashed var(--line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hidden 属性会被上面的 display:flex 盖掉,显式收回来 */
|
||||||
|
.tab-controls[hidden] { display: none; }
|
||||||
|
|
||||||
|
.param-field {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
gap: 5px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
background: #f4f2ee;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: border-color .15s, background .15s;
|
||||||
|
}
|
||||||
|
.param-field:hover { border-color: var(--line); }
|
||||||
|
.param-field:focus-within { background: var(--surface); border-color: var(--accent); }
|
||||||
|
|
||||||
|
.param-label { color: var(--muted); font-size: 12px; white-space: nowrap; }
|
||||||
|
|
||||||
|
/* 输入框只留一条下划线:数字是这里的主角,不要给它加边框抢视线 */
|
||||||
|
.param-input {
|
||||||
|
width: 94px;
|
||||||
|
padding: 1px 2px;
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 1px solid var(--line);
|
||||||
|
background: transparent;
|
||||||
|
color: var(--ink);
|
||||||
|
font: inherit;
|
||||||
|
font-size: 13px;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.param-input:focus { outline: none; border-bottom-color: var(--accent); }
|
||||||
|
.param-input[data-invalid="true"] { color: #a63f32; border-bottom-color: #a63f32; }
|
||||||
|
/* 上下箭头在 Chrome 里只在悬停/聚焦时出现,保留(步进 1 元比手敲快) */
|
||||||
|
.param-input::-webkit-inner-spin-button { opacity: .45; }
|
||||||
|
|
||||||
|
.param-unit { color: var(--muted); font-size: 12px; }
|
||||||
|
|
||||||
|
/* 合法区间常驻:输入越界时它变红,不用猜上下限 */
|
||||||
|
.param-range { color: var(--muted); font-size: 11px; white-space: nowrap; }
|
||||||
|
.param-input[data-invalid="true"] ~ .param-range { color: #a63f32; }
|
||||||
|
|
||||||
|
.param-reset {
|
||||||
|
padding: 5px 8px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 12px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.param-reset:hover:not(:disabled) { color: var(--accent); border-color: var(--line); }
|
||||||
|
.param-reset:disabled { opacity: .35; cursor: default; }
|
||||||
|
|
||||||
.cards { display: grid; gap: 28px; }
|
.cards { display: grid; gap: 28px; }
|
||||||
|
|
||||||
|
/* scroll-margin-top = 页头底边(sticky top 20 + 页头实测高 89)+ 18px 呼吸:
|
||||||
|
页头是 tab 栏 + 参数行两行,比过去的单行 tab 栏高约 43px,锚点跳转时标题才不会被盖住。
|
||||||
|
页头高度会随 tab 换行浮动,这里按单行 tab 的最常见形态取值。 */
|
||||||
.card {
|
.card {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: var(--surface);
|
background: var(--surface);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 0 1px 3px rgba(0, 0, 0, .06);
|
box-shadow: 0 1px 3px rgba(0, 0, 0, .06);
|
||||||
scroll-margin-top: 20px;
|
scroll-margin-top: 128px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-bar {
|
.card-bar {
|
||||||
@@ -201,19 +480,106 @@ button {
|
|||||||
.chart-sidebar { display: none; }
|
.chart-sidebar { display: none; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 880px) {
|
||||||
.app-header { padding: 14px 16px; }
|
.app-layout { display: block; padding: 0 12px 40px; }
|
||||||
.app-brand p { display: none; }
|
.sidebar { margin-bottom: 12px; }
|
||||||
.app-layout { display: block; padding: 16px 12px 40px; }
|
.company-sidebar {
|
||||||
.sidebar { position: static; margin-bottom: 12px; }
|
position: sticky;
|
||||||
.company-sidebar { padding: 7px; }
|
top: 0;
|
||||||
|
z-index: 7;
|
||||||
|
margin: 0 -12px;
|
||||||
|
padding: 7px 12px;
|
||||||
|
border-width: 0 0 1px;
|
||||||
|
border-radius: 0;
|
||||||
|
background: rgba(245, 244, 241, .96);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
.company-sidebar .sidebar-title { display: none; }
|
.company-sidebar .sidebar-title { display: none; }
|
||||||
.company-list { display: flex; overflow-x: auto; }
|
.company-list { display: flex; overflow-x: auto; }
|
||||||
|
/* 隐藏横向滚动条(与 .tabs 同处理):classic 滚动条会占掉 15px 高度,
|
||||||
|
把贴在公司栏下方的页头压住 —— 而页头的 sticky top 是写死的 50px。 */
|
||||||
|
.company-list { scrollbar-width: none; }
|
||||||
|
.company-list::-webkit-scrollbar { display: none; }
|
||||||
.company-button { flex: 0 0 auto; width: auto; }
|
.company-button { flex: 0 0 auto; width: auto; }
|
||||||
.tabs { overflow-x: auto; flex-wrap: nowrap; }
|
.tab-header {
|
||||||
|
top: 50px;
|
||||||
|
z-index: 6;
|
||||||
|
margin: 0 -12px 18px;
|
||||||
|
padding: 5px 12px 7px;
|
||||||
|
border-width: 0 0 1px;
|
||||||
|
border-radius: 0;
|
||||||
|
background: rgba(245, 244, 241, .96);
|
||||||
|
}
|
||||||
|
/* tab 按钮多时横向滚动 —— sticky 容器不能自己滚(会把参数行一起带走),
|
||||||
|
所以滚动只加在 .tabs 上,并用负 margin 抵消容器横向 padding 让滚动区撑到屏幕边 */
|
||||||
|
.tabs {
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
margin: 0 -12px;
|
||||||
|
padding: 0 12px;
|
||||||
|
scrollbar-width: none;
|
||||||
|
}
|
||||||
|
.tabs::-webkit-scrollbar { display: none; }
|
||||||
.tab-button { flex: 0 0 auto; }
|
.tab-button { flex: 0 0 auto; }
|
||||||
|
/* 参数行自成一行,不再跟 tab 栏抢横向空间:窄屏直接换行,分隔线通到屏幕两边 */
|
||||||
|
.tab-controls { margin: 5px -12px 0; padding: 7px 12px 1px; }
|
||||||
|
/* 公司栏 50 + 页头 91(tab 栏 33 + 参数行 41 及间距)+ 18px 呼吸 */
|
||||||
|
.card { scroll-margin-top: 160px; }
|
||||||
.card-bar { align-items: flex-start; flex-wrap: wrap; }
|
.card-bar { align-items: flex-start; flex-wrap: wrap; }
|
||||||
.export-button { margin-left: auto; }
|
.cart-button { margin-left: auto; }
|
||||||
|
.cart-bar { left: 12px; right: 12px; transform: none; flex-wrap: wrap; }
|
||||||
|
.cart-chips { max-width: none; }
|
||||||
.chart { min-width: 560px; }
|
.chart { min-width: 560px; }
|
||||||
.card { overflow-x: auto; }
|
.card { overflow-x: auto; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 估值工具沿用图表页的纸白与棕色主题。 */
|
||||||
|
.tools-title { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line); }
|
||||||
|
.app-layout.tools-layout { grid-template-columns: 184px minmax(0, 1fr); }
|
||||||
|
.tools-layout .content { max-width: 1120px; width: 100%; }
|
||||||
|
.chart-sidebar[hidden] { display: none; }
|
||||||
|
.return-calculator {
|
||||||
|
display: grid;
|
||||||
|
gap: 22px;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 26px;
|
||||||
|
background: var(--surface);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
.return-calculator [hidden] { display: none !important; }
|
||||||
|
.return-calculator h2 { margin: 0 0 10px; font-size: 22px; font-weight: 600; }
|
||||||
|
.return-calculator [data-company] { margin-bottom: 6px; font-size: 13px; color: var(--accent); }
|
||||||
|
.return-calculator .text-small { font-size: 12px; line-height: 1.8; }
|
||||||
|
.return-calculator .text-muted { color: #75716c; }
|
||||||
|
.return-calculator .viz-controls { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px 16px; }
|
||||||
|
.return-calculator .form-label { display: grid; align-content: start; gap: 8px; min-width: 0; font-size: 12px; line-height: 1.6; }
|
||||||
|
.return-calculator .form-control,
|
||||||
|
.return-calculator .form-select {
|
||||||
|
width: 100%; min-width: 0; padding: 10px 12px; border: 1px solid var(--line);
|
||||||
|
border-radius: 6px; background: #faf9f7; color: var(--ink); font: inherit;
|
||||||
|
font-size: 15px; font-variant-numeric: tabular-nums;
|
||||||
|
}
|
||||||
|
.return-calculator .form-control:focus,
|
||||||
|
.return-calculator .form-select:focus { outline: 2px solid var(--accent-soft); border-color: var(--accent); }
|
||||||
|
.return-calculator details { padding: 14px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
|
||||||
|
.return-calculator summary { cursor: pointer; font-size: 13px; color: var(--accent); }
|
||||||
|
.return-calculator .calc-advanced { padding-top: 20px; }
|
||||||
|
.return-calculator .calc-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
|
||||||
|
.return-calculator .calc-message { margin: 0; }
|
||||||
|
.return-calculator .text-destructive { padding: 12px; border-radius: 6px; color: #a63f32; background: #fff1ee; font-size: 13px; }
|
||||||
|
.return-calculator .calc-section { display: grid; gap: 12px; min-width: 0; }
|
||||||
|
.return-calculator .viz-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
|
||||||
|
.return-calculator .viz-stat { padding: 18px 14px; border: 1px solid var(--line); box-shadow: none; background: #faf9f7; font-size: 12px; overflow-wrap: anywhere; }
|
||||||
|
.return-calculator .viz-stat:first-child { background: var(--accent-soft); border-color: var(--accent-soft); }
|
||||||
|
.return-calculator .viz-stat-value { margin-top: 12px; font-size: clamp(18px, 1.7vw, 26px); font-weight: 600; color: var(--accent); font-variant-numeric: tabular-nums; }
|
||||||
|
.return-calculator .calc-notes { padding-top: 8px; border-top: 1px solid var(--line); }
|
||||||
|
.return-calculator .calc-notes p { margin: 8px 0 0; }
|
||||||
|
@media (max-width: 680px) {
|
||||||
|
.return-calculator { padding: 20px 16px; gap: 20px; }
|
||||||
|
.return-calculator h2 { font-size: 20px; }
|
||||||
|
.return-calculator .viz-controls { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 12px; }
|
||||||
|
.return-calculator .viz-grid { grid-template-columns: 1fr; }
|
||||||
|
.return-calculator .viz-stat-value { font-size: 24px; }
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
year,company,shares
|
||||||
|
1988,大都会/ABC(Capital Cities/ABC),3000000
|
||||||
|
1988,房地美(Freddie Mac),2400000
|
||||||
|
1988,盖可保险(GEICO),6850000
|
||||||
|
1988,华盛顿邮报(Washington Post),1727765
|
||||||
|
1988,可口可乐(Coca-Cola),14172500
|
||||||
|
1989,大都会/ABC(Capital Cities/ABC),3000000
|
||||||
|
1989,房地美(Freddie Mac),2400000
|
||||||
|
1989,盖可保险(GEICO),6850000
|
||||||
|
1989,华盛顿邮报(Washington Post),1727765
|
||||||
|
1989,可口可乐(Coca-Cola),23350000
|
||||||
|
1990,大都会/ABC(Capital Cities/ABC),3000000
|
||||||
|
1990,房地美(Freddie Mac),2400000
|
||||||
|
1990,富国银行(Wells Fargo),5000000
|
||||||
|
1990,盖可保险(GEICO),6850000
|
||||||
|
1990,华盛顿邮报(Washington Post),1727765
|
||||||
|
1990,可口可乐(Coca-Cola),46700000
|
||||||
|
1991,大都会/ABC(Capital Cities/ABC),3000000
|
||||||
|
1991,房地美(Freddie Mac),2495200
|
||||||
|
1991,富国银行(Wells Fargo),5000000
|
||||||
|
1991,盖可保险(GEICO),6850000
|
||||||
|
1991,华盛顿邮报(Washington Post),1727765
|
||||||
|
1991,吉列(Gillette),24000000
|
||||||
|
1991,健力士(Guinness),31247000
|
||||||
|
1991,可口可乐(Coca-Cola),46700000
|
||||||
|
1992,大都会/ABC(Capital Cities/ABC),3000000
|
||||||
|
1992,房地美(Freddie Mac),16196700
|
||||||
|
1992,富国银行(Wells Fargo),6358418
|
||||||
|
1992,盖可保险(GEICO),34250000
|
||||||
|
1992,华盛顿邮报(Washington Post),1727765
|
||||||
|
1992,吉列(Gillette),24000000
|
||||||
|
1992,健力士(Guinness),38335000
|
||||||
|
1992,可口可乐(Coca-Cola),93400000
|
||||||
|
1992,通用动力(General Dynamics),4350000
|
||||||
|
1993,大都会/ABC(Capital Cities/ABC),2000000
|
||||||
|
1993,房地美(Freddie Mac),13654600
|
||||||
|
1993,富国银行(Wells Fargo),6791218
|
||||||
|
1993,盖可保险(GEICO),34250000
|
||||||
|
1993,华盛顿邮报(Washington Post),1727765
|
||||||
|
1993,吉列(Gillette),24000000
|
||||||
|
1993,健力士(Guinness),38335000
|
||||||
|
1993,可口可乐(Coca-Cola),93400000
|
||||||
|
1993,通用动力(General Dynamics),4350000
|
||||||
|
1994,大都会/ABC(Capital Cities/ABC),20000000
|
||||||
|
1994,房地美(Freddie Mac),12761200
|
||||||
|
1994,富国银行(Wells Fargo),6791218
|
||||||
|
1994,盖可保险(GEICO),34250000
|
||||||
|
1994,甘尼特(Gannett),6854500
|
||||||
|
1994,华盛顿邮报(Washington Post),1727765
|
||||||
|
1994,吉列(Gillette),24000000
|
||||||
|
1994,可口可乐(Coca-Cola),100000000
|
||||||
|
1994,美国运通(American Express),27759941
|
||||||
|
1994,PNC 银行(PNC Bank),19453300
|
||||||
|
1995,大都会/ABC(Capital Cities/ABC),20000000
|
||||||
|
1995,房地美(Freddie Mac),12502500
|
||||||
|
1995,富国银行(Wells Fargo),6791218
|
||||||
|
1995,盖可保险(GEICO),34250000
|
||||||
|
1995,吉列(Gillette),48000000
|
||||||
|
1995,可口可乐(Coca-Cola),100000000
|
||||||
|
1995,美国运通(American Express),49456900
|
||||||
|
1996,房地美(Freddie Mac),64246000
|
||||||
|
1996,富国银行(Wells Fargo),7291418
|
||||||
|
1996,华盛顿邮报(Washington Post),1727765
|
||||||
|
1996,华特迪士尼(Walt Disney),24614214
|
||||||
|
1996,吉列(Gillette),48000000
|
||||||
|
1996,可口可乐(Coca-Cola),200000000
|
||||||
|
1996,麦当劳(McDonald's),30156600
|
||||||
|
1996,美国运通(American Express),49456900
|
||||||
|
1997,房地美(Freddie Mac),63977600
|
||||||
|
1997,富国银行(Wells Fargo),6690218
|
||||||
|
1997,华盛顿邮报(Washington Post),1727765
|
||||||
|
1997,华特迪士尼(Walt Disney),21563414
|
||||||
|
1997,吉列(Gillette),48000000
|
||||||
|
1997,可口可乐(Coca-Cola),200000000
|
||||||
|
1997,旅行家集团(Travelers Group),23733198
|
||||||
|
1997,美国运通(American Express),49456900
|
||||||
|
@@ -0,0 +1,105 @@
|
|||||||
|
1997/12/31,,,,,,,,,,,
|
||||||
|
公司名称,股份数量,成本(截至1997/12/31)(百万美元)*,市值(截至1997/12/31)(百万美元),,,,,,,,
|
||||||
|
美国运通 (American Express),"49,456,900 ","1,392.70 ","4,414.00 ",,,,,,,,
|
||||||
|
可口可乐 (The Coca-Cola Company),"200,000,000 ","1,298.90 ","13,337.50 ",,,,,,,,
|
||||||
|
迪士尼 (The Walt Disney Company),"21,563,414 ",381,"2,134.80 ",,,,,,,,
|
||||||
|
房地美 (Freddie Mac),"63,977,600 ",329,"2,683.10 ",,,,,,,,
|
||||||
|
吉列 (The Gillette Company),"48,000,000 ",600,"4,821.00 ",,,,,,,,
|
||||||
|
旅行家集团 (Travelers Group Inc.),"23,733,198 ",604,"1,278.60 ",,,,,,,,
|
||||||
|
华盛顿邮报 (The Washington Post Company),"1,727,765 ",11,841,,,,,,,,
|
||||||
|
富国银行 (Wells Fargo & Company),"6,690,218 ",413,"2,270.90 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1996/12/31,,,,,,,,,,,
|
||||||
|
公司,股数,成本\*(百万美元,截至1996/12/31),市值(百万美元,截至1996/12/31),,,,,,,,
|
||||||
|
美国运通,"49,456,900 ","1,392.70 ","2,794.30 ",,,,,,,,
|
||||||
|
可口可乐,"200,000,000 ","1,298.90 ","10,525.00 ",,,,,,,,
|
||||||
|
华特迪士尼,"24,614,214 ",577,"1,716.80 ",,,,,,,,
|
||||||
|
房地美,"64,246,000 ",333,"1,772.80 ",,,,,,,,
|
||||||
|
吉列,"48,000,000 ",600,"3,732.00 ",,,,,,,,
|
||||||
|
麦当劳,"30,156,600 ","1,265.30 ","1,368.40 ",,,,,,,,
|
||||||
|
华盛顿邮报,"1,727,765 ",11,579,,,,,,,,
|
||||||
|
富国银行,"7,291,418 ",498,"1,966.90 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1995/12/31,,,,,,,,,,,
|
||||||
|
公司,股数,成本 1995/12/31(百万美元),市值 1995/12/31(百万美元),,,,,,,,
|
||||||
|
美国运通 (American Express),"49,456,900 ","1,392.70 ","2,046.30 ",,,,,,,,
|
||||||
|
大都会/ABC (Capital Cities/ABC),"20,000,000 ",345,"2,467.50 ",,,,,,,,
|
||||||
|
可口可乐 (The Coca-Cola Company),"100,000,000 ","1,298.90 ","7,425.00 ",,,,,,,,
|
||||||
|
房地美 (Freddie Mac),"12,502,500 ",260,"1,044.00 ",,,,,,,,
|
||||||
|
盖可保险 (GEICO Corp.),"34,250,000 ",46,"2,393.20 ",,,,,,,,
|
||||||
|
吉列 (The Gillette Company),"48,000,000 ",600,"2,502.00 ",,,,,,,,
|
||||||
|
富国银行 (Wells Fargo & Company),"6,791,218 ",424,"1,466.90 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1994/12/31,,,,,,,,,,,
|
||||||
|
公司,股份数量,成本 (千美元),市值(千美元),,,,,,,,
|
||||||
|
美国运通 ,"27,759,941 ","US$723,919 ","US$818,918 ",,,,,,,,
|
||||||
|
大都会/ABC,"20,000,000 ","345,000 ","1,705,000 ",,,,,,,,
|
||||||
|
可口可乐,"100,000,000 ","1,298,888 ","5,150,000 ",,,,,,,,
|
||||||
|
房地美,"12,761,200 ","270,468 ","644,441 ",,,,,,,,
|
||||||
|
甘尼特公司,"6,854,500 ","335,216 ","365,002 ",,,,,,,,
|
||||||
|
盖可保险 (GEICO),"34,250,000 ","45,713 ","1,678,250 ",,,,,,,,
|
||||||
|
吉列 (Gillette),"24,000,000 ","600,000 ","1,797,000 ",,,,,,,,
|
||||||
|
PNC银行 (PNC Bank),"19,453,300 ","503,046 ","410,951 ",,,,,,,,
|
||||||
|
华盛顿邮报,"1,727,765 ","9,731 ","418,983 ",,,,,,,,
|
||||||
|
富国银行 ,"6,791,218 ","423,680 ","984,727 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1993/12/31,,,,,,,,,,,
|
||||||
|
公司名称,股份数量,成本(千美元),市值(千美元),,,,,,,,
|
||||||
|
大都会/ABC ,"2,000,000 ","US$345,000 ","US$1,239,000 ",,,,,,,,
|
||||||
|
可口可乐 ,"93,400,000 ","1,023,920 ","4,167,975 ",,,,,,,,
|
||||||
|
房地美 ,"13,654,600 ","307,505 ","681,023 ",,,,,,,,
|
||||||
|
盖可保险 ,"34,250,000 ","45,713 ","1,759,594 ",,,,,,,,
|
||||||
|
通用动力 ,"4,350,000 ","94,938 ","401,287 ",,,,,,,,
|
||||||
|
吉列 ,"24,000,000 ","600,000 ","1,431,000 ",,,,,,,,
|
||||||
|
健力士,"38,335,000 ","333,019 ","270,822 ",,,,,,,,
|
||||||
|
华盛顿邮报 ,"1,727,765 ","9,731 ","440,148 ",,,,,,,,
|
||||||
|
富国银行,"6,791,218 ","423,680 ","878,614 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1992/12/31,,,,,,,,,,,
|
||||||
|
公司名称,股份数量,成本 (千美元),市值(千美元),,,,,,,,
|
||||||
|
大都会/ABC,"3,000,000 ","US$517,500 ","US$1,523,500 ",,,,,,,,
|
||||||
|
可口可乐,"93,400,000 ","1,023,920 ","3,911,125 ",,,,,,,,
|
||||||
|
房地美 ,"16,196,700 ","414,257 ","783,515 ",,,,,,,,
|
||||||
|
盖可保险 ,"34,250,000 ","45,713 ","2,226,250 ",,,,,,,,
|
||||||
|
通用动力,"4,350,000 ","312,438 ","450,769 ",,,,,,,,
|
||||||
|
吉列 ,"24,000,000 ","600,000 ","1,365,000 ",,,,,,,,
|
||||||
|
健力士,"38,335,000 ","333,019 ","299,581 ",,,,,,,,
|
||||||
|
华盛顿邮报 ,"1,727,765 ","9,731 ","396,954 ",,,,,,,,
|
||||||
|
富国银行,"6,358,418 ","380,983 ","485,624 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1991/12/31,,,,,,,,,,,
|
||||||
|
公司,股数,成本(千美元),市值(千美元),,,,,,,,
|
||||||
|
大都会/ABC,"3,000,000 ","US$517,500 ","US$1,300,500 ",,,,,,,,
|
||||||
|
可口可乐,"46,700,000 ","1,023,920 ","3,747,675 ",,,,,,,,
|
||||||
|
房地美,"2,495,200 ","77,245 ","343,090 ",,,,,,,,
|
||||||
|
盖可保险,"6,850,000 ","45,713 ","1,363,150 ",,,,,,,,
|
||||||
|
吉列,"24,000,000 ","600,000 ","1,347,000 ",,,,,,,,
|
||||||
|
健力士 ,"31,247,000 ","264,782 ","296,755 ",,,,,,,,
|
||||||
|
华盛顿邮报,"1,727,765 ","9,731 ","336,050 ",,,,,,,,
|
||||||
|
富国银行,"5,000,000 ","289,431 ","290,000 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1990/12/31,,,,,,,,,,,
|
||||||
|
公司,持股数量,成本(千美元),市值(千美元),,,,,,,,
|
||||||
|
大都会/ABC公司,"3,000,000 ","US$517,500 ","US$1,377,375 ",,,,,,,,
|
||||||
|
可口可乐公司,"46,700,000 ","1,023,920 ","2,171,550 ",,,,,,,,
|
||||||
|
联邦住房贷款抵押公司,"2,400,000 ","71,729 ","117,000 ",,,,,,,,
|
||||||
|
盖可保险公司,"6,850,000 ","45,713 ","1,110,556 ",,,,,,,,
|
||||||
|
华盛顿邮报公司,"1,727,765 ","9,731 ","342,097 ",,,,,,,,
|
||||||
|
富国银行,"5,000,000 ","289,431 ","289,375 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1989/12/31,,,,,,,,,,,
|
||||||
|
股份数量,公司名称,成本(千美元),市值(千美元),,,,,,,,
|
||||||
|
"3,000,000 ",大都会/ABC,"US$517,500 ","US$1,692,375 ",,,,,,,,
|
||||||
|
"23,350,000 ",可口可乐,"1,023,920 ","1,803,787 ",,,,,,,,
|
||||||
|
"2,400,000 ",房地美优先股,"71,729 ","161,100 ",,,,,,,,
|
||||||
|
"6,850,000 ",盖可保险,"45,713 ","1,044,625 ",,,,,,,,
|
||||||
|
"1,727,765 ",华盛顿邮报 ,"9,731 ","486,366 ",,,,,,,,
|
||||||
|
,,,,,,,,,,,
|
||||||
|
1988/12/31,,,,,,,,,,,
|
||||||
|
股份数量,公司名称,成本(千美元),市值(千美元),,,,,,,,
|
||||||
|
"3,000,000 ",大都会/ABC,"US$517,500 ","US$1,086,750 ",,,,,,,,
|
||||||
|
"14,172,500 ",可口可乐公司,"592,540 ","632,448 ",,,,,,,,
|
||||||
|
"2,400,000 ",联邦住宅贷款抵押公司优先股\*,"71,729 ","121,200 ",,,,,,,,
|
||||||
|
"6,850,000 ",盖可保险,"45,713 ","849,400 ",,,,,,,,
|
||||||
|
"1,727,765 ",华盛顿邮报公司,"9,731 ","364,126 ",,,,,,,,
|
||||||
|
Binary file not shown.
@@ -0,0 +1,7 @@
|
|||||||
|
company,gp_per_wh,margin_data
|
||||||
|
宁德时代,0.122,20.63
|
||||||
|
比亚迪*,0.097,21.00
|
||||||
|
LG新能源†,-0.010,-0.70
|
||||||
|
中创新航*,0.077,16.71
|
||||||
|
国轩高科*,0.063,14.02
|
||||||
|
亿纬锂能,0.078,16.19
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,calb,guoxuan,eve
|
||||||
|
2021,0.784,0.720,0.660,0.683,
|
||||||
|
2022,0.978,0.800,0.872,0.840,
|
||||||
|
2023,0.889,0.700,0.618,0.720,
|
||||||
|
2024,0.664,0.550,0.496,0.626,
|
||||||
|
2025,0.585,0.470,0.459,0.473,0.516
|
||||||
|
2026H1,0.591,0.460,0.459,0.452,0.483
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
company,gp_2023,gp_2026h1
|
||||||
|
宁德时代,0.198,0.122
|
||||||
|
比亚迪*,0.154,0.097
|
||||||
|
LG新能源†,0.119,-0.010
|
||||||
|
中创新航*,0.080,0.077
|
||||||
|
国轩高科*,0.112,0.063
|
||||||
|
亿纬锂能,,0.078
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,peer_avg,gap_multiple
|
||||||
|
2021,0.172,0.080,2.15
|
||||||
|
2022,0.168,0.118,1.42
|
||||||
|
2023,0.198,0.096,2.06
|
||||||
|
2024,0.159,0.087,1.83
|
||||||
|
2025,0.139,0.075,1.85
|
||||||
|
2026H1,0.122,0.073,1.68
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,calb,guoxuan,eve
|
||||||
|
2021,0.172,0.144,0.067,0.037,0.123,
|
||||||
|
2022,0.168,0.144,0.091,0.090,0.147,
|
||||||
|
2023,0.198,0.154,0.119,0.080,0.112,
|
||||||
|
2024,0.159,0.121,0.032,0.079,0.095,
|
||||||
|
2025,0.139,0.103,0.068,0.077,0.068,0.080
|
||||||
|
2026H1,0.122,0.097,-0.010,0.077,0.063,0.078
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,calb,guoxuan,global_total
|
||||||
|
2021,99.5,26.4,59.4,8.0,6.7,301.5
|
||||||
|
2022,191.6,70.4,70.4,20.0,14.1,517.9
|
||||||
|
2023,259.7,111.4,95.8,33.4,17.1,705.5
|
||||||
|
2024,339.3,153.7,96.3,39.4,28.5,894.4
|
||||||
|
2025,464.7,194.8,108.8,62.8,53.5,1187.0
|
||||||
|
2026H1,242.7,87.7,52.6,31.2,28.0,608.5
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,calb,guoxuan
|
||||||
|
2021,33.0,8.7,19.7,2.6,2.2
|
||||||
|
2022,37.0,13.6,13.6,3.9,2.7
|
||||||
|
2023,36.8,15.8,13.6,4.7,2.4
|
||||||
|
2024,37.9,17.2,10.8,4.4,3.2
|
||||||
|
2025,39.2,16.4,9.2,5.3,4.5
|
||||||
|
2026H1,39.9,14.4,8.6,5.1,4.6
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,calb,guoxuan,eve
|
||||||
|
2021,22.00,20.00,4.31,5.60,18.00,
|
||||||
|
2022,17.17,18.00,4.74,10.32,17.50,
|
||||||
|
2023,22.27,22.00,6.41,13.00,15.50,
|
||||||
|
2024,23.94,22.00,2.25,15.89,15.14,
|
||||||
|
2025,23.84,22.00,5.69,16.69,14.39,15.50
|
||||||
|
2026H1,20.63,21.00,-0.70,16.71,14.02,16.19
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,calb,guoxuan
|
||||||
|
2021,95.1,,73.4,95.2,41.0
|
||||||
|
2022,83.3,71.0,73.6,93.8,46.0
|
||||||
|
2023,70.5,72.0,69.3,75.6,48.0
|
||||||
|
2024,76.3,70.0,57.8,78.7,46.0
|
||||||
|
2025,96.9,82.0,47.6,,71.0
|
||||||
|
2026H1,94.9,,52.8,,
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,sales_gwh,revenue_yi,asp,cost_per_wh,gp_per_wh,gross_margin
|
||||||
|
2021,116.7,914.9,0.784,0.612,0.172,22.00
|
||||||
|
2022,242.0,2365.9,0.978,0.810,0.168,17.17
|
||||||
|
2023,321.0,2852.5,0.889,0.691,0.198,22.27
|
||||||
|
2024,381.0,2530.4,0.664,0.505,0.159,23.94
|
||||||
|
2025,541.0,3165.1,0.585,0.446,0.139,23.84
|
||||||
|
2026H1,325,1921.2,0.591,0.469,0.122,20.63
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,china,korea,japan,others,global_total
|
||||||
|
2021,48.2,30.2,12.0,9.6,301.5
|
||||||
|
2022,60.4,23.7,7.3,8.6,517.9
|
||||||
|
2023,63.5,23.2,6.1,7.2,705.5
|
||||||
|
2024,67.1,18.5,3.9,10.5,894.4
|
||||||
|
2025,70.4,15.3,3.7,10.6,1187.0
|
||||||
|
2026H1,72.4,11.7,3.7,12.2,608.5
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
rank,company,region,gwh,share,yoy,global_total
|
||||||
|
1,宁德时代,中国,242.7,39.9,25.3,608.5
|
||||||
|
2,比亚迪,中国,87.7,14.4,1.6,608.5
|
||||||
|
3,LG新能源,韩国,52.6,8.6,8.4,608.5
|
||||||
|
4,中创新航,中国,31.2,5.1,39.5,608.5
|
||||||
|
5,国轩高科,中国,28.0,4.6,43.3,608.5
|
||||||
|
6,松下,日本,22.7,3.7,10.2,608.5
|
||||||
|
7,亿纬锂能,中国,20.9,3.4,51.7,608.5
|
||||||
|
8,SK On,韩国,19.0,3.1,-6.7,608.5
|
||||||
|
9,蜂巢能源,中国,15.7,2.6,40.9,608.5
|
||||||
|
10,欣旺达,中国,14.5,2.4,13.7,608.5
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,panasonic,sk_on,samsung_sdi,calb,guoxuan,eve,sunwoda,svolt,farasis,global_total
|
||||||
|
2021,99.5,26.4,59.4,36.3,17.3,14.5,8.0,6.7,,2.6,,2.4,301.5
|
||||||
|
2022,191.6,70.4,70.4,38.0,27.8,24.3,20.0,14.1,,9.2,,7.4,517.9
|
||||||
|
2023,259.7,111.4,95.8,42.8,34.7,33.1,33.4,17.1,16.2,10.5,,,705.5
|
||||||
|
2024,339.3,153.7,96.3,35.1,39.0,29.6,39.4,28.5,20.3,18.8,,,894.4
|
||||||
|
2025,464.7,194.8,108.8,44.2,44.5,28.9,62.8,53.5,31.3,,28.5,,1187.0
|
||||||
|
2026H1,242.7,87.7,52.6,22.7,19.0,,31.2,28.0,20.9,14.5,15.7,,608.5
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,catl,byd,lges,panasonic,sk_on,samsung_sdi,calb,guoxuan,eve,sunwoda,svolt,farasis,cr3,cr5,cr10,china_top10_count,china_share
|
||||||
|
2021,33.0,8.7,19.7,12.0,5.7,4.8,2.6,2.2,,0.9,,0.8,64.7,79.1,90.4,6,48.2
|
||||||
|
2022,37.0,13.6,13.6,7.3,5.4,4.7,3.9,2.7,,1.8,,1.4,64.2,76.9,91.4,6,60.4
|
||||||
|
2023,36.8,15.8,13.6,6.1,4.9,4.7,4.7,2.4,2.3,1.5,,,66.2,77.2,92.8,6,63.5
|
||||||
|
2024,37.9,17.2,10.8,3.9,4.4,3.3,4.4,3.2,2.3,2.1,,,65.9,74.7,89.5,6,67.1
|
||||||
|
2025,39.2,16.4,9.2,3.7,3.7,2.4,5.3,4.5,2.6,,2.4,,64.8,74.6,89.4,6,70.4
|
||||||
|
2026H1,39.9,14.4,8.6,3.7,3.1,,5.1,4.6,3.4,2.4,2.6,,62.9,72.6,87.8,7,72.4
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
stage,mid_price,onshore_spot
|
||||||
|
年初,7.0288,6.9890
|
||||||
|
2026-06-30,6.8109,6.7852
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
period,non_gaap_net_profit,gross_profit,revenue,cost
|
||||||
|
22H1,-13.5,22.7,33.9,50.8
|
||||||
|
22年,-42.7,4.3,2.8,13.5
|
||||||
|
23H1,42.3,19.3,12.9,10.6
|
||||||
|
23年,107.7,45.5,36.5,24.2
|
||||||
|
24H1,90.2,71.9,62.0,46.9
|
||||||
|
24年,185.7,125.4,106.9,77.6
|
||||||
|
25H1,362.8,234.4,204.4,151.1
|
||||||
|
25年,284.5,207.4,184.7,139.0
|
||||||
|
26H1,9.2,26.5,20.5,26.5
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
period,inventory,revenue,turnover_days
|
||||||
|
22H1,9.6,23.6,160
|
||||||
|
22年,8.7,46.2,154
|
||||||
|
23H1,7.6,28.1,132
|
||||||
|
23年,9.1,63.0,133
|
||||||
|
24H1,9.2,45.6,101
|
||||||
|
24年,15.2,130.4,102
|
||||||
|
25H1,22.7,138.8,84
|
||||||
|
25年,54.7,371.2,123
|
||||||
|
26H1,61.0,371.7,201
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
period,gross_margin,sales_expense_rate,admin_expense_rate,non_gaap_net_margin
|
||||||
|
22H1,58.1,29.4,13.7,15.9
|
||||||
|
22年,57.5,31.9,14.9,12.4
|
||||||
|
23H1,60.4,31.2,11.8,19.0
|
||||||
|
23年,61.3,31.8,11.2,18.9
|
||||||
|
24H1,64.0,29.7,9.5,22.3
|
||||||
|
24年,66.8,28.0,7.3,26.1
|
||||||
|
25H1,70.3,23.0,5.6,33.9
|
||||||
|
25年,72.1,21.8,4.8,35.2
|
||||||
|
26H1,69.7,22.9,5.4,30.0
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
period,total_assets,equity,liabilities,cash_like,cash,receivables,inventory
|
||||||
|
2016,,,,,,,
|
||||||
|
2017,,,,,,,
|
||||||
|
2018,,,,,,,
|
||||||
|
2019,,,,,,,
|
||||||
|
2020,,,,,,,
|
||||||
|
2021,,,,,,,
|
||||||
|
2022,,,,,,,
|
||||||
|
2023,,,,,,,
|
||||||
|
2024,,,,,,,
|
||||||
|
2025,,,,,,,
|
||||||
|
@@ -0,0 +1,22 @@
|
|||||||
|
period,total_assets,equity,liabilities,cash_like,cash,receivables,inventory
|
||||||
|
2021Q2,,,,,,,
|
||||||
|
2021Q3,,,,,,,
|
||||||
|
2021Q4,,,,,,,
|
||||||
|
2022Q1,,,,,,,
|
||||||
|
2022Q2,,,,,,,
|
||||||
|
2022Q3,,,,,,,
|
||||||
|
2022Q4,,,,,,,
|
||||||
|
2023Q1,,,,,,,
|
||||||
|
2023Q2,,,,,,,
|
||||||
|
2023Q3,,,,,,,
|
||||||
|
2023Q4,,,,,,,
|
||||||
|
2024Q1,,,,,,,
|
||||||
|
2024Q2,,,,,,,
|
||||||
|
2024Q3,,,,,,,
|
||||||
|
2024Q4,,,,,,,
|
||||||
|
2025Q1,,,,,,,
|
||||||
|
2025Q2,,,,,,,
|
||||||
|
2025Q3,,,,,,,
|
||||||
|
2025Q4,,,,,,,
|
||||||
|
2026Q1,,,,,,,
|
||||||
|
2026Q2,,,,,,,
|
||||||
|
@@ -0,0 +1,31 @@
|
|||||||
|
period,planned_capacity,released_capacity,base_wine_output,commercial_wine_sales
|
||||||
|
2000,,,5397.000000,
|
||||||
|
2001,,,7317.000000,
|
||||||
|
2002,,,8640.000000,
|
||||||
|
2003,,,9757.000000,
|
||||||
|
2004,,,11522.000000,6500.000000
|
||||||
|
2005,,,12500.000000,7356.000000
|
||||||
|
2006,,,13839.000000,7300.000000
|
||||||
|
2007,,,16865.000000,8640.000000
|
||||||
|
2008,,,20431.000000,9558.000000
|
||||||
|
2009,,,23004.000000,10380.000000
|
||||||
|
2010,,,26284.000000,10141.000000
|
||||||
|
2011,,,30026.000000,11250.000000
|
||||||
|
2012,,,33600.000000,14800.000000
|
||||||
|
2013,,,38452.000000,15500.000000
|
||||||
|
2014,,,38745.000000,18000.000000
|
||||||
|
2015,,,32179.000000,19798.000000
|
||||||
|
2016,32592.000000,31360.000000,39313.000000,22918.000000
|
||||||
|
2017,35952.000000,32592.000000,42829.000000,30206.000000
|
||||||
|
2018,37408.000000,35952.000000,49672.000000,32464.000000
|
||||||
|
2019,38528.000000,37408.000000,49923.000000,34562.000000
|
||||||
|
2020,42560.000000,38528.000000,50235.000000,34313.000000
|
||||||
|
2021,42743.000000,42743.000000,56472.250000,36261.000000
|
||||||
|
2022,42743.000000,42743.000000,56810.440000,37901.000000
|
||||||
|
2023,42795.000000,42743.000000,57204.110000,42111.000000
|
||||||
|
2024,44595.000000,,56271.990000,46412.950000
|
||||||
|
2025,46395.000000,,58473.160000,46750.660000
|
||||||
|
2026,,,,
|
||||||
|
2027,,,,
|
||||||
|
2028,,,,
|
||||||
|
2029,,,,
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
period,operating_cash_flow,investing_cash_flow,financing_cash_flow,net_cash_increase
|
||||||
|
2016,374.510000,-11.030000,-83.350000,280.140000
|
||||||
|
2017,221.530000,-11.210000,-88.990000,121.330000
|
||||||
|
2018,413.850000,-16.290000,-164.410000,233.150000
|
||||||
|
2019,452.110000,-31.660000,-192.840000,227.610000
|
||||||
|
2020,516.690000,-18.050000,-241.280000,257.370000
|
||||||
|
2021,640.290000,-55.620000,-265.640000,319.000000
|
||||||
|
2022,366.990000,-55.370000,-574.250000,-262.620000
|
||||||
|
2023,665.930000,-97.240000,-588.890000,-20.190000
|
||||||
|
2024,924.640000,-17.850000,-710.680000,196.100000
|
||||||
|
2025,615.220000,-316.420000,-734.270000,-435.440000
|
||||||
|
@@ -0,0 +1,22 @@
|
|||||||
|
period,operating_cash_flow,investing_cash_flow,financing_cash_flow,net_cash_increase
|
||||||
|
2021Q2,217.190000,-38.720000,-264.080000,-85.610000
|
||||||
|
2021Q3,150.330000,-3.940000,-1.200000,145.180000
|
||||||
|
2021Q4,272.770000,-12.960000,-0.360000,259.430000
|
||||||
|
2022Q1,-68.760000,-12.400000,-0.040000,-81.200000
|
||||||
|
2022Q2,68.650000,-4.650000,-283.150000,-219.160000
|
||||||
|
2022Q3,94.160000,-9.660000,-15.460000,69.050000
|
||||||
|
2022Q4,272.940000,-28.660000,-275.600000,-31.310000
|
||||||
|
2023Q1,52.450000,2.180000,-0.230000,54.400000
|
||||||
|
2023Q2,251.420000,-6.980000,-325.740000,-81.290000
|
||||||
|
2023Q3,196.150000,-78.360000,-21.280000,96.500000
|
||||||
|
2023Q4,165.910000,-14.080000,-241.640000,-89.800000
|
||||||
|
2024Q1,91.870000,-7.670000,-0.120000,84.080000
|
||||||
|
2024Q2,274.350000,-21.320000,-388.040000,-135.010000
|
||||||
|
2024Q3,77.990000,22.940000,-1.730000,99.200000
|
||||||
|
2024Q4,480.430000,-11.800000,-320.790000,147.830000
|
||||||
|
2025Q1,88.090000,-6.240000,-16.070000,65.780000
|
||||||
|
2025Q2,43.100000,3.100000,-382.860000,-336.630000
|
||||||
|
2025Q3,250.780000,-51.090000,-33.510000,166.170000
|
||||||
|
2025Q4,233.250000,-262.190000,-301.830000,-330.760000
|
||||||
|
2026Q1,269.100000,256.390000,-10.060000,515.430000
|
||||||
|
2026Q2,437.810000,0.020000,-369.380000,68.420000
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
period,direct,wholesale,direct_share,wholesale_share
|
||||||
|
2016,34.850000,353.560000,0.089725,0.910275
|
||||||
|
2017,,,,
|
||||||
|
2018,43.760000,691.890000,0.059485,0.940515
|
||||||
|
2019,72.490000,780.960000,0.084938,0.915062
|
||||||
|
2020,132.400000,815.820000,0.139630,0.860370
|
||||||
|
2021,240.290000,820.300000,0.226563,0.773437
|
||||||
|
2022,493.790000,743.940000,0.398948,0.601052
|
||||||
|
2023,672.330000,799.860000,0.456687,0.543313
|
||||||
|
2024,748.433270,957.685110,0.438676,0.561324
|
||||||
|
2025,845.430319,842.315533,0.500923,0.499077
|
||||||
|
@@ -0,0 +1,31 @@
|
|||||||
|
period,moutai,series,direct,wholesale,moutai_share,direct_share
|
||||||
|
2019Q1,194.980000,21.320000,10.920000,205.380000,0.901433,0.050485
|
||||||
|
2019Q2,347.950000,46.550000,16.020000,378.480000,0.882003,0.040608
|
||||||
|
2019Q3,538.320000,70.380000,31.030000,577.670000,0.884377,0.050977
|
||||||
|
2019Q4,758.020000,95.420000,72.490000,780.960000,0.888194,0.084938
|
||||||
|
2020Q1,222.220000,21.690000,19.380000,224.530000,0.911074,0.079456
|
||||||
|
2020Q2,392.610000,46.500000,51.530000,387.590000,0.894104,0.117348
|
||||||
|
2020Q3,601.450000,70.000000,84.330000,587.130000,0.895748,0.125592
|
||||||
|
2020Q4,848.310000,99.910000,132.400000,815.820000,0.894634,0.139630
|
||||||
|
2021Q1,245.920000,26.430000,47.770000,224.570000,0.902956,0.175406
|
||||||
|
2021Q2,429.490000,60.600000,95.040000,395.050000,0.876349,0.193924
|
||||||
|
2021Q3,649.920000,95.400000,146.850000,598.470000,0.872001,0.197029
|
||||||
|
2021Q4,934.650000,125.950000,240.290000,820.300000,0.881246,0.226563
|
||||||
|
2022Q1,288.600000,34.280000,108.870000,214.010000,0.893831,0.337184
|
||||||
|
2022Q2,499.650000,75.980000,209.490000,366.140000,0.868005,0.363932
|
||||||
|
2022Q3,744.000000,125.400000,318.820000,550.590000,0.855763,0.366708
|
||||||
|
2022Q4,1078.340000,159.390000,493.790000,743.940000,0.871224,0.398948
|
||||||
|
2023Q1,337.220000,50.140000,178.070000,209.290000,0.870560,0.459702
|
||||||
|
2023Q2,592.790000,100.740000,314.200000,379.330000,0.854743,0.453045
|
||||||
|
2023Q3,872.700000,155.940000,462.070000,566.570000,0.848402,0.449205
|
||||||
|
2023Q4,1265.890000,206.300000,672.330000,799.860000,0.859869,0.456687
|
||||||
|
2024Q1,397.070000,59.360000,193.190000,263.240000,0.869947,0.423263
|
||||||
|
2024Q2,685.670000,131.470000,337.280000,479.860000,0.839110,0.412757
|
||||||
|
2024Q3,1011.260000,193.930000,519.890000,685.290000,0.839088,0.431380
|
||||||
|
2024Q4,1459.280000,246.840000,748.430000,957.690000,0.855321,0.438674
|
||||||
|
2025Q1,435.570000,70.220000,232.200000,273.600000,0.861168,0.459075
|
||||||
|
2025Q2,755.900000,137.630000,400.100000,493.430000,0.845970,0.447775
|
||||||
|
2025Q3,1105.140000,178.840000,555.550000,728.420000,0.860714,0.432681
|
||||||
|
2025Q4,1465.000000,222.750000,845.430000,842.320000,0.868020,0.500921
|
||||||
|
2026Q1,460.048686,78.808783,295.040339,243.817130,0.853748,0.547529
|
||||||
|
2026Q2,777.240000,129.340000,519.620000,386.970000,0.857332,0.573159
|
||||||
|
@@ -0,0 +1,31 @@
|
|||||||
|
period,moutai,series,direct,wholesale,moutai_share,direct_share
|
||||||
|
2019Q1,194.980000,21.320000,10.920000,205.380000,0.901433,0.050485
|
||||||
|
2019Q2,152.970000,25.230000,5.100000,173.100000,0.858418,0.028620
|
||||||
|
2019Q3,190.380000,23.830000,15.010000,199.190000,0.888754,0.070075
|
||||||
|
2019Q4,219.700000,25.050000,41.460000,203.290000,0.897651,0.169397
|
||||||
|
2020Q1,222.220000,21.690000,19.380000,224.530000,0.911074,0.079456
|
||||||
|
2020Q2,170.390000,24.820000,32.140000,163.060000,0.872855,0.164652
|
||||||
|
2020Q3,208.840000,23.500000,32.800000,199.540000,0.898855,0.141172
|
||||||
|
2020Q4,246.860000,29.910000,48.070000,228.690000,0.891932,0.173688
|
||||||
|
2021Q1,245.920000,26.430000,47.770000,224.570000,0.902956,0.175406
|
||||||
|
2021Q2,183.570000,34.180000,47.270000,170.480000,0.843031,0.217084
|
||||||
|
2021Q3,220.430000,34.790000,51.810000,203.410000,0.863686,0.203001
|
||||||
|
2021Q4,284.730000,30.550000,93.440000,221.830000,0.903102,0.296381
|
||||||
|
2022Q1,288.600000,34.280000,108.870000,214.010000,0.893831,0.337184
|
||||||
|
2022Q2,211.050000,41.700000,100.620000,152.130000,0.835015,0.398101
|
||||||
|
2022Q3,244.350000,49.420000,109.320000,184.450000,0.831773,0.372128
|
||||||
|
2022Q4,334.340000,33.980000,174.970000,193.350000,0.907743,0.475049
|
||||||
|
2023Q1,337.220000,50.140000,178.070000,209.290000,0.870560,0.459702
|
||||||
|
2023Q2,255.570000,50.600000,136.130000,170.040000,0.834732,0.444622
|
||||||
|
2023Q3,279.910000,55.200000,147.870000,187.240000,0.835278,0.441258
|
||||||
|
2023Q4,393.200000,50.360000,210.260000,233.290000,0.886464,0.474039
|
||||||
|
2024Q1,397.070000,59.360000,193.190000,263.240000,0.869947,0.423263
|
||||||
|
2024Q2,288.600000,72.110000,144.090000,216.620000,0.800089,0.399462
|
||||||
|
2024Q3,325.590000,62.460000,182.610000,205.430000,0.839041,0.470596
|
||||||
|
2024Q4,448.020000,52.910000,228.540000,272.390000,0.894376,0.456231
|
||||||
|
2025Q1,435.570000,70.220000,232.200000,273.600000,0.861168,0.459075
|
||||||
|
2025Q2,320.320000,67.400000,167.890000,219.830000,0.826163,0.433019
|
||||||
|
2025Q3,349.240000,41.220000,155.460000,235.000000,0.894432,0.398146
|
||||||
|
2025Q4,359.860000,43.900000,289.880000,113.890000,0.891272,0.717933
|
||||||
|
2026Q1,460.048686,78.808783,295.040339,243.817130,0.853748,0.547529
|
||||||
|
2026Q2,317.190000,50.530000,224.580000,143.150000,0.862586,0.610720
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
period,domestic,overseas,total
|
||||||
|
2022年报,2084.000000,105.000000,2189.000000
|
||||||
|
2023年报,2080.000000,106.000000,2186.000000
|
||||||
|
2024年报,2143.000000,104.000000,2247.000000
|
||||||
|
2025Q1,2174.000000,109.000000,2283.000000
|
||||||
|
2025Q2,2280.000000,115.000000,2395.000000
|
||||||
|
2025Q3,2325.000000,121.000000,2446.000000
|
||||||
|
2025年报,2353.000000,126.000000,2479.000000
|
||||||
|
2026Q1,2098.000000,124.000000,2222.000000
|
||||||
|
2026Q2,2307.000000,119.000000,2426.000000
|
||||||
|
@@ -0,0 +1,27 @@
|
|||||||
|
period,dividend,net_profit,payout_ratio
|
||||||
|
2001,1.500000,3.282907,0.456912
|
||||||
|
2002,0.550000,3.767985,0.145967
|
||||||
|
2003,0.907500,5.867478,0.154666
|
||||||
|
2004,1.966250,8.205540,0.239625
|
||||||
|
2005,1.415700,11.577382,0.122282
|
||||||
|
2006,12.184458,15.448124,0.788734
|
||||||
|
2007,7.890168,28.308316,0.278723
|
||||||
|
2008,10.910328,37.994806,0.287153
|
||||||
|
2009,11.184030,43.081146,0.259604
|
||||||
|
2010,21.707400,50.511942,0.429748
|
||||||
|
2011,41.496055,87.631459,0.473529
|
||||||
|
2012,66.640774,133.080796,0.500754
|
||||||
|
2013,45.409993,151.366398,0.300000
|
||||||
|
2014,49.950993,153.498043,0.325418
|
||||||
|
2015,77.519966,155.030903,0.500029
|
||||||
|
2016,85.258145,167.183627,0.509967
|
||||||
|
2017,138.169196,270.793603,0.510238
|
||||||
|
2018,182.638598,352.036253,0.518806
|
||||||
|
2019,213.867676,412.064710,0.519015
|
||||||
|
2020,242.358242,466.972854,0.518999
|
||||||
|
2021,272.280873,525.811027,0.517830
|
||||||
|
2022,547.513811,627.164437,0.872999
|
||||||
|
2023,627.872784,747.340716,0.840143
|
||||||
|
2024,646.720000,862.281464,0.750010
|
||||||
|
2025,650.330000,823.200671,0.790002
|
||||||
|
2025,300.006375,646.267467,0.464214
|
||||||
|
@@ -0,0 +1,23 @@
|
|||||||
|
period,sales_expense,admin_expense,rd_expense,tax_surcharge,revenue,sales_expense_rate,admin_expense_rate,rd_expense_rate,tax_surcharge_rate
|
||||||
|
2004,,,,,,,,,
|
||||||
|
2005,,,,,,,,,
|
||||||
|
2006,,,,,,,,,
|
||||||
|
2007,,,,,,,,,
|
||||||
|
2008,,,,,,,,,
|
||||||
|
2009,,,,,,,,,
|
||||||
|
2010,,,,,,,,,
|
||||||
|
2011,,,,,,,,,
|
||||||
|
2012,,,,,,,,,
|
||||||
|
2013,,,,,,,,,
|
||||||
|
2014,,,,,,,,,
|
||||||
|
2015,,,,,,,,,
|
||||||
|
2016,,,,,,,,,
|
||||||
|
2017,,,,,,,,,
|
||||||
|
2018,,,,,,,,,
|
||||||
|
2019,,,,,,,,,
|
||||||
|
2020,,,,,,,,,
|
||||||
|
2021,,,,,,,,,
|
||||||
|
2022,,,,,,,,,
|
||||||
|
2023,,,,,,,,,
|
||||||
|
2024,,,,,,,,,
|
||||||
|
2025,,,,,,,,,
|
||||||
|
@@ -0,0 +1,27 @@
|
|||||||
|
period,sales_expense,admin_expense,rd_expense,tax_surcharge,revenue,gross_margin,sales_expense_rate,admin_expense_rate,rd_expense_rate,tax_surcharge_rate
|
||||||
|
2020Q1,,,,,,,,,,
|
||||||
|
2020Q2,,,,,,,,,,
|
||||||
|
2020Q3,,,,,,,,,,
|
||||||
|
2020Q4,,,,,,,,,,
|
||||||
|
2021Q1,,,,,,,,,,
|
||||||
|
2021Q2,,,,,,,,,,
|
||||||
|
2021Q3,,,,,,,,,,
|
||||||
|
2021Q4,,,,,,,,,,
|
||||||
|
2022Q1,,,,,,,,,,
|
||||||
|
2022Q2,,,,,,,,,,
|
||||||
|
2022Q3,,,,,,,,,,
|
||||||
|
2022Q4,,,,,,,,,,
|
||||||
|
2023Q1,,,,,,,,,,
|
||||||
|
2023Q2,,,,,,,,,,
|
||||||
|
2023Q3,,,,,,,,,,
|
||||||
|
2023Q4,,,,,,,,,,
|
||||||
|
2024Q1,,,,,,,,,,
|
||||||
|
2024Q2,,,,,,,,,,
|
||||||
|
2024Q3,,,,,,,,,,
|
||||||
|
2024Q4,,,,,,,,,,
|
||||||
|
2025Q1,,,,,,,,,,
|
||||||
|
2025Q2,,,,,,,,,,
|
||||||
|
2025Q3,,,,,,,,,,
|
||||||
|
2025Q4,,,,,,,,,,
|
||||||
|
2026Q1,,,,,,,,,,
|
||||||
|
2026Q2,,,,,,,,,,
|
||||||
|
@@ -0,0 +1,17 @@
|
|||||||
|
period,wholesale_price
|
||||||
|
2010,1000.000000
|
||||||
|
2011,1200.000000
|
||||||
|
2012,2300.000000
|
||||||
|
2013,1500.000000
|
||||||
|
2014,1000.000000
|
||||||
|
2015,850.000000
|
||||||
|
2016,1100.000000
|
||||||
|
2017,1800.000000
|
||||||
|
2018,2000.000000
|
||||||
|
2019,2600.000000
|
||||||
|
2020,2600.000000
|
||||||
|
2021,3100.000000
|
||||||
|
2022,3000.000000
|
||||||
|
2023,2900.000000
|
||||||
|
2024,2350.000000
|
||||||
|
2025,1485.000000
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
period,output,yoy
|
||||||
|
2006,397.100000,
|
||||||
|
2007,493.900000,
|
||||||
|
2008,569.300000,
|
||||||
|
2009,706.900000,
|
||||||
|
2010,890.800000,
|
||||||
|
2011,1025.600000,
|
||||||
|
2012,1153.200000,
|
||||||
|
2013,1226.200000,
|
||||||
|
2014,1257.100000,
|
||||||
|
2015,1312.800000,
|
||||||
|
2016,1358.400000,
|
||||||
|
2017,1198.100000,
|
||||||
|
2018,871.200000,
|
||||||
|
2019,786.000000,
|
||||||
|
2020,740.700000,
|
||||||
|
2021,715.600000,
|
||||||
|
2022,671.200000,
|
||||||
|
2023,449.200000,
|
||||||
|
2024,414.500000,
|
||||||
|
2025,354.900000,
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
period,before_price,after_price,increase_rate
|
||||||
|
2001-08,185.000000,218.000000,0.178000
|
||||||
|
2003-10,218.000000,268.000000,0.229000
|
||||||
|
2006-02,268.000000,308.000000,0.149000
|
||||||
|
2007-03,308.000000,358.000000,0.162000
|
||||||
|
2008-01,358.000000,439.000000,0.226000
|
||||||
|
2010-01,439.000000,499.000000,0.137000
|
||||||
|
2011-01,499.000000,619.000000,0.240000
|
||||||
|
2012-09,619.000000,819.000000,0.323000
|
||||||
|
2018-01,819.000000,969.000000,0.183000
|
||||||
|
2023-11,969.000000,1169.000000,0.206000
|
||||||
|
2026-03,1169.000000,1269.000000,0.086000
|
||||||
|
2026-07,1269.000000,1369.000000,0.079000
|
||||||
|
@@ -0,0 +1,11 @@
|
|||||||
|
period,moutai,series,moutai_share,series_share
|
||||||
|
2016,367.140000,21.270000,0.945238,0.054762
|
||||||
|
2017,523.940000,57.740000,0.900736,0.099264
|
||||||
|
2018,654.870000,80.770000,0.890204,0.109796
|
||||||
|
2019,758.020000,95.420000,0.888194,0.111806
|
||||||
|
2020,848.310000,99.910000,0.894634,0.105366
|
||||||
|
2021,934.650000,125.950000,0.881246,0.118754
|
||||||
|
2022,1078.340000,159.390000,0.871224,0.128776
|
||||||
|
2023,1265.890000,206.300000,0.859869,0.140131
|
||||||
|
2024,1459.280760,246.837621,0.855322,0.144678
|
||||||
|
2025,1464.999065,222.746787,0.868021,0.131979
|
||||||
|
@@ -0,0 +1,22 @@
|
|||||||
|
period,revenue,gross_profit,net_profit,gross_margin,revenue_yoy,net_profit_yoy
|
||||||
|
2005,39.310000,,11.190000,,,
|
||||||
|
2006,48.960000,,15.040000,,0.245485,0.344057
|
||||||
|
2007,72.370000,,28.310000,,0.478145,0.882314
|
||||||
|
2008,82.420000,,37.990000,,0.138870,0.341929
|
||||||
|
2009,96.700000,,43.120000,,0.173259,0.135036
|
||||||
|
2010,116.330000,,50.510000,,0.202999,0.171382
|
||||||
|
2011,184.020000,,87.630000,,0.581879,0.734904
|
||||||
|
2012,264.550000,,133.080000,,0.437615,0.518658
|
||||||
|
2013,309.220000,,151.370000,,0.168853,0.137436
|
||||||
|
2014,315.740000,,153.500000,,0.021085,0.014071
|
||||||
|
2015,326.600000,,155.030000,,0.034395,0.009967
|
||||||
|
2016,388.620000,,167.180000,0.912300,0.189896,0.078372
|
||||||
|
2017,582.180000,,270.790000,0.898000,0.498070,0.619751
|
||||||
|
2018,736.390000,,352.040000,0.911400,0.264884,0.300048
|
||||||
|
2019,854.300000,,412.060000,0.913000,0.160119,0.170492
|
||||||
|
2020,949.150000,867.390000,466.970000,0.914100,0.111027,0.133257
|
||||||
|
2021,1061.900000,972.070000,524.600000,0.915400,0.118790,0.123413
|
||||||
|
2022,1241.000000,1140.060000,627.160000,0.918700,0.168660,0.195501
|
||||||
|
2023,1476.940000,1358.260000,747.340000,0.919600,0.190121,0.191626
|
||||||
|
2024,1708.990000,1571.100000,862.280000,0.919300,0.157115,0.153799
|
||||||
|
2025,1688.380000,1539.460000,823.200000,0.911800,-0.012060,-0.045322
|
||||||
|
@@ -0,0 +1,53 @@
|
|||||||
|
period,revenue,gross_profit,net_profit,gross_margin,revenue_yoy,net_profit_yoy
|
||||||
|
2020Q1,244.050000,223.730000,130.940000,0.916700,,
|
||||||
|
2020Q1,20.320000,,,,-0.916738,
|
||||||
|
2020Q2,195.470000,178.280000,95.080000,0.912000,8.619587,
|
||||||
|
2020Q2,17.200000,,,,-0.912007,
|
||||||
|
2020Q3,232.620000,211.840000,112.250000,0.910600,12.524419,
|
||||||
|
2020Q3,20.790000,,,,-0.910627,
|
||||||
|
2020Q4,277.000000,253.770000,128.700000,0.916100,12.323713,
|
||||||
|
2020Q4,23.230000,,,,-0.916137,
|
||||||
|
2021Q1,272.710000,250.010000,139.540000,0.916800,10.739561,
|
||||||
|
2021Q1,22.700000,,,,-0.916761,
|
||||||
|
2021Q2,218.160000,198.540000,107.000000,0.910100,8.610573,
|
||||||
|
2021Q2,19.620000,,,,-0.910066,
|
||||||
|
2021Q3,255.550000,232.120000,126.120000,0.908300,12.024975,
|
||||||
|
2021Q3,23.430000,,,,-0.908315,
|
||||||
|
2021Q4,315.480000,291.400000,151.940000,0.923700,12.464789,
|
||||||
|
2021Q4,24.080000,,,,-0.923672,
|
||||||
|
2022Q1,322.960000,298.310000,172.450000,0.923700,12.411960,
|
||||||
|
2022Q1,24.650000,,,,-0.923675,
|
||||||
|
2022Q2,253.210000,232.400000,125.490000,0.917800,9.272211,
|
||||||
|
2022Q2,20.810000,,,,-0.917815,
|
||||||
|
2022Q3,295.430000,270.080000,146.060000,0.914200,13.196540,
|
||||||
|
2022Q3,25.360000,,,,-0.914159,
|
||||||
|
2022Q4,369.400000,339.280000,183.170000,0.918500,13.566246,
|
||||||
|
2022Q4,30.110000,,,,-0.918489,
|
||||||
|
2023Q1,387.560000,358.860000,207.950000,0.926000,11.871471,
|
||||||
|
2023Q1,28.700000,,,,-0.925947,
|
||||||
|
2023Q2,308.200000,279.830000,151.860000,0.908000,9.738676,
|
||||||
|
2023Q2,28.370000,,,,-0.907949,
|
||||||
|
2023Q3,336.920000,308.350000,168.960000,0.915200,10.875925,
|
||||||
|
2023Q3,28.570000,,,,-0.915202,
|
||||||
|
2023Q4,444.250000,411.220000,218.580000,0.925600,14.549527,
|
||||||
|
2023Q4,33.030000,,,,-0.925650,
|
||||||
|
2024Q1,457.760000,423.940000,240.650000,0.926100,12.858916,
|
||||||
|
2024Q1,33.810000,,,,-0.926140,
|
||||||
|
2024Q2,361.550000,327.860000,176.300000,0.906800,9.693582,
|
||||||
|
2024Q2,33.700000,,,,-0.906790,
|
||||||
|
2024Q3,388.450000,353.680000,191.320000,0.910500,10.526706,
|
||||||
|
2024Q3,34.770000,,,,-0.910490,
|
||||||
|
2024Q4,501.230000,465.620000,254.010000,0.928900,13.415588,
|
||||||
|
2024Q4,35.610000,,,,-0.928955,
|
||||||
|
2025Q1,506.010000,465.400000,268.470000,0.919700,13.209773,
|
||||||
|
2025Q1,40.610000,,,,-0.919745,
|
||||||
|
2025Q2,387.880000,350.720000,185.550000,0.904200,8.551342,
|
||||||
|
2025Q2,37.160000,,,,-0.904197,
|
||||||
|
2025Q3,390.640000,356.580000,192.240000,0.912800,9.512379,
|
||||||
|
2025Q3,34.070000,,,,-0.912784,
|
||||||
|
2025Q4,403.840000,366.760000,176.930000,0.908000,10.853243,
|
||||||
|
2025Q4,37.080000,,,,-0.908181,
|
||||||
|
2026Q1,539.090000,483.890000,272.430000,0.908000,13.538565,
|
||||||
|
2026Q1,55.210000,,,,-0.897587,
|
||||||
|
2026Q2,367.940000,328.400000,172.740000,,5.664372,
|
||||||
|
2026Q2,39.530000,,,,-0.892564,
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
period,moutai,series,domestic,overseas
|
||||||
|
2016H2,367.140000,21.270000,367.820000,20.590000
|
||||||
|
2017H1,216.270000,25.490000,233.340000,8.420000
|
||||||
|
2017H2,523.940000,57.740000,558.980000,22.700000
|
||||||
|
2018H1,293.830000,39.930000,323.450000,10.310000
|
||||||
|
2018H2,654.870000,80.770000,706.720000,28.930000
|
||||||
|
2019H1,347.950000,46.550000,383.680000,10.810000
|
||||||
|
2019H2,758.020000,95.420000,824.240000,29.200000
|
||||||
|
2020H1,392.610000,46.500000,428.100000,11.010000
|
||||||
|
2020H2,848.310000,99.910000,923.900000,24.320000
|
||||||
|
2021H1,429.490000,60.600000,478.100000,12.000000
|
||||||
|
2021H2,934.650000,125.950000,1034.410000,26.180000
|
||||||
|
2022H1,499.650000,75.980000,554.970000,20.660000
|
||||||
|
2022H2,1078.340000,159.390000,1195.330000,42.400000
|
||||||
|
2023H1,592.790000,100.740000,673.110000,20.420000
|
||||||
|
2023H2,1265.890000,206.300000,1428.690000,43.500000
|
||||||
|
2024H1,685.670000,131.470000,797.180000,22.130000
|
||||||
|
2024H2,1459.280000,246.840000,1654.230000,51.890000
|
||||||
|
2025H1,755.900000,137.630000,864.900000,28.990000
|
||||||
|
2025H2,1465.000000,222.750000,1639.240000,48.500000
|
||||||
|
2026H1,777.240000,129.340000,896.660000,10.370000
|
||||||
|
@@ -0,0 +1,9 @@
|
|||||||
|
period,moutai_revenue,series_revenue,moutai_volume,series_volume,moutai_price_per_ton,series_price_per_ton
|
||||||
|
2016,367.140000,21.270000,22918.000000,14027.000000,160.197225,15.163613
|
||||||
|
2017,523.940000,57.740000,30206.000000,29903.000000,173.455605,19.309099
|
||||||
|
2018,654.870000,80.770000,32464.000000,29774.000000,201.721907,27.127695
|
||||||
|
2019,758.020000,95.420000,34562.000000,30083.000000,219.321799,31.718911
|
||||||
|
2020,848.310000,99.910000,34313.000000,29743.000000,247.226999,33.591097
|
||||||
|
2021,934.650000,125.950000,36261.000000,30177.000000,257.756267,41.737085
|
||||||
|
2022,1078.340000,159.390000,37901.000000,30275.000000,284.514920,52.647399
|
||||||
|
2023,1265.890000,206.300000,42111.000000,31165.000000,300.607917,66.196053
|
||||||
|
@@ -0,0 +1,5 @@
|
|||||||
|
# 贵州茅台图表数据
|
||||||
|
|
||||||
|
本目录保留原始附件:年度与季度工作簿均不作编辑。图表使用的 `data/moutai/*.csv` 由 `scripts/normalize_moutai_financials.py` 生成。
|
||||||
|
|
||||||
|
口径说明:金额默认单位为人民币亿元;季度现金流由各披露累计值与同年度上一季度累计值相减得到单季金额;“分类营收”中的单季与累计数据分别保留,图表不混用两种口径。
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,13 @@
|
|||||||
|
period,total_assets,cash_like,receivables,investment,operating_assets
|
||||||
|
2020H1,17.89,8.22,0.41,0.46,8.80
|
||||||
|
2020H2,69.71,56.80,0.78,0.67,11.45
|
||||||
|
2021H1,76.41,57.67,1.35,1.78,15.60
|
||||||
|
2021H2,83.24,52.65,1.71,4.11,24.77
|
||||||
|
2022H1,85.90,51.63,1.32,5.53,27.42
|
||||||
|
2022H2,85.80,50.42,1.94,5.55,27.89
|
||||||
|
2023H1,90.65,55.40,2.09,5.75,27.42
|
||||||
|
2023H2,99.69,59.63,3.21,5.87,30.97
|
||||||
|
2024H1,110.17,70.10,2.64,5.50,31.93
|
||||||
|
2024H2,148.71,96.20,4.78,5.60,42.13
|
||||||
|
2025H1,213.57,137.66,9.72,5.40,60.79
|
||||||
|
2025H2,321.01,172.25,9.21,4.95,132.04
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,total_assets,cash_like,receivables,investment,operating_assets
|
||||||
|
2020FY,69.71,56.80,0.78,0.67,11.45
|
||||||
|
2021FY,83.24,52.65,1.71,4.11,24.77
|
||||||
|
2022FY,85.80,50.42,1.94,5.55,27.89
|
||||||
|
2023FY,99.69,59.63,3.21,5.87,30.97
|
||||||
|
2024FY,148.71,96.20,4.78,5.60,42.13
|
||||||
|
2025FY,321.01,172.25,9.21,4.95,132.04
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
period,total_assets,cash_like,receivables,investment,operating_assets
|
||||||
|
2020H1,17.89,8.22,0.41,0.46,8.80
|
||||||
|
2020H2,69.71,56.80,0.78,0.67,11.45
|
||||||
|
2021H1,76.41,57.67,1.35,1.78,15.60
|
||||||
|
2021H2,83.24,52.65,1.71,4.11,24.77
|
||||||
|
2022H1,85.90,51.63,1.32,5.53,27.42
|
||||||
|
2022H2,85.80,50.42,1.94,5.55,27.89
|
||||||
|
2023H1,90.65,55.40,2.09,5.75,27.42
|
||||||
|
2023H2,99.69,59.63,3.21,5.87,30.97
|
||||||
|
2024H1,110.17,70.10,2.64,5.50,31.93
|
||||||
|
2024H2,148.71,96.20,4.78,5.60,42.13
|
||||||
|
2025H1,213.57,137.66,9.72,5.40,60.79
|
||||||
|
2025H2,321.01,172.25,9.21,4.95,132.04
|
||||||
|
@@ -0,0 +1,19 @@
|
|||||||
|
period,operating_cash_flow,net_profit,cash_conversion
|
||||||
|
2020H1,1.22,1.41,86.5
|
||||||
|
2020H2,5.81,3.82,152.1
|
||||||
|
2020FY,7.03,5.23,134.4
|
||||||
|
2021H1,4.42,3.59,123.1
|
||||||
|
2021H2,3.37,4.96,68.1
|
||||||
|
2021FY,7.79,8.55,91.2
|
||||||
|
2022H1,3.74,3.33,112.2
|
||||||
|
2022H2,5.17,1.43,362.2
|
||||||
|
2022FY,8.91,4.76,187.3
|
||||||
|
2023H1,10.92,4.77,228.9
|
||||||
|
2023H2,8.98,6.12,146.9
|
||||||
|
2023FY,19.91,10.89,182.8
|
||||||
|
2024H1,19.05,9.64,197.6
|
||||||
|
2024H2,30.49,23.44,130.1
|
||||||
|
2024FY,49.54,33.08,149.7
|
||||||
|
2025H1,59.77,46.82,127.7
|
||||||
|
2025H2,48.88,83.30,58.7
|
||||||
|
2025FY,108.65,130.12,83.5
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,operating_cash_flow,net_profit,cash_conversion
|
||||||
|
2020FY,7.03,5.23,134.4
|
||||||
|
2021FY,7.79,8.55,91.2
|
||||||
|
2022FY,8.91,4.76,187.3
|
||||||
|
2023FY,19.91,10.89,182.8
|
||||||
|
2024FY,49.54,33.08,149.7
|
||||||
|
2025FY,108.65,130.12,83.5
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
period,operating_cash_flow,net_profit,cash_conversion
|
||||||
|
2020H1,1.22,1.41,86.5
|
||||||
|
2020H2,5.81,3.82,152.1
|
||||||
|
2021H1,4.42,3.59,123.1
|
||||||
|
2021H2,3.37,4.96,68.1
|
||||||
|
2022H1,3.74,3.33,112.2
|
||||||
|
2022H2,5.17,1.43,362.2
|
||||||
|
2023H1,10.92,4.77,228.9
|
||||||
|
2023H2,8.98,6.12,146.9
|
||||||
|
2024H1,19.05,9.64,197.6
|
||||||
|
2024H2,30.49,23.44,130.1
|
||||||
|
2025H1,59.77,46.82,127.7
|
||||||
|
2025H2,48.88,83.30,58.7
|
||||||
|
@@ -0,0 +1,19 @@
|
|||||||
|
period,operating_cash_flow,investing_cash_flow,financing_cash_flow,net_cash_increase
|
||||||
|
2020H1,1.22,-0.48,4.24,4.98
|
||||||
|
2020H2,5.81,-1.69,44.47,48.59
|
||||||
|
2020FY,7.03,-2.17,48.70,53.57
|
||||||
|
2021H1,4.42,-44.98,-1.21,-41.78
|
||||||
|
2021H2,3.37,38.50,-3.15,38.73
|
||||||
|
2021FY,7.79,-6.48,-4.36,-3.05
|
||||||
|
2022H1,3.74,-42.10,-4.81,-43.17
|
||||||
|
2022H2,5.17,-4.89,-6.97,-6.68
|
||||||
|
2022FY,8.91,-46.98,-11.77,-49.85
|
||||||
|
2023H1,10.92,0.82,-5.58,6.16
|
||||||
|
2023H2,8.98,1.52,-2.83,7.67
|
||||||
|
2023FY,19.91,2.34,-8.42,13.83
|
||||||
|
2024H1,19.05,3.34,-7.16,15.23
|
||||||
|
2024H2,30.49,-3.25,-2.43,24.82
|
||||||
|
2024FY,49.54,0.09,-9.59,40.05
|
||||||
|
2025H1,59.77,12.34,-14.05,58.07
|
||||||
|
2025H2,48.88,-22.23,-3.62,23.02
|
||||||
|
2025FY,108.65,-9.89,-17.67,81.09
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,operating_cash_flow,investing_cash_flow,financing_cash_flow,net_cash_increase
|
||||||
|
2020FY,7.03,-2.17,48.70,53.57
|
||||||
|
2021FY,7.79,-6.48,-4.36,-3.05
|
||||||
|
2022FY,8.91,-46.98,-11.77,-49.85
|
||||||
|
2023FY,19.91,2.34,-8.42,13.83
|
||||||
|
2024FY,49.54,0.09,-9.59,40.05
|
||||||
|
2025FY,108.65,-9.89,-17.67,81.09
|
||||||
|
@@ -0,0 +1,13 @@
|
|||||||
|
period,operating_cash_flow,investing_cash_flow,financing_cash_flow,net_cash_increase
|
||||||
|
2020H1,1.22,-0.48,4.24,4.98
|
||||||
|
2020H2,5.81,-1.69,44.47,48.59
|
||||||
|
2021H1,4.42,-44.98,-1.21,-41.78
|
||||||
|
2021H2,3.37,38.50,-3.15,38.73
|
||||||
|
2022H1,3.74,-42.10,-4.81,-43.17
|
||||||
|
2022H2,5.17,-4.89,-6.97,-6.68
|
||||||
|
2023H1,10.92,0.82,-5.58,6.16
|
||||||
|
2023H2,8.98,1.52,-2.83,7.67
|
||||||
|
2024H1,19.05,3.34,-7.16,15.23
|
||||||
|
2024H2,30.49,-3.25,-2.43,24.82
|
||||||
|
2025H1,59.77,12.34,-14.05,58.07
|
||||||
|
2025H2,48.88,-22.23,-3.62,23.02
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,plush,figure,mega,other
|
||||||
|
2024H1,4.46,26.57,5.86,8.69
|
||||||
|
2024H2,23.86,42.79,10.98,7.17
|
||||||
|
2024FY,28.32,69.36,16.84,15.86
|
||||||
|
2025H1,61.39,51.76,10.07,15.54
|
||||||
|
2025H2,125.69,68.47,9.09,29.19
|
||||||
|
2025FY,187.08,120.23,19.16,44.73
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,plush,figure,mega,other
|
||||||
|
2024FY,28.32,69.36,16.84,15.86
|
||||||
|
2025FY,187.08,120.23,19.16,44.73
|
||||||
|
@@ -0,0 +1,5 @@
|
|||||||
|
period,plush,figure,mega,other
|
||||||
|
2024H1,4.46,26.57,5.86,8.69
|
||||||
|
2024H2,23.86,42.79,10.98,7.17
|
||||||
|
2025H1,61.39,51.76,10.07,15.54
|
||||||
|
2025H2,125.69,68.47,9.09,29.19
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024H1,0.9,0.1,0.3,0.1,0.0,0.2,0.2,1.83
|
||||||
|
2024H2,2.5,0.3,1.6,0.9,0.0,0.5,0.4,6.19
|
||||||
|
2024FY,3.4,0.4,1.9,1.1,0.0,0.7,0.6,8.02
|
||||||
|
2025H1,7.4,1.1,8.9,3.1,0.0,1.3,1.0,22.65
|
||||||
|
2025H2,12.7,1.3,19.8,7.3,0.0,3.2,1.2,45.42
|
||||||
|
2025FY,20.0,2.3,28.7,10.4,0.0,4.4,2.2,68.07
|
||||||
|
2026H1,9.0,1.0,4.9,0.0,1.7,0.6,1.6,18.91
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024FY,3.4,0.4,1.9,1.1,0.0,0.7,0.6,8.02
|
||||||
|
2025FY,20.0,2.3,28.7,10.4,0.0,4.4,2.2,68.07
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024H1,0.9,0.1,0.3,0.1,0.0,0.2,0.2,1.83
|
||||||
|
2024H2,2.5,0.3,1.6,0.9,0.0,0.5,0.4,6.19
|
||||||
|
2025H1,7.4,1.1,8.9,3.1,0.0,1.3,1.0,22.65
|
||||||
|
2025H2,12.7,1.3,19.8,7.3,0.0,3.2,1.2,45.42
|
||||||
|
2026H1,9.0,1.0,4.9,0.0,1.7,0.6,1.6,18.91
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024H1,4.8,0.2,0.4,0.4,0.8,1.3,7.97
|
||||||
|
2024H2,11.8,0.2,2.6,2.4,3.0,3.0,23.13
|
||||||
|
2024FY,16.7,0.4,3.0,2.9,3.8,4.3,31.10
|
||||||
|
2025H1,14.9,0.3,3.1,2.8,4.8,2.6,28.51
|
||||||
|
2025H2,28.3,0.6,11.4,2.9,5.5,2.9,51.60
|
||||||
|
2025FY,43.2,0.9,14.6,5.7,10.3,5.4,80.11
|
||||||
|
2026H1,17.2,0.6,3.4,1.1,2.0,1.6,25.76
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024FY,16.7,0.4,3.0,2.9,3.8,4.3,31.10
|
||||||
|
2025FY,43.2,0.9,14.6,5.7,10.3,5.4,80.11
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024H1,4.8,0.2,0.4,0.4,0.8,1.3,7.97
|
||||||
|
2024H2,11.8,0.2,2.6,2.4,3.0,3.0,23.13
|
||||||
|
2025H1,14.9,0.3,3.1,2.8,4.8,2.6,28.51
|
||||||
|
2025H2,28.3,0.6,11.4,2.9,5.5,2.9,51.60
|
||||||
|
2026H1,17.2,0.6,3.4,1.1,2.0,1.6,25.76
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024H1,20.0,3.4,4.0,2.0,2.1,1.3,2.4,35.22
|
||||||
|
2024H2,26.0,4.1,7.2,4.3,3.9,3.0,5.2,53.65
|
||||||
|
2024FY,46.0,7.5,11.1,6.3,6.0,4.3,7.6,88.87
|
||||||
|
2025H1,44.1,6.8,11.3,6.6,5.6,5.9,2.6,82.82
|
||||||
|
2025H2,56.7,6.7,23.0,11.3,10.3,11.3,6.5,125.69
|
||||||
|
2025FY,100.8,13.5,34.2,17.9,15.9,17.2,9.1,208.51
|
||||||
|
2026H1,60.9,7.8,20.6,9.0,9.8,8.4,5.5,122.00
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024FY,46.0,7.5,11.1,6.3,6.0,4.3,7.6,88.87
|
||||||
|
2025FY,100.8,13.5,34.2,17.9,15.9,17.2,9.1,208.51
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024H1,20.0,3.4,4.0,2.0,2.1,1.3,2.4,35.22
|
||||||
|
2024H2,26.0,4.1,7.2,4.3,3.9,3.0,5.2,53.65
|
||||||
|
2025H1,44.1,6.8,11.3,6.6,5.6,5.9,2.6,82.82
|
||||||
|
2025H2,56.7,6.7,23.0,11.3,10.3,11.3,6.5,125.69
|
||||||
|
2026H1,60.9,7.8,20.6,9.0,9.8,8.4,5.5,122.00
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024H1,0.4,0.0,0.0,0.1,0.1,0.58
|
||||||
|
2024H2,1.2,0.0,0.2,0.2,0.2,1.81
|
||||||
|
2024FY,1.6,0.0,0.2,0.3,0.3,2.39
|
||||||
|
2025H1,2.7,0.0,0.8,0.8,0.4,4.77
|
||||||
|
2025H2,5.8,0.1,2.3,1.1,0.4,9.74
|
||||||
|
2025FY,8.6,0.2,3.2,1.9,0.7,14.51
|
||||||
|
2026H1,4.0,0.1,0.5,0.1,0.2,5.06
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024FY,1.6,0.0,0.2,0.3,0.3,2.39
|
||||||
|
2025FY,8.6,0.2,3.2,1.9,0.7,14.51
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024H1,0.4,0.0,0.0,0.1,0.1,0.58
|
||||||
|
2024H2,1.2,0.0,0.2,0.2,0.2,1.81
|
||||||
|
2025H1,2.7,0.0,0.8,0.8,0.4,4.77
|
||||||
|
2025H2,5.8,0.1,2.3,1.1,0.4,9.74
|
||||||
|
2026H1,4.0,0.1,0.5,0.1,0.2,5.06
|
||||||
|
@@ -0,0 +1,20 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue,revenue_yoy
|
||||||
|
2020H1,3.13,3.34,1.05,0.64,8.18,50.5
|
||||||
|
2020H2,6.89,6.18,2.23,1.44,16.96,48.7
|
||||||
|
2020FY,10.02,9.52,3.29,2.07,25.13,49.3
|
||||||
|
2021H1,6.75,6.78,2.28,1.91,17.73,116.8
|
||||||
|
2021H2,9.98,12.01,2.42,2.53,27.18,60.3
|
||||||
|
2021FY,16.73,18.79,4.70,4.45,44.91,78.7
|
||||||
|
2022H1,9.26,10.13,2.08,2.12,23.59,33.1
|
||||||
|
2022H2,9.00,9.07,1.86,2.65,22.59,-16.9
|
||||||
|
2022FY,18.27,19.20,3.94,4.77,46.17,2.8
|
||||||
|
2023H1,13.44,8.74,2.96,2.99,28.14,19.3
|
||||||
|
2023H2,17.18,9.92,3.10,4.68,34.87,54.4
|
||||||
|
2023FY,30.62,18.66,6.06,7.67,63.01,36.5
|
||||||
|
2024H1,23.65,13.43,3.68,4.82,45.58,62.0
|
||||||
|
2024H2,44.01,28.10,4.63,8.06,84.80,143.2
|
||||||
|
2024FY,67.66,41.53,8.31,12.88,130.38,106.9
|
||||||
|
2025H1,69.08,54.98,8.21,6.50,138.76,204.4
|
||||||
|
2025H2,103.46,109.36,8.69,10.93,232.44,174.1
|
||||||
|
2025FY,172.54,164.34,16.89,17.42,371.20,184.7
|
||||||
|
2026H1,91.12,62.12,9.51,8.98,171.73,23.8
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue,revenue_yoy
|
||||||
|
2020FY,10.02,9.52,3.29,2.07,25.13,49.3
|
||||||
|
2021FY,16.73,18.79,4.70,4.45,44.91,78.7
|
||||||
|
2022FY,18.27,19.20,3.94,4.77,46.17,2.8
|
||||||
|
2023FY,30.62,18.66,6.06,7.67,63.01,36.5
|
||||||
|
2024FY,67.66,41.53,8.31,12.88,130.38,106.9
|
||||||
|
2025FY,172.54,164.34,16.89,17.42,371.20,184.7
|
||||||
|
@@ -0,0 +1,14 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue,revenue_yoy
|
||||||
|
2020H1,3.13,3.34,1.05,0.64,8.18,50.5
|
||||||
|
2020H2,6.89,6.18,2.23,1.44,16.96,48.7
|
||||||
|
2021H1,6.75,6.78,2.28,1.91,17.73,116.8
|
||||||
|
2021H2,9.98,12.01,2.42,2.53,27.18,60.3
|
||||||
|
2022H1,9.26,10.13,2.08,2.12,23.59,33.1
|
||||||
|
2022H2,9.00,9.07,1.86,2.65,22.59,-16.9
|
||||||
|
2023H1,13.44,8.74,2.96,2.99,28.14,19.3
|
||||||
|
2023H2,17.18,9.92,3.10,4.68,34.87,54.4
|
||||||
|
2024H1,23.65,13.43,3.68,4.82,45.58,62.0
|
||||||
|
2024H2,44.01,28.10,4.63,8.06,84.80,143.2
|
||||||
|
2025H1,69.08,54.98,8.21,6.50,138.76,204.4
|
||||||
|
2025H2,103.46,109.36,8.69,10.93,232.44,174.1
|
||||||
|
2026H1,91.12,62.12,9.51,8.98,171.73,23.8
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue
|
||||||
|
2024H1,57.4,25.9,8.1,8.6,45.59
|
||||||
|
2024H2,49.0,35.2,5.4,10.4,84.78
|
||||||
|
2024FY,51.9,31.9,6.4,9.8,130.37
|
||||||
|
2025H1,49.8,39.6,5.9,4.7,138.75
|
||||||
|
2025H2,44.5,47.0,3.7,4.7,232.45
|
||||||
|
2025FY,46.5,44.3,4.6,4.7,371.20
|
||||||
|
2026H1,53.1,36.2,5.5,5.2,171.74
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024H1,47.5,7.1,15.8,8.2,0.0,10.9,10.4,1.83
|
||||||
|
2024H2,41.0,4.0,26.3,15.0,0.0,7.3,6.3,6.19
|
||||||
|
2024FY,42.5,4.7,23.9,13.5,0.0,8.1,7.2,8.02
|
||||||
|
2025H1,32.5,4.6,39.2,13.9,0.0,5.5,4.2,22.65
|
||||||
|
2025H2,27.9,2.8,43.7,16.0,0.0,7.0,2.7,45.42
|
||||||
|
2025FY,29.4,3.4,42.2,15.3,0.0,6.5,3.2,68.07
|
||||||
|
2026H1,47.8,5.5,26.0,0.0,8.9,3.3,8.6,18.91
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024FY,42.5,4.7,23.9,13.5,0.0,8.1,7.2,8.02
|
||||||
|
2025FY,29.4,3.4,42.2,15.3,0.0,6.5,3.2,68.07
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,tiktok,amazon,online_other,wholesale,total_revenue
|
||||||
|
2024H1,47.5,7.1,15.8,8.2,0.0,10.9,10.4,1.83
|
||||||
|
2024H2,41.0,4.0,26.3,15.0,0.0,7.3,6.3,6.19
|
||||||
|
2025H1,32.5,4.6,39.2,13.9,0.0,5.5,4.2,22.65
|
||||||
|
2025H2,27.9,2.8,43.7,16.0,0.0,7.0,2.7,45.42
|
||||||
|
2026H1,47.8,5.5,26.0,0.0,8.9,3.3,8.6,18.91
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue
|
||||||
|
2024FY,51.9,31.9,6.4,9.8,130.37
|
||||||
|
2025FY,46.5,44.3,4.6,4.7,371.20
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024H1,60.9,2.1,5.0,5.1,10.7,16.2,7.97
|
||||||
|
2024H2,51.1,1.0,11.5,10.5,12.8,13.0,23.13
|
||||||
|
2024FY,53.6,1.3,9.8,9.2,12.3,13.8,31.10
|
||||||
|
2025H1,52.4,1.2,11.0,9.9,16.7,9.0,28.51
|
||||||
|
2025H2,54.8,1.2,22.2,5.6,10.7,5.6,51.60
|
||||||
|
2025FY,53.9,1.2,18.2,7.1,12.8,6.8,80.11
|
||||||
|
2026H1,66.6,2.2,13.1,4.2,7.7,6.2,25.76
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024FY,53.6,1.3,9.8,9.2,12.3,13.8,31.10
|
||||||
|
2025FY,53.9,1.2,18.2,7.1,12.8,6.8,80.11
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,shopee,online_other,wholesale,total_revenue
|
||||||
|
2024H1,60.9,2.1,5.0,5.1,10.7,16.2,7.97
|
||||||
|
2024H2,51.1,1.0,11.5,10.5,12.8,13.0,23.13
|
||||||
|
2025H1,52.4,1.2,11.0,9.9,16.7,9.0,28.51
|
||||||
|
2025H2,54.8,1.2,22.2,5.6,10.7,5.6,51.60
|
||||||
|
2026H1,66.6,2.2,13.1,4.2,7.7,6.2,25.76
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024H1,56.9,9.6,11.3,5.7,5.9,3.8,6.8,35.22
|
||||||
|
2024H2,48.4,7.7,13.3,8.0,7.3,5.5,9.8,53.65
|
||||||
|
2024FY,51.8,8.5,12.5,7.1,6.8,4.8,8.6,88.87
|
||||||
|
2025H1,53.2,8.2,13.6,7.9,6.8,7.2,3.2,82.82
|
||||||
|
2025H2,45.1,5.3,18.3,9.0,8.2,9.0,5.1,125.69
|
||||||
|
2025FY,48.3,6.5,16.4,8.6,7.6,8.3,4.4,208.51
|
||||||
|
2026H1,49.9,6.4,16.9,7.4,8.0,6.9,4.5,122.00
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024FY,51.8,8.5,12.5,7.1,6.8,4.8,8.6,88.87
|
||||||
|
2025FY,48.3,6.5,16.4,8.6,7.6,8.3,4.4,208.51
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,roboshop,tmall,douyin,online_other,wholesale,total_revenue
|
||||||
|
2024H1,56.9,9.6,11.3,5.7,5.9,3.8,6.8,35.22
|
||||||
|
2024H2,48.4,7.7,13.3,8.0,7.3,5.5,9.8,53.65
|
||||||
|
2025H1,53.2,8.2,13.6,7.9,6.8,7.2,3.2,82.82
|
||||||
|
2025H2,45.1,5.3,18.3,9.0,8.2,9.0,5.1,125.69
|
||||||
|
2026H1,49.9,6.4,16.9,7.4,8.0,6.9,4.5,122.00
|
||||||
|
@@ -0,0 +1,8 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024H1,70.7,1.7,1.7,17.2,8.6,0.58
|
||||||
|
2024H2,64.1,0.6,11.0,13.3,11.0,1.81
|
||||||
|
2024FY,65.7,0.8,8.8,14.2,10.5,2.39
|
||||||
|
2025H1,57.0,0.8,17.8,16.8,7.5,4.77
|
||||||
|
2025H2,60.0,1.3,23.7,11.2,3.8,9.74
|
||||||
|
2025FY,59.0,1.2,21.8,13.0,5.0,14.51
|
||||||
|
2026H1,79.6,2.2,10.5,3.0,4.7,5.06
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024FY,65.7,0.8,8.8,14.2,10.5,2.39
|
||||||
|
2025FY,59.0,1.2,21.8,13.0,5.0,14.51
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,robot_store,own_app,online_other,wholesale,total_revenue
|
||||||
|
2024H1,70.7,1.7,1.7,17.2,8.6,0.58
|
||||||
|
2024H2,64.1,0.6,11.0,13.3,11.0,1.81
|
||||||
|
2025H1,57.0,0.8,17.8,16.8,7.5,4.77
|
||||||
|
2025H2,60.0,1.3,23.7,11.2,3.8,9.74
|
||||||
|
2026H1,79.6,2.2,10.5,3.0,4.7,5.06
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
period,retail,online,robot_store,wholesale,total_revenue
|
||||||
|
2024H1,57.4,25.9,8.1,8.6,45.59
|
||||||
|
2024H2,49.0,35.2,5.4,10.4,84.78
|
||||||
|
2025H1,49.8,39.6,5.9,4.7,138.75
|
||||||
|
2025H2,44.5,47.0,3.7,4.7,232.45
|
||||||
|
2026H1,53.1,36.2,5.5,5.2,171.74
|
||||||
|
@@ -0,0 +1,20 @@
|
|||||||
|
period,core_margin
|
||||||
|
2020H1,22.6
|
||||||
|
2020H2,29.4
|
||||||
|
2020FY,27.2
|
||||||
|
2021H1,25.8
|
||||||
|
2021H2,23.5
|
||||||
|
2021FY,24.4
|
||||||
|
2022H1,15.0
|
||||||
|
2022H2,6.3
|
||||||
|
2022FY,10.8
|
||||||
|
2023H1,17.4
|
||||||
|
2023H2,19.0
|
||||||
|
2023FY,18.3
|
||||||
|
2024H1,24.8
|
||||||
|
2024H2,35.1
|
||||||
|
2024FY,31.5
|
||||||
|
2025H1,41.8
|
||||||
|
2025H2,47.8
|
||||||
|
2025FY,45.6
|
||||||
|
2026H1,41.4
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,core_margin
|
||||||
|
2020FY,27.2
|
||||||
|
2021FY,24.4
|
||||||
|
2022FY,10.8
|
||||||
|
2023FY,18.3
|
||||||
|
2024FY,31.5
|
||||||
|
2025FY,45.6
|
||||||
|
@@ -0,0 +1,14 @@
|
|||||||
|
period,core_margin
|
||||||
|
2020H1,22.6
|
||||||
|
2020H2,29.4
|
||||||
|
2021H1,25.8
|
||||||
|
2021H2,23.5
|
||||||
|
2022H1,15.0
|
||||||
|
2022H2,6.3
|
||||||
|
2023H1,17.4
|
||||||
|
2023H2,19.0
|
||||||
|
2024H1,24.8
|
||||||
|
2024H2,35.1
|
||||||
|
2025H1,41.8
|
||||||
|
2025H2,47.8
|
||||||
|
2026H1,41.4
|
||||||
|
@@ -0,0 +1,20 @@
|
|||||||
|
period,core_profit,yoy
|
||||||
|
2020H1,1.85,25.2
|
||||||
|
2020H2,4.99,14.4
|
||||||
|
2020FY,6.84,17.1
|
||||||
|
2021H1,4.58,147.3
|
||||||
|
2021H2,6.37,27.7
|
||||||
|
2021FY,10.95,60.1
|
||||||
|
2022H1,3.54,-22.5
|
||||||
|
2022H2,1.43,-77.6
|
||||||
|
2022FY,4.98,-54.6
|
||||||
|
2023H1,4.89,37.9
|
||||||
|
2023H2,6.63,363.8
|
||||||
|
2023FY,11.52,131.6
|
||||||
|
2024H1,11.31,131.5
|
||||||
|
2024H2,29.79,349.1
|
||||||
|
2024FY,41.10,256.8
|
||||||
|
2025H1,57.98,412.4
|
||||||
|
2025H2,111.14,273.1
|
||||||
|
2025FY,169.12,311.5
|
||||||
|
2026H1,71.08,22.6
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,core_profit,yoy
|
||||||
|
2020FY,6.84,17.1
|
||||||
|
2021FY,10.95,60.1
|
||||||
|
2022FY,4.98,-54.6
|
||||||
|
2023FY,11.52,131.6
|
||||||
|
2024FY,41.10,256.8
|
||||||
|
2025FY,169.12,311.5
|
||||||
|
@@ -0,0 +1,14 @@
|
|||||||
|
period,core_profit,yoy
|
||||||
|
2020H1,1.85,25.2
|
||||||
|
2020H2,4.99,14.4
|
||||||
|
2021H1,4.58,147.3
|
||||||
|
2021H2,6.37,27.7
|
||||||
|
2022H1,3.54,-22.5
|
||||||
|
2022H2,1.43,-77.6
|
||||||
|
2023H1,4.89,37.9
|
||||||
|
2023H2,6.63,363.8
|
||||||
|
2024H1,11.31,131.5
|
||||||
|
2024H2,29.79,349.1
|
||||||
|
2025H1,57.98,412.4
|
||||||
|
2025H2,111.14,273.1
|
||||||
|
2026H1,71.08,22.6
|
||||||
|
@@ -0,0 +1,20 @@
|
|||||||
|
period,sales_expense,admin_expense,financial_expense,four_expense_rate
|
||||||
|
2020H1,2.23,1.25,0.04,43.1
|
||||||
|
2020H2,4.07,1.55,0.05,33.4
|
||||||
|
2020FY,6.30,2.80,0.09,36.6
|
||||||
|
2021H1,4.20,2.40,-0.06,36.9
|
||||||
|
2021H2,6.86,3.18,-0.02,36.9
|
||||||
|
2021FY,11.06,5.58,-0.07,36.9
|
||||||
|
2022H1,6.93,3.23,-0.07,42.8
|
||||||
|
2022H2,7.78,3.64,-0.22,49.5
|
||||||
|
2022FY,14.71,6.86,-0.29,46.1
|
||||||
|
2023H1,8.78,3.31,-0.63,40.7
|
||||||
|
2023H2,11.26,3.76,-0.88,40.5
|
||||||
|
2023FY,20.05,7.07,-1.52,40.6
|
||||||
|
2024H1,13.53,4.34,-0.84,37.4
|
||||||
|
2024H2,22.97,5.13,-0.80,32.2
|
||||||
|
2024FY,36.50,9.47,-1.63,34.0
|
||||||
|
2025H1,31.93,7.70,-0.66,28.1
|
||||||
|
2025H2,48.90,10.00,-0.11,25.3
|
||||||
|
2025FY,80.82,17.70,-0.76,26.3
|
||||||
|
2026H1,39.31,9.27,-0.11,28.2
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
period,sales_expense,admin_expense,financial_expense,four_expense_rate
|
||||||
|
2020FY,6.30,2.80,0.09,36.6
|
||||||
|
2021FY,11.06,5.58,-0.07,36.9
|
||||||
|
2022FY,14.71,6.86,-0.29,46.1
|
||||||
|
2023FY,20.05,7.07,-1.52,40.6
|
||||||
|
2024FY,36.50,9.47,-1.63,34.0
|
||||||
|
2025FY,80.82,17.70,-0.76,26.3
|
||||||
|
@@ -0,0 +1,14 @@
|
|||||||
|
period,sales_expense,admin_expense,financial_expense,four_expense_rate
|
||||||
|
2020H1,2.23,1.25,0.04,43.1
|
||||||
|
2020H2,4.07,1.55,0.05,33.4
|
||||||
|
2021H1,4.20,2.40,-0.06,36.9
|
||||||
|
2021H2,6.86,3.18,-0.02,36.9
|
||||||
|
2022H1,6.93,3.23,-0.07,42.8
|
||||||
|
2022H2,7.78,3.64,-0.22,49.5
|
||||||
|
2023H1,8.78,3.31,-0.63,40.7
|
||||||
|
2023H2,11.26,3.76,-0.88,40.5
|
||||||
|
2024H1,13.53,4.34,-0.84,37.4
|
||||||
|
2024H2,22.97,5.13,-0.80,32.2
|
||||||
|
2025H1,31.93,7.70,-0.66,28.1
|
||||||
|
2025H2,48.90,10.00,-0.11,25.3
|
||||||
|
2026H1,39.31,9.27,-0.11,28.2
|
||||||
|
@@ -0,0 +1,20 @@
|
|||||||
|
period,non_gaap_net_profit,gross_profit,revenue,cost
|
||||||
|
2020H1,24.4,61.4,50.5,33.6
|
||||||
|
2020H2,33.1,39.6,48.7,67.0
|
||||||
|
2020FY,30.9,46.2,49.3,55.0
|
||||||
|
2021H1,208.0,109.4,116.8,130.5
|
||||||
|
2021H2,26.1,54.8,60.3,69.5
|
||||||
|
2021FY,69.6,73.1,78.7,88.4
|
||||||
|
2022H1,-13.5,22.7,33.1,50.8
|
||||||
|
2022H2,-65.2,-21.8,-16.9,-9.5
|
||||||
|
2022FY,-42.7,-3.8,2.8,13.3
|
||||||
|
2023H1,42.3,23.9,19.3,12.9
|
||||||
|
2023H2,232.1,68.7,54.4,35.6
|
||||||
|
2023FY,107.6,45.6,36.5,24.2
|
||||||
|
2024H1,90.1,71.9,62.0,46.9
|
||||||
|
2024H2,264.1,167.3,143.2,103.7
|
||||||
|
2024FY,185.9,125.4,106.9,77.7
|
||||||
|
2025H1,362.8,234.4,204.4,151.1
|
||||||
|
2025H2,251.0,193.7,174.1,131.9
|
||||||
|
2025FY,284.5,207.4,184.7,139.1
|
||||||
|
2026H1,9.5,22.6,23.8,26.5
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user