首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
287 阅读
2
从零开始配置 vim(15)——状态栏配置
169 阅读
3
nvim番外之将配置的插件管理器更新为lazy
159 阅读
4
2018总结与2019规划
145 阅读
5
PDF标准详解(五)——图形状态
121 阅读
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
登录
Search
标签搜索
c++
c
学习笔记
emacs
windows
elisp
文本操作术
编辑器
NeoVim
Vim
win32
读书笔记
VimScript
linux
文本编辑器
投资理财
Java
反汇编
OLEDB
数据库编程
Masimaro
累计撰写
442
篇文章
累计收到
32
条评论
首页
栏目
软件与环境配置
读书笔记
编程
Thinking
FIRE
菜谱
翻译
页面
归档
友情链接
关于
搜索到
442
篇与
的结果
2026-08-04
《elisp 每日一练》—— Region
在关于保存和恢复现场的例子中,我们了解了 marker 相关的概念。 marker 与 point 都是一个表示位置的整数,不同的是marker 是动态的,由Emacs 内部根据buffer内容变化进行维护,而 point 是静态的。它们两个结合可以构成我们今天要讨论的内容——Region知识铺垫在图形界面编辑器中,我们经常用鼠标拖拽高亮一段文字,这叫“选中文本”。而在 Emacs 中,这个概念叫 Region(选区)。Region 是一个区间,它由 marker 和 point 组成的闭区间。我们可以使用这样一个公式来描述区间的组成: $\text{Region} = [\min(\text{point}, \text{mark}), \max(\text{point}, \text{mark})]$也就是说,起始位置是从 marker 和当前 point 中找到最小值,终点位置是二者的最大值。所以我们需要注意,在编写有关 Region 的代码时绝对不能假设使用 marker 或者 point 作为起点,或者终点。实际上为了解决这个问题,Emacs 提供了两个函数 region-beginning 和 region-end 来获取Region的开始和结束位置我们如何激活一个区域呢?可以通过 activate-mark 函数来激活当前选取。又或者可以通过 push-mark 在创建 marker 的同时进行激活。实际上 push-mark 的函数原形为:(push-mark &optional LOCATION NOMSG ACTIVATE)后面几个参数是可选的,它们分别代表:LOCATION: 表示作为新 marker 位置的 point 值,默认是当前光标所在位置NOMSG : 是否在minibuffer 中显示 Mark set 字样, 默认为 nil 也就是不显示ACTIVATE : 是否激活当前 Region,默认为 nil 不激活我们可以用一个例子测试一下(defun my/select-whole-buffer() (interactive) (goto-char (point-min)) (push-mark (point-max) nil t))上述例子我们将整个buffer的内容进行全选。另外,在操作 Region 时我们经常需要判断当前 Region 是否出于激活状态。因为前面介绍过实际上 marker 和 point 天然就构成一个 Region。如果不进行判断,用户想要进行某些操作时会出现不可预料的情况。例如如果用户想在选中区域进行查找,或者在当前行查找,如果不进行判断,有可能用户没有进行选区操作但是查找时却因为隐藏的region 导致查找发生在region中我们可以通过 use-region-p 来判断用户是否激活了选取练习我们实现一个函数,如果用户选择了一个区域,那么将区域中的所有字母大写,否则将光标所在单词的字母转换为大写。将单个单词大写可以使用函数 upcase-region,而将单词大写可以使用 upcase-word。upcase-region 接收一个起始位置和结束位置,将这个区间内的字母都转化为大写upcase-word 接收一个整数,表示将光标所在位置之后(正数)、或者之前(负数参数)的多少个单词转化为大写upcase-word 仅仅只能将光标所在位置到单词结尾位置的字母大写,我们还需要一个方法来获取单词首部,然后通过 goto-char 的方式移动光标到词首,最后执行 upcase-word。当然有了范围也可以使用 upcase-region获取光标所在单词的范围可以使用 bounds-of-thing-at-point。他的函数原形如下:(bounds-of-thing-at-point THING)它支持的 THING 非常多,有 word 、list、symbol、number、filename 等等。这里我们使用 word 就行。它返回的格式是 (START . END)。结合之前介绍的CELL的操作就可以获得START 的值。我们可以做一个快速选择光标所在单词的函数来看看它的用法(defun my/select-the-word() (interactive) (let ((bound (bounds-of-thing-at-point 'word))) (progn (goto-char (car bound)) (push-mark (cdr bound)) (activate-mark))))这里我们确实需要改变mark栈来和当前光标位置组成一个新的区域,所以不适合使用 save-excursion 来保存和还原现场。另外这里也演示了如何通过 activate-mark 来激活一个选区。有了这些函数的辅助,最终我的实现如下:(defun my/upcase-target() (interactive) (if (use-region-p) ;;用户选中区域,转换区域内文本 (upcase-region (region-beginning) (region-end)) ;;用户未选中文本,直接转换单词 (save-excursion ;; 考虑保存和恢复现场 (let ((bound (bounds-of-thing-at-point 'word))) (if bound (progn (goto-char (car bound)) (upcase-word 1)))))))至于如何使用 upcase-region 来实现将光标所在单词转化为大写的功能,读者可以自行尝试。总结本篇我们了解了 Region 的概念,以及可以使用Region做一些事情。后续很多高级的功能都可以依赖region 来实现,例如在选区中搜索、替换文本。今天介绍的函数有:region-beginning 和 region-end 获取选区的区间activate-mark 激活选区use-region-p 判断选区是否激活upcase-word 将光标所在位置之后的单词转化为大写upcase-region 将对应区间的单词转化为大写bounds-of-thing-at-point 获取指定事物所在的区间
2026年08月04日
8 阅读
0 评论
0 点赞
2026-08-03
《elisp 每日一练》——现场保护与还原
在第二天里面,我们介绍了光标移动和行索引区间的api函数,并且学会了如何移动光标。实际上在操作Emacs进行文本编译的动作时很多时候都在移动光标,只是我们感觉不到。如果我们随意的移动光标就容易带来一个问题,我们执行某个操作之后找不到光标在哪了,如果我们还要花时间找光标在哪,就很浪费效率背景知识铺垫如果我们自己实现一个简单的版本,我们可能会考虑使用 let ((old-point (point))) 这样的语句来先保存最后通过 (goto-char old-point) 来进行设置。这个思路是对的,但是它主要的问题是point记录的是当前位置的索引,如果我们在当前光标位置之前插入了字符串改变了光标所在文本的索引,那么根据之前保存的位置值就是一个错误的值。为了解决上一个问题,Emacs引入了 marker 的概念。与 point 不同,marker 是指向 Buffer 中特定位置的指针。如果在 Marker 之前插入或删除了文本,Emacs 的 C 语言底层会自动更新 Marker 的数值,使其依然指向原本对应的那个文字点。我们可以通过 push-mark 和 pop-mark 来保存和恢复一个mark。从名字上可以看出来它是一个栈操作。需要注意的是,出栈时并不会返回栈顶存储的值,我们可以通过 mark 函数来获取栈顶的值。为了清楚的体现第二个区别,我们可以写这样一个例子(defun my/test-point() (interactive) (let ((old-point (point))) (goto-char (point-min)) (insert "this is a test for point") (goto-char old-point))) (defun my/test-mark() (interactive) (push-mark) (goto-char (point-min)) (insert "this is a test for point") (goto-char (mark)) ;; 通过栈顶记录的marker 值来恢复光标位置 (pop-mark))到这里我们似乎解决问题了。我们可以通过管理marker 栈来实现保存和恢复现场。但是我们没有考虑一种情况:如果在push 之后 pop 恢复之前程序出错了,怎么办?我们要为这段代码加一个异常处理机制。到这里我们就可以请出今天的主角了—— save-excursion 。这是一个用C实现的底层函数,用于保证在任何情况下都能恢复现场。你可以将它理解为底层通过try catch 包装了的 push-mark 和 pop-mark。根据这点我们可以知道它需要注意的点:它只用来还原光标现场,而不会还原中间对文本执行的插入、删除操作避免在大的循环中使用,多次进行 push-mark和 pop-mark 会不断制造和销毁临时的marker资源,影响性能它的定义如下:(save-excursion &rest BODY)我们可以将上面的例子做一个改动(defun my/test-mark() (interactive) (save-excursion (goto-char (point-min)) (insert "this is a test for marker")))有了这个函数,我们能从繁琐的现场保存与恢复中解放出来,将注意力集中在具体功能的实现上。练习这次的练习比较简单,我们就简单的为上一次的复制行的函数加一个恢复现场的功能(defun my/duplicate-current-line() (interactive) (save-excursion (let ((line-next (buffer-substring (line-beginning-position) (line-end-position)))) (goto-char (line-end-position)) (newline) (insert line-next))))总结本篇我们讨论了Emacs中保护和还原现场,提到了 marker 和 point。同时也引入了 save-excursion 来保护和还原现场。既然本篇章提到了 marker,Emacs中 marker 和 point 组成了一个很重要的概念—— region。一般我们叫它选区,也就是在编辑器中我们看到的用户选中区域。这部分内容将在后面进行介绍。
2026年08月03日
15 阅读
0 评论
0 点赞
2026-08-02
《elisp每日一练》——行定位与光标移动
在第一天,我们知道buffer实际上就是一个存储文本信息的缓冲区,而光标所在位置就是缓冲区中当前字符的索引。并且这个缓冲区有一个最大索引和最小索引。除非我们要对整个缓冲区进行清空、全选、移动到开头或者结尾位置等操作,一般来讲我们用到全缓冲区的操作并不多,更多的是快速移动光标然后插入字符或者在行间进行跳转。所以今天我们主要介绍行操作和光标移动背景知识铺垫依靠光标所在位置可以定位当前行所在的索引区间,通过函数 line-beginning-position 和 line-end-position 来获取前行行首或行尾的 Point 位置。但是和它们第一天介绍的 point 等函数类似,只是获取对应的索引位置,并不会改变光标位置。如果要改变光标位置,通过 goto-char 来实现依靠这些知识,我们实现一个移动到下一行或者上一行的函数(defun my/goto-next-line() (interactive) (let* ((next-start (+ 1 (line-end-position))) (next-start (min next-start (point-max)))) (goto-char next-start)))上述实现的思路就是通过 line-end-position 定位到当前行尾的下一个位置。但是需要考虑是否是最后一行了。最后再通过 goto-char 移动光标到对应位置。如果我们通过循环或者递归的方式调用该函数就可以实现连续向下移动N行。但是这个功能Emacs也提供了,它的函数名为 forward-line。如果传入的参数N为正数则往下移动N行,为负数则表示向上移动N行。练习在vim中,我们常用的操作是 yy 拷贝当前行然后 p/P 粘贴到下一行或者上一行。今天的练习我们来尝试实现这么一个功能,为了简单我们就不支持拷贝多行了。我们可能用到的API函数有:line-beginning-position 和 line-end-position 用来定位范围buffer-substring 用来拷贝字符串goto-char 移动光标位置newline 插入新行insert 用来在光标所在位置插入字符有了这些铺垫,我们可以实现这个函数了(defun my/duplicate-current-line() (interactive) (let ((line-next (buffer-substring (line-beginning-position) (line-end-position))) ;拷贝当前行所在字符 ) (goto-char (line-end-position)) (newline) ;; 插入新行 (insert line-next)))总结本篇介绍了行操作有关的api函数。并且实现了一个简单的复制当前行到下一行的函数。但是这个例子不太完美,因为我们发现执行玩之后光标停留在下一行的行尾位置,如果我们不希望改变光标位置,让它停留在当期行该怎么办呢?下一篇我们将解决这个问题,来讨论如何恢复现场
2026年08月02日
17 阅读
0 评论
0 点赞
2026-08-01
《elisp每日一练》——point与buffer-substring
之前我根据自己学习Emacs的经验发布一系列的博客来介绍Emacs、ELisp,并且完成了一套相应的配置。但是说实话那些配置也是我在一些论坛之中抄过来的,有的带有些许的个人色彩的改动,只能满足最基本的要求。如果你要我对这些配置做更细的改动,或者要深入具体的插件,做更细化的改动,我目前是做不到的。基于以上水平,我在懒猫的博客 找到更进一步学习elisp 的方法。简单来说接下来要做的就是一页一页的翻看 Emacs Lisp Reference Manual, 一个 api 一个 api 的练习。现在就像初学C语言时只能写写hello world,打印斐波那契数列,或者99乘法表这样简单的程序。想要写更复杂的程序需要学习操作系统、网络原理、数据库、甚至跨专业的知识。我每天上班摸鱼时看看,目前持续了一个月左右,看的内容并不多但是有些收获,所以我打算开启一个新系列,来跟读者分享我的学习心得。我考虑到,如果我的这个新系列也按照 Emacs Lisp Reference Manual 来组织一来是太细也太繁琐了,二来里面的有些内容很多跟我一个水平的读者已经很熟悉了,再介绍一次有些重复了。所以我按照我个人的理解来组织后续的内容。废话不多数我们正式进入正题。本篇我们从最基础的内容开始介绍前提知识提要首先简单介绍一下 buffer 的概念。如果你写过从文本文件中读取文本的简单程序就会理解,如果我们要读取文本首先要做的就是开辟一块内存来存储读出来的内容。你可以将emacs 中的buffer做同样的类比,它就是一块在内存中存储文本的区域,但是通过窗口将这个区域呈现在我们眼前。用C/C++ 的概念来讲,它就是一个 char const*对于这个 char const* 数组来说,想要访问它主要有三个变量需要记录:当前的index、数组开始的索引和最大元素所在的索引,对应于Emacs中的 buffer ,它提供了三个函数 point 、point-min、point-max 分别获取当前光标所在索引,最大索引位置和最小索引位置。我们通过 (buffer-substring START END) 来提取当前buffer中从 start 到 end 之间的字符串练习下面我们通过一个简单的例子来实践、了解这些函数的作用。我们实现一个 my/get-word-at-point 的函数,它用来取光标位置前后各5个字符的字符串并通过message 函数来显示。我们实现的思路如下:通过 (- point 5) 和 (+ point 5) 来获取光标前后各5个字符的位置。通过 buffer-substring 来提取数据使用message 打印结果(defun my/get-word-at-point () (interactive) (let* ((curr (point)) (start (max (point-min) (- curr 5))) (end (min (point-max) (+ curr 5))) (substring (buffer-substring start end))) (message "%s" substring)))总结本次我们简单介绍了 buffer 的基础概念,同时重点介绍了三个获取位置相关的函数 point 、point-min、point-max。以及用来做练习的 buffer-substring 函数。下一篇我打算介绍行操作有关的内容,行开始的位置和结束的位置可以通过 line-beginning-position、line-end-position。读者可以提前考虑一下怎么通过这两个函数完成复制当前行的内容
2026年08月01日
8 阅读
0 评论
0 点赞
2026-07-25
PDF 标准详解(八)——混合模式
所谓的混合模式,也就是颜色的混合。混合模式是从PDF1.4标准开始引进。它决定了上层图形和下层已有内容重叠时该如何显示它们的混合色。混合模式的写法混合模式是通过扩展图形状态字典来定义的,刚刚好我们在上一篇文章中介绍了这个概念。它的键名为 /BM 后面跟模式的名称。PDF支持的混合模式类型如下:模式名称中文计算方式Normal正常模式默认模式,上层直接覆盖下层(结合透明度时按比例混合)Multiply正片叠底$C_r = C_s \times C_b$。颜色相乘,结果总是变暗,类似两张半透明彩色胶片重叠Screen滤色互补色相乘,结果总是变亮,类似多盏彩色灯光重叠照射Overlay叠加根据背景暗/亮自动切换 Multiply 或 Screen,保留背景的高光与阴影Darken变暗取两者各通道的最小值SoftLight柔光其核心作用是根据源颜色的明暗来使背景色变暗或变亮,效果类似于在背景上照射一束漫射的柔和聚光灯HardLight强光当顶层源颜色较亮时,效果类似滤色;当较暗时,类似正片叠底,视觉效果如同用强烈的光束照射背景Difference差值取两者 RGB 值的绝对差,常用于色彩反转和对比校验Exclusion排除其效果类似于差值模式但反差更柔和, 计算公式为 $C_r = C_b + C_s - 2 \times C_b \times C_s$示例下面我们来看具体的例子:2 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 700 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [3 0 R] % 图形内容在对象4中 /Resources << /Font << /F1 5 0 R % 注册字体信息 >> /ExtGState << /GS_Normal <</BM /Normal>> /GS_Multiply <</BM /Multiply>> /GS_Screen <</BM /Screen>> /GS_Overlay <</BM /Overlay>> /GS_Darken <</BM /Darken>> /GS_SoftLight <</BM /SoftLight>> /GS_Difference <</BM /Difference>> /GS_Exclusion <</BM /Exclusion>> >> >> endobj 3 0 obj % 页面内容流 << >> stream % 流的开始 0.8 0 0 0 k 100 150 400 400 re f %底色采用青色的矩形 %======= Normal 模式============== /GS_Normal gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 0 500 Td (Normal) Tj ET %====== Multiply 模式 ================== /GS_Multiply gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 0 400 Td (Multiply) Tj ET %====== Screen 模式 ================== /GS_Screen gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 0 300 Td (Screen) Tj ET %====== Overlay 模式 ================== /GS_Overlay gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 0 200 Td (Overlay) Tj ET %======= Darken 模式============== /GS_Darkens gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 350 500 Td (Darken) Tj ET %====== SoftLight 模式 ================== /GS_SoftLight gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 350 400 Td (SoftLight) Tj ET %====== Difference 模式 ================== /GS_Difference gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 350 300 Td (Difference) Tj ET %====== Exclusion 模式 ================== /GS_Exclusion gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 350 200 Td (Exclusion) Tj ET endstream % 流结束 endobj 5 0 obj << /Type /Font /Subtype /Type1 % 标准 Type1 字体字典定义 /BaseFont /Helvetica %内置 Helvetica 字体,无需嵌入字体文件 >> endobj上面的例子我们往Page对象中注册了资源,里面有:字体资源、混合模式资源。字体资源我们引用了5这个对象,而混合模式的资源我们注册在 ExtGState 里面,它的注册与上一篇中注册图形状态字典类似。我们注册了8种混合模式的字典。接着我们在页面中绘制了一个大的青色矩形作为底色,然后在适当的位置绘制了各种字符,通过字符颜色和底色进行混合来测试不同混合模式的显示效果,最终的效果如下:关于字体相关的部分,我们将在后面进行介绍。这里我们看到定义颜色时使用的操作符是k,而不是我们以前使用的rg操作符。这是因为这里使用的是 CMYK (Cyan、Magenta、Yellow、Key) 颜色空间,而rg是用来定义rgb颜色空间的。而 CMYK 需要四个颜色值。关于颜色空间的内容我们将在后面讲解。透明度关于透明度,我觉得这里不需要特别解释它的概念。不透明度使用 /CA(填充不透明度) 或者 /ca(描边不透明度) 。需要注意的是PDF渲染引擎在计算最终的颜色时,先计算混合模式的值,之后根据透明度再计算一个最终的颜色。假设不透明度是 $\alpha$ , 混合模式计算的值是 $C_blend$ ,最终的颜色可以使用下列公式计算$C_final = \alpha \times C_blend + (1-\alpha) \times C_blackground$我们仍然采用上面的例子,只不过这一次新增一个不透明度,我们将不透明度定为 0.52 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 700 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [3 0 R] % 图形内容在对象4中 /Resources << /Font << /F1 5 0 R % 注册字体信息 >> /ExtGState << /GS_Alpha50 <</CA 0.5 /ca 0.5>> /GS_Normal <</BM /Normal>> /GS_Multiply <</BM /Multiply>> /GS_Screen <</BM /Screen>> /GS_Overlay <</BM /Overlay>> /GS_Darken <</BM /Darken>> /GS_SoftLight <</BM /SoftLight>> /GS_Difference <</BM /Difference>> /GS_Exclusion <</BM /Exclusion>> >> >> endobj我们这里定义了一个不透明度,可以在适当的时候调用。实际上我们调用字典中定义的属性本质上就是在使用图形状态操作符,一旦设置了后面如果没有手动变更,那么整个流中都会采用这个状态。3 0 obj % 页面内容流 << >> stream % 流的开始 0.8 0 0 0 k 100 150 400 400 re f %底色采用青色的矩形 /GS_Alpha50 gs %设置全局的不透明度 %======= Normal 模式============== /GS_Normal gs 0 0.9 0 0 k %字体颜色为洋红色 BT /F1 72 Tf 0 500 Td (Normal) Tj ET %====== Multiply 模式 ================== % ...... 按照上面的例子依次往下列举各个混合模式 endstream % 流结束 endobj这里我将它放到定义矩形之后、开始混合模式之前。最终得到的结果如下:放到其他位置显示的效果又不太一样,这个读者可以自行去尝试总结本节到此就结束了。本节中的不透明度和混合模式理解起来不难。虽然每种混合模式标准中都定义了详细的计算方式,但是我们并不是要开发PDF渲染引擎,本文只用来作为扫盲,只涉及一些大概的概念即可。关于混合模式的详细信息可以在PDF标准中的 关于 blend mode 模块中找到
2026年07月25日
13 阅读
0 评论
0 点赞
2026-07-25
读《失败的春秋》
我之前接触春秋时期的历史也就看过历史剧《东周列国志》,再加上学生时期学过的一些文言文。当初看电视剧的时候除了一些耳熟能详的剧情我能看懂,有些剧情对我来说还比较陌生,人物关系比较混乱,只是觉得这是一个孔子口中礼崩乐坏的时代,有国与国之间的吞并,有大臣和国君之间的残忍杀戮,有兄弟之间为了侯位自相残杀。读这本书给我科普了不少春秋时代的典故和一些文献中的习俗。春秋时代的开启周时代的政治格局是一个类似同心圆的结构,周天子的封地(或者说国家)在华夏的正中心位置,因为是位于所有诸侯国正中心,所以也叫做中国。外层靠近中心的位置是天子的近亲同姓人,地盘越往外越靠近边缘的与天子的关系就越远。而最边缘的是各种少数名族,或者从血缘上也是汉人但是不属于当时华夏地区的血脉。一般古书上将所有的边境地区的人统统追认为五帝之一的“颛顼”的血脉。那个时候蛮夷、夷狄的含义与我们现在也大不相同。春秋时期对位于不同方位的少数名族的称呼也不一样。一般称为:东夷、南蛮、西戎、北狄。因为周天子诞生的后代只能由嫡长子继承周天子的位置,而其他的同胞兄弟只能由周天子赐地建国,而天子的地盘有限所以天子的地盘越分越少,而那个时候少数民族与一些边缘化的国家接壤,而掠夺蛮夷、夷狄的地盘属于政治正确,所以周边的国家实力反而越来越强大,这么一升一降,随着时间的推移最终导致天子大权旁落,而诸侯国力日益增强。并且西周的周幽王因为少数民族入侵被杀,周平王东迁开启东周时代时还需要诸侯保护,此时周天子再也挑不起天下这个担子,变成了诸侯争霸的时代。春秋各国春秋时代有各种小国家,别看它们小,它们反而是周天子的近亲。春秋时期姬姓的国家有很多,可以根据位置进行划分。中原地区有:卫国:由周武王同母弟康叔建立,文化底蕴深厚,存续时间极长。曹国:由周武王之弟曹叔振铎建立,夹在晋、楚等大国之间艰难生存。虢(guó)国:分为东虢和西虢,曾长期担任周王室的卿士,后被晋国用“假道伐虢”之计消灭。随国(曾国):汉水流域最大的姬姓国,主要负责替周王室南方边疆防御楚国。相对偏远的地区有:晋国:由周成王之弟唐叔虞建立,是春秋中期最强大的姬姓国,长期担任中原霸主。鲁国:由周公旦之子伯禽建立,完美保留了周朝的礼乐制度,是当时的文化中心。郑国:由周宣王之弟郑桓公建立,春秋初期最早崛起并挑战周王室权威(“庄公小霸”)。燕国:由召公奭建立,位于北方边疆,是少数延续到战国末期的姬姓大国。吴国:由周太王长子太伯建立,位于江南,春秋晚期军事力量极强,曾攻破楚国。齐鲁地区齐国的起源是姜太公,因此齐国的国姓是姜。古时候女子是只有姓没有名,嫁人之后夫姓在前自己本家的姓在后,所以武姜其实本家姓姜夫家姓武。另外古时候兄弟几人称为伯、仲、叔、季。但是并不是严格按照这个来划分,嫡长子称为伯、次子为仲、小儿子称为季、其他小于二子大于次子的统称为叔。所以刘邦之前的名字叫刘季,并不是因为他是第四个孩子,而是因为他是小儿子。而刘太公当初三个儿子,所以刘季也就是我们今天所说的“刘三”。只有嫡长子能称之为伯,而如果长子是庶出的话,长子被称为孟。孙伯符从名字上看是嫡长子,而曹孟德听起来就是庶出的长子。齐国是异姓功臣封国,地理位置临海,土地盐碱化严重,不适合死板地种地。姜太公采取了非常现实的政策——“因其俗,简其礼”,大搞通商工官、发展盐铁之利,极其重实效。因此齐国的民风相对礼仪之邦来说比较开放。齐国的女子也比较热情奔放。所以后世称呼美女也喜欢用齐姜这个词,有时候也简称姜。所谓的孟姜女的典故似乎出现在汉代以后,孟姜女可以解释为姜家长女,也可以解释为一个美丽的长女。鲁国是周室宗亲的“亲儿子”,承担着向东夷传播周礼、拱卫周室的政治任务。伯禽到了鲁国,搞的是“变其俗,革其礼”,强行推行西周的周礼和宗法制度。相比于齐国的国风来说,鲁国相对保守,比较死板。这样的结果就是鲁国日益衰落。而齐国能快速崛起。而《春秋》这本史书主要记录鲁国的历史。这本书也比较重视礼法,它采取的原则是非礼勿言,不符合礼法的事不记录或者换一种符合礼法的表现手法。后世也有春秋笔法的说法。卫、宋、郑武王伐纣成功之后建立周朝。他并没有对商人赶尽杀绝,而是采用优待的政策。将商人后代封到了宋国。但是他对商人也不能完全放心,因此将自己的两个弟弟封到了宋国附近建立了郑国和卫国。卫国建立在原商朝国都朝哥之上,周王原本打算用新时代风气来感化原商朝臣民。但是最终却被反噬,形成了奢靡的享受之风。卫国的地理环境不好,经常受到少数民族的袭扰,但是卫国又沉迷享受,在整个春秋时期卫国都没有值得记录的成就。后人回首历史,把卫国的情歌当作国家命运多舛的重要原因,甚至传说这些音乐是商纣时代留下来的诅咒。纣的一个乐师叫师延,为纣王作了“靡靡之乐”。因为它太小了,而且也那么的默默无闻,秦始皇扫六合的时候居然把它忘了,它最终在整个战国时期是最后灭亡的。宋国人因为是商人的后代,从一开始就不受待见,称为最早地域歧视的受害者。先秦诸子编笑话,编预言故事时,主角的蠢人几乎都是宋人。宋国蠢人蠢事虽多,基本特征却是对环境不敏感,头脑一根筋。至于那种好耍小聪明,弄巧成拙的蠢,例子就很少见。而郑国相对来说比较辉煌,郑庄公也被称为春秋小霸主。郑国最著名的故事应该就是“郑伯克段于鄢”。以及射向周天子的那一箭。郑国、卫国相邻,风俗有不少相似的地方,所以往往被相提并论。提到姑娘时髦漂亮,则说郑卫之女;说到音乐淫靡动听,则说郑卫之音争霸春秋初期的战争,大致有这么几个特点:第一,军队规模不大;第二,持续时间不长;第三,不防守战略要地;第四,不以摧毁敌军有生力量为目标。那个时候两军对垒,双方战车互相冲锋,每次交锋叫做一回合。然后调转车头再次冲锋、交锋。一般几个回合就分出胜负了,所以一般打仗很少超过一天的。车战是很讲究规则的,竞技体育的意味很浓。要打仗,两国约好到一片开阔地去打,不能不宣而战,更不许偷袭。但求分出胜负,不求制敌死命,甚至据说连追击失败的敌人可以追击多远,周礼都有规定。所以基本没怎么出现战国时期那种大规模的、持续时间几个月甚至几年的战争,也没有出现坑杀降将的恶劣事件。周天子大权旁落无法挑起担子,但是这种集中各诸侯国办大事的活动总归需要有人来主持,而能参与主持这种活动的人就是所谓的霸主。就是说霸主有三个特点:第一,他有牺牲精神;第二,他能为诸侯解决困难;第三,他是天子意志的执行者。换言之,天下是天子的,但是现在天子不管事,事情归霸主管。而最早的霸主公认的应该是齐桓公。他打的旗号是“尊王攘夷”,经常联合诸侯解决边境的少数名族问题。此时霸主的主要责任是联合诸侯,但是为了维持这个联盟也需要霸主自身设施一点好处给周边的小国。各盟友国之间也讲基本的道义。但是齐国衰落,晋国成为霸主之后这条人道注意的底线就丢失了。晋国干了不少当时看来无底线的事情。一个是强迫盟友上供,向盟友要钱要物,另一个就是晋国干了不少灭国的事情,最典型的就是假道伐虢、唇亡齿寒的故事。楚国一直是中原南部的大国,随着楚国国力日益强盛,而中原各国因为战争内耗严重时,楚国的威胁也就越来越大,而楚国也有问鼎中原的野心,在争霸的路上楚国和各大国之间早晚有一战。其中晋楚之间打仗最多。而夹在两个大国中间的小国就比较悲催了,两大国家经常因为争夺这些小兄弟而对它们轮番揉拧。今天投靠楚国,明天晋国以此为理由讨伐。再投降晋国之后,楚国又以此为理由讨伐。因此中原各国战事不断。贵族的落寞此时的春秋有点像欧洲的中世纪,你中有我我中有你。这国的国君可能有那一国的血脉,或者国君的妻子是另一个国君的姐妹或者女儿。贵族也有贵族的气派。士阶级以上的贵族子弟,从小学习任务都很繁重。武艺方面,要掌握长短兵器使用的技巧,尤其是要精通射箭和驾驭马车:文化方面,除了基本的读写和计算能力以外,据说是“春秋教以礼乐,冬夏教以诗书”,按照《礼记•内则》的说法,要学习到四十岁才可以出来当官。一个成年贵族需要做到“九能”:建邦能命龟:龟命是占卜的意思,也就是说建国时会讨吉利田能使命:能有基本的军事素养作器能铭: 会写正面报道,能弘扬时代正能量使能造命: 出使外国能完成君主的使命升高能赋: 登高临远,旅游时能吟诗作赋师旅能誓:打仗的时候能鼓舞士气,做战前演讲山川能说: 对本国名山大川,熟悉到能做导游。山川既可以是祭祀对象,往往也是战略要地,它们的门道要能说清楚丧纪能诔:会写悼词祭祀能语:祭祀时是构建祖先认同民族凝聚力的重要时刻,能主持祭祀,还能准确的向神明和祖先汇报工作贵族聚会并不是胡侃吹牛,而是要引经据典,甚至要歌唱诗歌,这里的诗歌主要是《诗经》,贵族会根据场合来歌颂诗经中的不同诗句来表达感情。所以难怪,孔子要教育儿子“不学《诗》,无以言”,这不是说不懂《诗》连话都不会说了,而是说不懂《诗》的话,混不进贵族的社交圈。世界历史上有个很普遍的现象,就是当贵族阶级的特权受到冲击、实力下降时,贵族风度就得到特别的重视,往往也因此别有魅力。春秋时期社会上最高效的方式就是封建君主一言堂,一人独揽大权,君主需要的是没有自己思想的提线木偶或者说办事机器。而封建贵族则讲究贵族范,贵族有自己的行事主张和自己的价值观。因此国君与贵族的矛盾也越来越深,各个曾今的霸主国似乎都不约而同的陷入各种内乱。有国君与贵族之间的杀戮,有贵族与贵族之间的杀戮。这个时期有著名的赵氏孤儿,魏、赵、韩三家分晋,也有田氏代齐。而最终在完成君主与贵族统一意志之后,正式进入战国时代。战国时代更加混乱,国家组织能力进一步提升,同时战争规模更大,过程也更加残酷,持续时间也更长久。
2026年07月25日
10 阅读
0 评论
0 点赞
2026-07-19
PDF 标准详解(七)——参数字典
在前面的文章中,我们提到,PDF支持5种基本数据结构和三种复杂结构,简单数据结构分别是:数字、字符串、名称、bool值、null对象。而复杂类型有数组、字典和流;在线型那一篇博文我们看到了数组的使用,它非常的简单,一般来说它的使用与其他编程语言中数组的使用并没有什么特别的地方。随着文档内容的复杂化,如果每出现一个显示的元素都要使用操作符详细的定义它的位置、颜色、填充等属性那么着实有点复杂了。对于这种重复型的操作,编程语言中一般使用函数或者类来进行封装,而PDF中这种重复性的定义则使用字典来封装。我们在前面的一系列示例中看到过别的数据类型的使用。目前对于简单类型都已经很清楚它的使用了,但是对于复杂的类型我计划是拆解pdf标准的内容,在合适的时候带入pdf数据结构的内容。所以这一篇我们先从字典开始语法我们先来了解一下它的语法。如果你熟悉一些编程语言(Python、C/C++、Java、Go等等),那么一定对字典的概念不会陌生。字典是由一组键值对组成,可以通过键快速的查到它对应的值。PDF 的字典本质上也是一个无序的键值对容器。但在PDF中,它的语法有两个极其鲜明的“硬核”特征:尖括号护体:字典必须由成对的双左尖括号 << 开始,并由双右尖括号 >> 结束。斜杠开路:字典里的 “键(Key)” 必须是 PDF 中的 Name(名称) 类型。这意味着它不需要加任何引号,而是直接以斜杠 / 开头。而 “值(Value)” 则可以是 PDF 支持的任意数据类型。下面是一个具体的例子:<< /Type /XObject /Subtype /Image /Width 640 /Height 480 >>上面的这个字典是由 一对 "<<" ">>" 包裹起来的。它有四个键值对。重要的 /TypePDF的字典和编程语言中的字典有点不一样。编程语言中的字典纯粹是为了快速的进行查询,它可以形容任何属性,而编译器也不关心这个字典的作用。但是PDF中不太一样,有时候PDF渲染器会读取字典来进行一些渲染工作,那么它就需要知道这个字典是用来干什么的。我们可以通过 /Type 来指明这个字典的作用,例如前面的例子中:1 0 obj % 对象1 << /Type /Pages % 这是一个页面列表 /Count 1 % 只有一页 /Kids [2 0 R] % 页面对象编号列表。这里只是对象2 >> endobj % 对象1结束表示这是一个页面列表的字典。渲染器读到这里的时候知道这个文档有一个页面。页面的内容对应着对象2。此时渲染器再去读取对象2,发现它又是一个字典2 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 612 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [3 0 R] % 图形内容在对象4中 >> endobj在对象2 这个字典中,我们定义了它的/Type 为 /Page 表示它是一个页面对象。它的内容在对象3中定义。读到对象3时发现它又是一个字典:3 0 obj % 页面内容流 << >> stream % 流的开始 0.5 0.5 0.5 RG 20 w [1 2 5 7 8 1 4 5 12 4 5] 0 d 100 100 m 400 100 l S endstream % 流结束 endobj3终于不是字典了。它是一个流对象(又出现新的概念了)。示例上一节中我们写了一个复杂的示例:0.5 0.5 0.5 RG 20 w [1 2 5 7 8 1 4 5 12 4 5] 0 d 100 100 m 400 100 l S在这个里面我们定义了线宽、虚线类型,然后进行了划线。在这个简单的示例中这么做完全没问题,但是对于一个复杂的PDF文档来说,页面中的内容可能不止一个流对象,而且也不止一个页面。如果我们将它作为条形码在每一页的关键位置使用,我们每一次都要写这么一个东西,而且如果某一天条形码变了,每个地方都要重写虚线的数组,那种工作量你碰到了可能会当场辞职。但是别担心,人类进步的一个重大原因是人类喜欢偷懒。对于这种重复无聊的工作有字典这个东西帮我们偷懒。这里我们需要用到 扩展图形状态字典 这么一个东西。 对于上面一个关于虚线的封装,我们可以定义下面这样一个字典:6 0 obj << /LW 20 /D [ [1 2 5 7 8 1 4 5 12 4 5] 0] % 封装虚线模式、等效于 [1 2 5 7 8 1 4 5 12 4 5] 0 d >>那么我们怎么用它呢?在使用之前需要先在页面对象的资源字典中进行注册。我们修改一下2这个对象2 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 612 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [3 0 R] % 图形内容在对象4中 /Resources << /ExtGState << %注册图形状态字典 /MyDashStyle 6 0 R % 绑定到对象6 >> >> endobj接着我们就可以在内容流中使用它3 0 obj % 页面内容流 << >> stream % 流的开始 0.5 0.5 0.5 RG /MyDashStyle gs 100 100 m 400 100 l S endstream % 流结束 endobj需要注意一点,我们需要在使用图形状态字典的后面加上 gs 操作符,它表示 Graphics State,调用这个资源字典。你可以将它理解为调用函数的call指令消失的 /Type我们说 /Type 是很重要的内容,它可以告知渲染器这个字典是什么类型的字典。但是我们定义的字典似乎没有Type,它能正确的渲染,这也就说明 /Type 并不是必须的,PDF渲染器可以直接的(从Type中读取)或者间接的(自行推导)得知类型并根据类型进行渲染。我们可以尝试一下将之前例子中所有 /Type 都去掉,我们发现PDF渲染器仍然能正常工作。我们可以结合之前所说的PDF的渲染过程来理解。首先渲染器会读取交叉引用表的内容。交叉引用表中 /Root 对应着4这个对象,此时渲染器知道了,4对象的Type为 Catalog4 对象 /Pages 键对应着1这个对象,渲染利用这个信息可以推导出 1 对象是一个 pages 类型1 对象中 /Kids 中有一个引用的子对象,就是2对象,所以2对象就是一个 /Page2 对象中,注册了一个 资源字典 6 对象,那么6对象肯定是资源字典了。也就是说PDF对象可以根据上下文来推导出具体的类型,我们实际上并不需要每个都指定。而且推导的类型的优先级是要高于手工指定的,读者可以自行做一个实验,如果我们将6对象添加一个键值对 /Type /Pages 给出一个错误的类型,渲染器也不会报错,仍然可以正常工作。自定义自己的键上面我们看到定义字典中的键都是PDF内置的键,比如用来定义线宽的 /LW ,定义虚线的 /D。这里是不是说键一定是PDF内置的呢?其实不然,我们当然可以定义自己的键。例如,读者可以自己对上面的资源字典做一些修改。加入一些自定义的键。PDF的标准中并没有规定字典的键。但是在PDF渲染器进行渲染时它会忽略不认识的键,只读取它认识的。一个是为了方便后面对标准进行扩展,另一个也是方便各大PDF渲染器的厂商能定义一些自己的扩展。字典的查找顺序这里我们将字典注册到了 Page 对象中。是不是意味着只能放到Page中进行注册呢?答案是否定的。实际上我们可以在解析过程中的任意位置进行注册。也就是对于多页公用的样式,我们可以注册到 /Pages 这个共同的父节点中%PDF-1.0 % PDF 版本号为 1.0 的文件头 1 0 obj % 对象1 << /Type /Pages % 这是一个页面列表 /Count 2 % 只有2页 /Kids [2 0 R 8 0 R] % 页面对象编号列表。 /Resources << /ExtGState << %注册图形状态字典 /MyDashStyle 7 0 R % 绑定到对象7 >> >> endobj % 对象1结束 2 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 612 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [3 0 R] % 图形内容在对象4中 /Resources << /ExtGState << %注册图形状态字典 /MyDashStyle 6 0 R % 绑定到对象6 >> >> endobj 3 0 obj % 页面内容流 << >> stream % 流的开始 0.5 0.5 0.5 RG /MyDashStyle gs 100 100 m 400 100 l S endstream % 流结束 endobj 4 0 obj << /Type /Catalog %文件目录 /Pages 1 0 R %参考页面列表 >> endobj 6 0 obj << /Type /ExtGState /LW 20 /D [ [1 2 5 7 8 1 4 5 12 4 5] 0] % 封装虚线模式、等效于 [1 2 5 7 8 1 4 5 12 4 5] 0 d >> 7 0 obj << /Type /ExtGState /LW 20 /LC 1 >> 8 0 obj << /Type /Page % 这是一个页面 /MediaBox [0 0 612 792] % 纸张尺寸为美国信肖像(612点x792点) /Contents [9 0 R] % 图形内容在对象9中 >> endobj 9 0 obj % 页面内容流 << >> stream % 流的开始 0.5 0.5 0.5 RG /MyDashStyle gs 100 100 m 400 100 l S endstream % 流结束 endobj xref %这里我们跳过了交叉引用表的开始 0 5 trailer << /Size 5 %交叉引用表的行数 /Root 4 0 R % 参考文档目录 >> startxref 0 %xref表开始的字节偏移量,这里设置成0 %%EOF这里我们在第一页的 /Page 对象和对应的父对象 /Pages 中都注册了一个 /MyDashStyle 的资源数组。一个是虚线一个是实线。我们可以看到第一页显示为虚线,第二页显示为实线。也就是在第一页中发生的名称覆盖的现象。如果有一点编程语言的知识就很容易理解这个概念,它就相当于函数内部局部变量对全局变量的覆盖。总结最后我们补充一下关于图形状态字典的一些键,它们的作用与我们之前介绍的线型的操作符一一对应,作用也是一样的操作符对应的键值wLWJLCjLJdD
2026年07月19日
19 阅读
0 评论
0 点赞
2026-07-18
股票投资学习记录(九)——二级市场的定价机制
在对一家公司进行深入分析之后,了解它的业务并且深入理解了公司的商业模式和护城河之后,对于它是否是一个好公司已经有一个大概的观念了。好公司还要有好的价格才值得买入。价值投资强调对于好公司要在价格远低于价值的买入,那么二级市场是如何对它进行定价?每天看到股票价格的涨涨跌跌是如何形成的呢?二级市场股票交易市场又被称为二级市场。这里的二指的是二手货的意思,因为我们买入的股票不是直接在上市公司手中购买的原始股,而是其他拥有这支股票的人转手卖给我们的二手货。而根据前面关于公司融资步骤我们可以知道:公司公开的向社会募集资金实际上是在IPO阶段。IPO阶段的定价由公司和IPO的承接商根据具体行情、公司融资目标等因素确定一个报价。之后进入到打新环节。所以从这个角度看,股权的一手交易实际是在打新环节。此时是我们直接从上市公司买入股权。我们可以形象的将二级市场理解为一个买卖股权的咸鱼平台,只不过只能买正规的上市公司股权,而无法买入体量小的小公司股权。买卖二手货的一个重要特点就是商品质量我们无法确定,买卖价格自由,没有所谓的官方指导价或者建议零售价,全部由卖家和买家进行自由报价。同时二级市场交易的钱不会流入上市公司的口袋,在打新阶段上市公司实际已经完成了融资。股票价格是如何决定的股票价格的一个重要特征是价格由少数交易者决定。比如说某个小区有1000套房,而其中990套都有业主在稳定的居住将其作为刚需住房,而只有10套挂牌出售。那么此时该小区二手房的价格主要由这10套房的成交价来决定。所以如果想操纵价格,那么可以从限制流通量和修改报价这方面入手。例如可以将所有小区待售房源集中起来一起拉高报价,或者采取假交易的手段,左手倒右手不断提交交易价格。这个时候小区房子的成交价格提高了,但是小区的居住价值却没有变化。理解了这个情况,再分析公司股价的变化就比较容易了,无非是从供需关系来分析。比如新股上市为什么会迎来一次涨幅或者说打新为什么总能赚钱。因为上市公司刚刚上市此时大量的股权都在公司自己和机构手中,只有少量股权能自由交易,流动性不足。卖家都知道新股会迎来一波上涨不愿意低价卖,而买家又非常想要买就只能不断加价。一旦机构和公司手中的股权解禁能自由买卖,那么股价将会迎来一次价值回归。对于普通散户来说,一般的建议是只买入上市超过3年,具有一定流动性的公司的股票。而我以前读价值投资相关的书籍时,作为稳健性投资者,我个人的指标是连续5年稳定分红、PE的5年历史平均值不超过20倍。所以我个人是拔高到至少上市5年以上。市场先生市场先生是格雷厄姆的一个经典比喻。市场先生是一个情绪不稳定,容易剧烈波动的人。他每天跑到你面前向你报价希望你能买入他手上的东西或者能将你手上的东西卖给他。有时候他极度乐观给这个东西一个很高的价格,有时候又极度悲观,给这个东西定一个很低的价格。我们要做的是不被市场先生影响,在他给出的价格过高时卖出在价格过低时买入。市场先生是一个很经典的比喻。那么市场先生的报价是如何形成的?或者说为什么市场容易出现暴涨暴跌呢?《乌合之众》这本书中讲,人在处于群体中时容易产生极端情绪丧失理智。股民在炒股过程中虽然物理上并没有一大群人在身边但是他们被交易软件上的波动各种弹窗消息以及自媒体、电视的疯狂轰炸联系到一起形成群体。在这个群体中人容易产生非理性行为。任何消息都会被无限放大,极端的乐观和极端的悲观很容易在这个群体中出现。从而使股票价格在他内在价值之间疯狂波动。产生波动的另一个原因是基金投资者。基金投资者本质也是在投资股票但是他们没有选股能力所以将钱交给基金,有基金经理帮他们选股进行投资。这类人也与普通个股投资者一样一旦出现风吹草动就容易进行买入卖出操作。而基金经理为了应对大额赎回必须要要贱卖手中的优质股票将钱还给投资者。所以某些时候出现千股跌停的现象。有时候二者互相影响,某个消息导致一些个股跌,从而导致基金投资者丧失信心,出现大批量赎回。而为了应对赎回基金经理不得不贱卖其中的优质股。这就导致大量毫不相关的股票出现大跌,进一步摧毁投资者信心。此时市场陷入恐慌,不管是个股投资者还是基金投资者都忙着割肉退出想要少点损失。此时对于价值投资者来说,如果他熟悉的某家公司出现大跌,此时就是进场的时机了。所以巴菲特说“别人恐惧时我贪婪”最后的总结二级市场的报价主要是供需关系决定的,与股票本身的价值无关。二级市场因为市场先生的存在大部分的时间都不能正确的做到价格和价值相匹配,可能在上市公司公布财报时短暂的出现价格正确的反应价值的时候。但是大部分时间市场先生的报价都是杂音。作为理性的投资者应该着眼于公司自身的价值,只在二级市场给出的报价合理时买入公司股权。
2026年07月18日
12 阅读
0 评论
0 点赞
2026-07-12
股票投资学习记录(八)——如何给公司估值
格雷厄姆在《聪明的投资者》这本书中提到,买股票应该买股价远低于估值的公司,需要给足安全边际。我们在考虑购买一个公司股票,通过分析发现它是一家有着优秀商业模式,深厚护城河,管理层也注重股东回报。那么下一步就是给公司进行估值,然后等待股价远低于我们的估值的时候买入。然后耐心持有,持续跟踪,等待股价价值回归,远高于估值的时候卖出。常用的估值方法常用的估值方法有绝对估值法和相对估值法。绝对估值法是采用对应的计算模型输入相应的值计算出一个准确的价格。绝对估值法的计算模型有:自由现金流折现法股利折现模型净资产分析法相对估值法是参考市场上其他同类型的公司,或者跟过去的自己相比,分析二者的区别得出一个大致的区间。相对估值法很像我们日常购物,比如买手机我们也不知道某款手机的具体价格,但是如果你一个杂牌手机的价格比苹果这种手机还贵,那肯定是贵了。自由现金流折现法自由现金流是指公司可以自由自由支配的现金流。如果以个人来类比的话,个人收入主要是工资收入,但是工资收入不能随便乱花,每个需要有一些固定支出,例如:水电费、房租、宽带、话费、交通费、伙食费等等,剩余的钱才是可以随便花的。一个企业也是同样的,赚的钱不能随便花,扣除经营企业必要投入后的钱才是可以自由支配的现金。自由现金流的计算可以简单的使用 自由现金流 = 经营活动产生的现金流净额 - 资本支出资本支出可以简单的采用现金流量表中:购买固定资产、厂房、设备等长期资产的现金流出这一项。接下来再来描述折现的概率。折现基于这样一个事实:货币具有时间成本,今天的100元购买力与10年后的100元不一样。折现的作用就是用来计算未来的100元等于现在的多少元。假设按照固定理财的3%收益进行计算,那么今天的97.08元就相当于明年的100元。我们可以将公司抽象成一台印钞机,每年印钞机会印出一定金额的现金,现在让你买断未来10年的使用权,那么这十年能产生的现金流折现到今天的总和就是它的价格。此时可以使用这样一个公式来计算:$$ \sum_{n=0}^{10}\frac{FCF}{({1+r})^{n}} $$我们可以简化为$$ FCF \frac{1-\frac{1}{({1+r})^{n}}}{r} $$从上述公式可以看到,在该模型中影响估值的主要有折现率和参与折现的年份。回到这个印钞机的例子,假设10年时间,折现率为3%,那么它的估值为 853.02元。对于企业来说,企业每年的自由现金流不是一成不变的,一般在实际估值中使用戈登公式:$$ V = \sum_{t=1}^{n} \frac {FCF_0 (1+g_1)^t}{(1+r)^t} + \frac {FCF_n (1+g_2)}{(r-g_2)(1+r)^n} $$FCF0:表示当前时点刚刚实现的自由现金流g1: 高速增长阶段的增长率g2: n 年之后进入永续低增长,需要满足g2 < r 公式才能成立r: 表示折现率n: 表示高速增长的年份戈登公式使用的前提是未来能永续维持低增长,并且增长率要小于我们给出的折现率,相当于要假定企业永远存在并且永远低速增长。虽然我们知道企业不可能永远存在,也不可能永远增长,但是一般来讲保证后续低速阶段给出的增长率小于折现率,企业后续能低速增长30到40年,这个结果已经很接近了。另外估值永远只能得到一个大概的区间,无法得到精确值,估值的艺术在于确定折现率、两个阶段如何划分以及如何确定两个阶段的增长率。这些数据的设定基于我们对企业、行业的理解程度。现在我们来实际计算两个例子:对于长江电力来说,它的主要业绩来源于发电站,而现在它提升业绩的方式主要也是后面收购新的水电站。我个人认为现在的长江电力对水电站的发电量已经开发到了极致,所以假定它未来自由现金流0增长。但是水电站的经营时间较长,假定是100年。我们可以从财报中查到自由现金流约为405亿元,另外我采用5%的折现率,带入公式计算,最终的结果大概为:8038.4亿元而长江电力的总股数为244.7亿股,所以得到最终股价约为 32.82元。按照安全边际,可以在此基础上打7到8折,也就是股价为22.92 或者 26.25 元时拥有安全边际如果我们按前10年3%的增长,后10年到100年的区间0增长,带入公式计算,我们得到它的价值大概为 7835.5亿元。除以总股数得到最终股价为 32.07我们发现采用不同的估值计算方式,得出的每股内在价值差距不大,因为它是这种没什么增长潜力的公司。我们的增长率取的比较低。股利折线模型它是自由现金流折现法的简化模型,它适用于红利型公司。红利型公司的确定型都比较强。它们业务稳定,也不需要大笔的资本开支,赚的钱很大一部分可以用来分红,未来也不太可能有高增长。对于这种类型的公司,我们可以使用它的分红来计算对应的内在价值。因为对于红利股,就像一个典型的印钞机,分发的红利就是印钞机印出的钱。所以我们取每年分红作为印出来的钱,但是每年分红会缓慢增长的,假设增长率为g、贴现率为r,那么可以有这样的公式$$ V = \frac {D_1}{r-g} $$按照这个公式我们来计算长江电力:长江电力26的分红已经结束了,每股分红1元,带入公式计算每股价值为33元。净资产估值法这个方式主要适用于一些小生意,因为大型上市公司的价值是无法使用净资产来衡量的。对于重资产企业可以采用这个标准。我们可以使用市净率这个指标,查看公司当前市净率处于历史的哪个区间来间接的判断它的估值相对估值法相对估值法比较简单,没有公式,我们只比较于它类似的公司价值大概是多少。我们可以对比同样公司的市盈率、市净率、总营收、净利润、ROE等指标来综合判断。使用类比估值法需要保证用来作为参考的公司不能太高估,如果参考的公司当前处于高估状态,那么最终我们对比得出的估值可能也是偏高的。除了于公司相比,还可以于整个行业相比。如果公司各项参考指标都优于行业平均水平但是市盈率、市净率等指标都小于行业的平均水平,那么当前公司可能处于低估状态。总结在进行公司估值时,我们可以使用上述方式进行交叉验证,防止在估值时某些指标取错造成估值不准确的问题。
2026年07月12日
10 阅读
0 评论
0 点赞
2026-07-11
读《如何快速了解一个行业》
俗话说“男怕入错行,女怕嫁错郎”,在投资中最理想的应该投资上升行业中最赚钱的公司。而如果我们投资一个摇摇欲坠的行业,不管它的企业过去如何辉煌,有多大的背景,它未来的前景都不会太好。甚至当前可能看起来股价便宜但是随后业绩一落千丈陷入低估值陷阱。面对一个陌生的行业我们应该如何分析它呢?本书给出了答案。书中的内容主要分为3大部分,首先介绍分析的基本框架,其次根据框架分析具体的行业,最后给我们总结出了一套具体的方法论。第二部分的示例我个人觉得不太重要,1000个人中有1000个哈姆雷特,面对相同的数据每个人可能站在自己角度得出的分析结论都不一样。具体行业的分析,我觉得需要读者自己进行体会,在日后我们可以根据书中内容自己分析自己感兴趣的行业,所以我就只列出前后两个部分的内容框架篇定义行业的范围书中给出了两个定义方式:作为国家标准的《国民经济行业分类》、中国证监会制定的《上市公司行业分类指引》,以及市场常用的《申万行业分类标准》等国家标准是按照常规的第一产业、第二产业、第三产业的划分方式。其中第一产业主要是:农、林、牧、渔。第二产业是:工业、采矿业、制造业、电力、燃气、热力、水生产和供应业、建筑业;其他的都属于第三产业;市场常用的《申万行业分类标准》是由申万宏源研究[插图]颁布的分类标准。它把行业按照颗粒度大小分成了三级,级数越高覆盖面越窄。除了申万宏源研究以外,中信证券、东方财富证券等金融机构也都制定了自己的分类标准,我们也可以参考。我个人认为我们按照券商给出来的行业分类就八九不离十了行业的不同发展阶段书中将行业划分为4个主要阶段:导入期、成长期、成熟期和衰退期。之所以会有这种跟人类成长类似的生命周期,主要是因为客户群体的变化。按照 E. M.罗杰斯(E. M. Rogers)的创新扩散理论,大众对于新事物的接受度是不一样的,按照接受创新的先后可以划分出5种不同类型的用户,分别是创新者、早期采用者、早期大众、后期大众以及落后者。创新者:一般出现了新事物都大胆尝试早期采用者:他们往往是关键意见领袖,在圈子里有一定的影响力,他们会用自己的影响力带动潜在的消费者,例如现在的一些数码类的体验博主会在视频中介绍某些产品的使用体验,吸引新的消费者进入早期大众:经过深思熟虑才接受新概念或者新产品,但是对新事物持开放态度。后期大众:一般是顾虑比较多的人。他们出于社会压力或经济压力,接受新事物的时间点比较靠后。他们不愿意承担试错成本,一直等到身边的很多朋友体验过并觉得这些体验能打消他们之前的顾虑才会考虑购入。落后者:顾名思义,这类人要么是信息比较闭塞,要么是对新事物比较排斥,只有被逼的没办法了才会成为对应的消费者,例如诺基亚手机停产了买不到了才考虑换智能机的一批人根据这些消费者的划分,我们可以分推导出这样的行业发展轨迹:导入期:产品还没有成熟的市场,甚至商业模式都没有走通。这个时候有一些创新者发现了产品,并且开始尝试。这个阶段开始有了新的概念、新的产品、新的服务。当然也有不少骗子公司打着代表未来的旗号,给投资人给用户许诺光明的前景行骗。成长期:此时商业模式已经清晰,产品相对来说比较成熟,在创新者中有一批稳定的用户,同时也吸引了早期采用者的体验,随着产品的不断迭代,优质产品不断“破圈”,而早期采用者的影响力也吸引了一批早期大众。此时行业进入成长期,只要产品做的像样就能有用户。这个时候会有大量的公司开始模仿进入行业并试图抢占市场。因为行业处于上升期不断吸引潜在用户,所以此时进入的公司也大多活得不错,有很高的利润和毛利成熟期:在后期大众也入场之后,行业基本进入稳定期。此时该入场的用户基本都入场了,用户群体很难再扩大了。此时行业开始进入内卷,优秀的龙头公司开始打价格战或者提升服务品质,逐渐淘汰一些相对没那么优秀的公司。最终发展成几家头部公司垄断行业的格局衰退期:此时不光没有新增用户,甚至用户找到了其他替代品,或者更先进的工具产品取代了现有的产品模式。用户开始流失,但是其他行业的挤占并不是一蹴而就的,是一个缓慢的过程,在这个过程中所有企业的日子都不好过,只能节衣缩食,进一步降低成本,苟延残喘。就像数码相机对胶卷相机的冲击,虽然胶卷不是在一瞬间消失的,但是慢慢的也掀不起什么浪花。一般来讲,处于导入期的行业正处在验证商业模式和吸引首批用户。这种企业一般没有上市,他们获得投资也都是通过天使轮的融资,普通的投资者很难接触到这类企业,而且即使接触到了因为这类行业往往失败概率高于成功概率,即使投资了也可能损失惨重。如何区分行业处于哪个区间呢?一个比较好的解决方案,是用渗透率作为划分产业生命周期不同阶段的依据。渗透率描述的是行业已经触达了多大比例的潜在用户,用公式表示就是渗透率=存量用户÷潜在客户群。一般来说,一旦行业的渗透率达到15%~20%,行业就会进入快速提升的阶段,此时对应的是行业的成长期。但是渗透率提升至35%~40%以后,行业发展的脚步往往就开始放慢了,此时对应的是行业的成熟期普通投资者能接触到的上市公司一般所处的行业都是处于成长期、成熟期和衰退期。书中作者认为,对于成长期的行业来说此时竞争格局尚未明细,但是可以明确知道该行业还没有兑换所有潜力,普通投资者可以选择投资对应的行业指数。而成熟期的行业,行业中一些低效企业已经逐渐清退,此时我们可以在市场错杀时投资该行业的龙头企业。至于衰退期行业,不要碰。处于不同区间的行业分析的重点也不一样。对于导入期的行业,我们最担心的是行业会走到创业失败的境地。因此,商业模式能够成立是最重要的。首先,判断需求是否真实存在;其次,判定盈利是否具有可持续性、商业模式能否大规模复制。如果商业模式不可行,背后只是个伪需求,那么也没什么投资的必要了。对于处于成长期的行业来说,市场规模更值得关注。针对处在成熟期的行业,我们需要重点评估行业的护城河是不是足够宽、是不是具备足够的防守性。至于已经进入衰退期的行业,我们应当把研究重心转移到替代品上,没必要在一棵树上吊死对于可行性的研究主要判断商业模式是否可行。以及背后的需求是否是真实存在的。我们实际上并不太关心商业模式具体的定义,我们需要的是一个如何进行商业模式分析的实操框架。对于商业模式的分析,作者给出了当前比较流行的商业模式画布,填充整个画布需要回答这么几个问题在价值主张方面:价值主张:回答企业提满足了用户什么需求,解决了用户什么问题客户细分:企业主要为哪一种或者哪几种客户提供服务客户关系:企业如何在每个细分市场建立并维护客户关系在运营模式方面:运营模式:企业是如何运营并维持商业模式核心资源:提供交付所必要的重要资产是什么在界面模式方面:渠道通路:如何通过沟通、分销和销售渠道向客户提供价值重要合作:有哪些业务外包,哪些资源需要从外部企业获得在盈利模式方面面:成本结构:商业模式所有环节中的成本构成收入来源:收入来源产生于成功为客户提供了价值主张如何判断需求是否合理?乔布斯说了很经典的一句话“在汽车发明之前,人们的需求是一辆舒服的马车”。这句话点出了我们实际上无法准确的预判用户的需求。但是我们根据一些原则可以判断当前的需求是否靠谱。人们的需求主要是衣、食、住、行、用。而“用”这个需求又衍生出更高级的需求,例如:获取、了解信息、学习的需求。衣的方面,最简单的就是人要穿衣服,发展出服装行业。衣服要洗要晒,发展出洗涤剂、洗衣机等电器需求食的方面,先从吃饭说起产生了食材生产的农、渔牧业,以及食品加工,餐饮业,甚至为了方便吃饭发展出了外卖行业住方面,提供房屋建材的林业,建材行业。以及后面的房地产、装修、酒店出行方面,现在的交通运输行业,汽车行业从古至今获取信息的方式不断发展进化,从最早的口口相传、到发明文字、到竹简、纸张、印刷业。再到如今更高级的广播、电视、流媒体行业所以针对新的需求,我们可以从这几个方面分析,它是否在衣食住行用方面提升了效率。例如电视行业提升了我们获取信息的效率。外卖行业提升了吃饭的效率。而在共享经济开始发展,万物皆可共享时就有不少共享经济倒台,归根结底因为它们本质上就是伪需求。例如共享篮球,篮球本身不贵,对于爱打篮球的人来说家中常备一个篮球并不是什么稀奇的事。而且一个篮球可以服务一群打篮球的人,所以共享篮球自然做不起来。需求存在我们还需判断需求能否卖出去,这方面可以参考欧美成熟市场,需求的蔓延一般从发达地区蔓延到欠发达地区。例如早期的支付宝模仿PayPal、微博对标现在的x、滴滴对标uber等等。需求能够卖出去我们还需要判断利润如何,利润可以从频次和弹性两个维度进行分析。一般来讲高频次和低弹性更容易因为规模和标准化形成规模效应能够降低生产成本,从而推高利润。而高频次和低弹性可以形成差异化需求,能够提供高度差异化的企业可以有较高的毛利率获得高利润。在行业导入期,商业模式还没有成型、需求还不确定,此时正处在试错环节。作为普通的投资者我们接触到的一般是二级市场上上市公司的股票,这种公司商业模式已经跑通了,我们只要查阅一些资料就能知道它的商业模式。我觉得如果查阅了大量资料也无法清楚的填写上述几个问题就证明我们实际上并不理解它的商业模式,此时遵循不懂不碰的原则就好了规模分析在成长期,我们更看中市场规模。我们可以通过一些数据来判断市场规模。主要有可获得市场、可服务市场和潜在市场。潜在市场:潜在的需求是多少,行业一共可以吸纳多少消费者可服务市场:当前已经存在多少消费者可获得市场:在可服务市场中,你又能获得多少消费者它们的关系是容纳关系,其中潜在市场包含可服务市场,可服务市场包含可获得市场。如果用做蛋糕比喻,潜在市场表示未来能将蛋糕做多大,可服务市场表示当前做出来的蛋糕有多大,可获得市场表示你能从当前蛋糕中拿走多大一块。在行业处于导入期时要关注潜在市场、处于成长期时要关注潜在市场和客服务市场、处于稳定期时一般兑现了潜在市场的全部潜力,这个时候需要关注可服务市场和可获得市场对于这些市场的数据我们可以参考一些券商给出的行业研究报告,但是需要注意它测算的方式方法是否准确。可以有这些测算的依据:需求导向:从需求角度出发来考量潜在市场有多大。市场规模=目标客户数 渗透率 客均订单量 * 客单价供给导向:从供给角度分析,一般用于测算可服务市场。供需匹配:将供给和需求结合起来,这种方法有一个大前提,供给和需求之前存在一个稳定的比例关系。这种一般适用于成熟期的行业护城河对于成熟期的行业,等待他的就三种宿命:被替代品革命,从此进入衰退期找到了第二增长曲线,相当于从导入期再来一遍成功阻挡替代品侵入,防守成功。但是行业的相关市场已经很难进一步开阔,会随着经济周期起伏变成周期性行业要避免进入衰退期,必须拥有自己的护城河。我们分析行业的护城河可以从以下几个方面入手:分析是否构成资源的垄断分析是否构成通过生产关系的独占。形成网络效应护城河我认为这就是马克思所说的生产资源和生产关系。形成资源垄断需要独占生产要素。目前我国把生产要素分为:劳动力、土地、资本、技术和数据劳动力指的是人,但是人很难长时间形成垄断。因为劳动力市场是自由的,人可以自由选择从事的行业,选择为不同行业的不同公司工作。而且现代企业和生产关系正在淡化个人对产品的影响力。例如各个工厂的流水线,预制菜对厨师的影响。不过凡是都有例外,有些行业最重要的卖点就是人。典型的像娱乐圈,明星这种劳动力就是极度稀缺的。但是明星也是人也会选择对自己未来最有利的条件。所以这种护城河并不宽泛,娱乐圈很多艺人红了之后选择自己成立公司为自己服务。还有一类是各行业的顶级人材,它们的存在可能改变整个行业的竞争格局。对于这种人才,企业一般给予丰厚的报酬,并且给予公司股份或者期权将个人发展与公司捆绑。不管是哪种人才,对于护城河的角度都是不可靠的。土地其实不仅仅指一块地皮,还包括其附带的资源禀赋和拥有的位置优势。就资源禀赋而言,采矿业就是非常典型的例子,其中,矿产资源是绝大部分行业的上游原材料,其带来的优势不言而喻。此外,自然资源并不局限于矿产等传统能源,气候资源也是土地这一生产要素所拥有的资源禀赋之一。一个典型的例子是茅台。除了资源禀赋,另一个由土地构建护城河的方式就是土地本身的位置优势。典型的例子就是房地产,地段好的房子价格也贵。而位于核心地段的高速、机场、高铁、码头港口等护城河就相对牢固。另外好地段的商铺、商场也算拥有土地优势另外如果行业的上下游产业都在一个园区那么可以节省很多运输成本和触达下游客户的交付成本。对于房地产、金融、汽车等重资产行业,以及获客成本和教育成本很高的部分互联网行业,资金门槛很高,只有拥有雄厚资本的企业才能笑到最后。早期开拓业务,行业进入稳定期之后开展各种价格战消灭潜在对手都需要大量的资本。并且资本雄厚的行业后期融资会更加容易,就像有句话说的“凡是有的,要给他更多;没有的连最后一些也要夺去”。而技术在广义上,技术不仅包含专利,还包括版权、秘方等多种形式。专利对于科技行业和医药行业,就像版权对于内容行业、秘方对于中医行业,是不容忽视的护城河。要注意的是,高技术可能只意味着生产难度变大,但不一定代表相关产品更被人所需要、更受市场欢迎。毕竟,消费者想要的往往只是一个带孔的墙,而不是一个电钻。如果市场上出现了另一条技术路线,比如数码相机对胶卷相机的取代,智能手机对原始诺基亚手机的取代。不过,在技术更新换代周期比较短的行业,专利所构建的护城河并非永远那么可靠。相比之下,版权的“保质期”显得更为长久,护城河也更为牢固。例如迪士尼的米老师、任天堂的三大IP:红帽子、绿帽子、黄耗子。但是虽然版权在知识产权角度来讲保质期长久,在消费者眼力可不一定。这么多年我们见识了一个又一个红极一时但又迅速湮灭的IP。所谓的秘方虽然没有专利保护和版权保护但是也是一种行业的壁垒,这种一般是行业发展过程中逐渐积累的经验、和技术诀窍。例如高科技行业的技术壁垒,虽然电子科技技术都是公开的,但是在生产方面,有些企业造出来的效果就是比别的好。数据方面比较抽象但是现在社会我们越来越看到数据的重要性。在AI时代机器学习主要依靠海量的数据对AI进行训练。数据的多少直接决定了AI产品的质量。也有一些行业直接对用户提供数据查询的服务,例如企查查这类查询企业的、懂车帝提供关于汽车的服务、各类房地产相关APP提供房产相关数据、StackOverflow 提供程序员技术相关的数据由劳动力、土地、资本、技术和数据构成了生产资源的垄断。企业生产经营一般会跟:政府、同行、供应商、最终消费者产生关系。生产关系也主要是这4个方面的关系政府关系方面:经营前需要取得合法的经营权,有时候这个经营牌照就是护城河,例如金融牌照,电力、能源、燃气等行业的特许经营权;还有政府政策支持的行业也算一种行业护城河,但是对于同一行业中的企业来说不一定算护城河。同样的,有些行业当前处于稳定期,龙头企业目前活得也比较滋润但是从政策上政府是限制或者打压的,这类行业会慢慢被其他行业所替代。与同行的关系:同行如果足够团结,也可以形成合力,让行业的护城河变得更宽;例如医药行业医生的行医许可在某些程度上提升了医生这一行的准入门槛。计算机行业有一些公开的标准,例如C/C++、Java 等语言标准,PDF、OFFICE标准。还有当前新能源汽车所谓的智驾标准从某种程度上是由一些大厂牵头为了实现自己的垄断将自己的技术形成标准提高准入门槛。与供应商的关系:与拥有稀缺资源的供应商签订独家供货协议可以达到间接控制这种稀缺资源的效果。例如当前我们经常看到某些AI厂商与英伟达签署单独的供应协议。游戏行业某些工作室只上PS、Xbox或者switch平台等等。这些措施可以凭借安全的供应链快速推出优质产品占领市场除了保持供应链安全,企业与供应商的议价能力同样重要。在这方面拼的主要就是规模了。企业强大的规模对供应商就有极强的议价能力。典型的例子就是沃尔玛。对于主打低价的品类来说,规模这个护城河让“外部进攻者”难以跨越。规模效应也是供应商答应签排他协议的理由之一。与客户的关系同样重要。消费者在购买某一产品或者服务时经历的思想路程一般是:决策→购买→使用。每一个环节都是企业维护客户关系的发力点决策方面可以打造品牌认知度,让客户形成思维惯性。消费者一旦建立起对品牌的基础认知,他们只需认准品牌就能买到对应质量的商品,而不用再花心思判断产品质量,这可以大大节省时间和精力。例如买手机、买车、买各种商品只认某一个品牌。从购买方面,可以打通销售渠道,让客户可以到处见到你的产品。例如可口可乐、康师傅、统一等企业的泡面茶饮料。在使用方面,可以提高转换成本。用户的转换成本包括:社交关系,例如手机号、社交平台。用户习惯:例如操作系统、手机学习成本:例如各种生产力工具,像Office、WPS、Visual Studio Code、JetBrains 的代码编辑器历史数据:例如云服务、笔记软件会员体系:例如高端会员制商店、信用卡、酒店、航空公司等长期合同:针对企业的Saas服务、电煤供应等一般来说,资产专用化程度越高、培训需求越大、转换适应时间越长、转换行为对用户的影响越大,用户的转换成本就越高。而用户的转换成本也不是一成不变的,只要新产品解决了这些转换成本,又提供了新的便利,那么用户很容易就转换过来了。例如有些网盘提供了其他网盘的数据导入,有些音乐软件提供的歌单导入。一些编辑器提供的快捷键、用户界面的自定义使得用户很容易从一款软件转化到另一款。竞争格局在一个行业蛋糕无法做大的基础上,我们寻找行业中的龙头公司进行投资,龙头公司的特征是拥有优秀的商业模式、极强的护城河。这两点可以套前面的模板来分析,而这部分是从供给侧来分析,看行业的自身因素和竞争格局是如何决定公司是否赚钱的。整个行业的格局可以分为横向格局和纵向格局。横向格局是研究同行之前怎么分蛋糕,而纵向格局是分析上下游是怎么分蛋糕的。只有整个行业的竞争格局比较理想时,也就是横向竞争没有那么激烈、纵向关系中企业拥有一定的议价权时,整个行业中的企业才能比较好地赚钱。对于公司来说,横向格局可以通过市占率来看企业在市场中的地位。对于行业来说更重要的是分析行业的竞争集中度。行业集中度是指一个行业中市场份额排在前n名的企业的市占率之和,写作“CRn”。例如CR3是用市占率排在前3名的企业的总体销售额除以整个行业的销售额,也就是市占率排在前3名的企业的市占率加总。CRn中的n到底取几并没有硬性规定,常见的有CR3、CR4、CR5和CR8。一般采用CR8来分析行业的集中度:分散竞争型:0%<CR8<20%低集中竞争型:20%≤CR8<40%低集中寡占型:40%≤CR8<70%极高寡占型:70%≤CR8≤100%从理论上说,随着行业集中度的提高,龙头企业的议价权随之增强,相应地,行业整体的盈利能力也会提升。对照着行业的四个生命周期,在行业进入导入期时市场刚刚兴起,只有少数公司,少数消费者体验产品。随着早期大众的入场行业进入成长期,此时竞争呈现分散类型,一方面是市场激增但是能提供服务的企业有限导致行业利润快速增长,但是利润的增长又会吸引新的入场玩家,此时可能进入低集中竞争。而随着行业进一步的发展,规模逐渐稳定,而入行的公司太多导致产能过剩,此时会清理出一批低效率的公司,慢慢进入低集中寡占型。最后行业逐渐稳定,龙头公司开始打价格战,行业内卷,有些成本过高的企业扛不住最终出局。行业进入极高寡占型。纵向格局的分析,我们要分析整个供应链。一个经典的模型是:原料商提供原材料,代工厂负责生产,品牌商负责营销,然后依靠经销商卖出去。在这个过程中,终端渠道往往分走终端收入的大头。产业链内部各环节之间的利润分配机制主要取决于各环节的议价意愿和议价能力。一般来说,在行业成长期增速很快,大家都有机会获得回报,“都有肉吃”。此时产业链的各个环节都愿意让出一部分利润增大产量,获取更高的利润总量。不过,一旦行业增速下降、市场饱和、进入成熟期,此时蛋糕就无法做大了,各方便开始互相博弈。此时议价意愿就比较低了,代工厂因为订单减少可能会增加订单的报价,品牌商可能会向供应商压价。对于议价能力,议价能力的关键在于评估对手方有没有得选。这主要看的还是各个环节的行业集中度以及供需情况。行业龙头一般有极强的议价能力。判断龙头可以采用下面几个指标:毛利率占用上下游资金的能力,对应在财报上就是应付账款和合同负债估值我们投资的收益主要来源于股价的变化,和公司自身对投资者的回报(分红和回购注销)。而公司有底气进行回报的前提是公司基本面良好,能赚钱。而分析公司的基本面可以通过上述方式进行,而价格的变化又来源于估值变化和盈利增长。常见的估值指标有:市盈率、市净率、市销率、企业价值倍数外部因素的影响对于基本面的分析,除了自身的发展规律之外,外部因素也会对行业发展产生影响。外部因素主要是文化、政治、经济和技术政治层面主要关注当前是对行业态度。持鼓励态度的一般有:口头鼓励、补贴减税、直接投资、强制使用。持打压态度的一般有:限制准入、限制供给、限制价格、限制受众。除了国内政策,国际政策特别是美国的政策对行业也是有很大的影响。美国政策的影响主要是货币政策和外交政策。货币政策主要考虑当前是加息或者降息政策,加息政策会导致居民更愿意存钱,那么用于投资的钱就少了,行业的估值就会降低。同理降息会推高估值。外交政策主要是进出口政策,例如加减关税,禁售等等。经济发展周期对行业也有影响:经济发展本身是有周期的,从盈利和经济周期关联度的强弱看,金融>周期>消费>成长。另外经济发展水平对行业也有影响,例如有些行业只会产生于经济发达地区,例如旅游业、教育业、文化体育娱乐行业。货币的供需状况会影响货币的价格,进而对各行各业的基本面和估值造成影响。货币的价格主要有购买力、利率和汇率。货币购买力的下降体现为物价的上涨,在经济学里这被称为“通货膨胀”,简称“通胀”。经济学中一般认为温和的通胀有利于经济的发展,而相反通缩会导致经济的衰退。当经济过热时,央行会采取加息的策略。此时存款会更具有吸引力,投资市场的钱流回到银行,并且因为存在更具性价比,所以消费者会倾向于存钱而减少消费。相反经济萎靡时,央行采取降息策略,银行的钱会流出,这些钱一部分会进行投资推高估值,另一方面进行消费,提升企业的收入,刺激经济汇率的影响主要是人民币对美元的汇率,人名币兑美元的汇率贬值意味着每一单位美元可以换到更多的人民币,这会刺激出口、抑制进口。文化会重塑我们的消费观和消费市场。首先文化会影响我们的人口结构,随着教育程度、社会保障方面的提高,生育已经不再是体现自己价值的手段、维护晚年生活的保证。生育观的转变会影响人口结构,人口结构会改变整个社会的消费场景。随着不婚不育的人口逐渐增多,单人经济崛起而婚庆、母婴、教育等行业开始衰退。未来老龄化的进一步加剧,医药科技行业可能会崛起。又比如公众对于健康的重视程度催生出饮料市场的无糖饮料、保健健身行业、以及医药行业。技术对行业也有推动效应。技术一方面会带来新的需求,产生新的应用。一般来讲技术的发展都是先构建底层舞台,然后由具体应用在舞台上唱戏。例如互联网行业的底层是网络协议的发展,而网络的发展得益于操作系统、硬件的发展。另一个层面,技术发展会带来降本增效的作用。让新品类逐渐替代旧品类。例如当前新能源汽车正在慢慢取代燃油车。技术方面我们要考虑技术成熟度,新出来的技术不一定能带来商业的增长,获得巨大利益的不一定是第一个吃螃蟹的人。技术行业有一句老话“领先一步是先进、领先两步是先驱、领先三步是先烈”。景气度我们通过景气度预测行业未来业绩。景气度就是指宏观经济或某一行业的繁荣程度。一个行业的景气度高,意味着该行业的营收和利润增速快;反过来,一个行业的景气度低,则意味着行业的营收和利润增速慢跟踪景气度可以通过横向和纵向两个方面来把握。通过行业关键指标把握景气度:上游主要看价格和库存;中游制造业主要看产销量;在大消费中,必选消费主要看通胀,可选消费主要看房地产业;电力及公用事业、交通运输、金融等服务业主要看宏观经济;而TMT等新兴行业主要看自身的产业周期。这些方面我们可以看一些券商的研究报告或者国家行业部分给出的行业数据方法论研究的方法论上,我觉得书中关于研究方法论的讲述于前面对行业的分析框架的论述相比并不是特别出色,所以这里我不打算像之前那样详细记述。但是书中提到一本书《金字塔原理》,我觉得可以加入我个人的书单日后仔细阅读一下可能再回过头来看这部分又有不同的感受。另外我在阅读其他网友的关于本书的评价中,提到《麦肯锡结构化分析思维》,这本书。评价也还不错,也加入书单
2026年07月11日
29 阅读
0 评论
0 点赞
1
...
5
6
7
...
45