首页
归档
友情链接
关于
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-06-04
使用C++20 的协程创建通用的生成器
在上一篇中,我们通过拆解一个简单的例子描述了C++20 处理协程的过程。在此先简单的回顾一下各个部分的作用回顾promise_type主要提供一些与协程相关的接口:initial_suspend: 协程实例创建时执行,通过返回值来决定协程创建的同时执行还是等待final_suspend: 协程实例执行完之后是暂停还是继续,继续意味着会销毁这个实例yield_value/await_transform: 协程函数中执行 co_yield/co_await 时负责将后面的操作数转化为等待体awaiter 对象get_return_object: 返回协程对象return_void / return_value: 真正获取协程函数 co_return 的返回值unhandled_exception 协程函数发生异常时调用等待体是协程函数中调用 co_await/co_yield 时创建, 主要用来告诉编译器遇到这两个操作符时应该继续执行还是等待, 关于等待体 awaiter 它有如下几个接口:bool await_ready() : 根据返回值决定是继续还是等待await_suspend(coroutine_handle<>) : 协程被挂起时调用await_resume() : 协程被恢复时调用关于等待体,标准库有两个简单的实现: suspend_always 和 suspend_never改进生成器c++ 23 中存在一个标准的生成器 std::generator,我们利用这个生成器可以将整个程序修改为:#include <coroutine> #include <iostream> #include <generator> #include <ranges> std::generator<int> fibonacci() { int a = 0; int b = 1; for (;;) { co_yield a; int next = a + b; a = b; b = next; } } int main() { for (auto x : fibonacci() | std::views::take(10)) { std::cout << x << std::endl; } return 0; }本文的目标是最终完成一个简单的、可用的、贴近标准库的 std::generator,进一步理解协程的原理 我们还是按照上一篇的组织方式,先放出完整的源代码,然后依次说明重要的点:#include <coroutine> #include <iostream> #include <generator> #include <ranges> template<typename T> struct Generator { struct promise_type { std::suspend_always initial_suspend() { return std::suspend_always{}; } std::suspend_always final_suspend() noexcept { return std::suspend_always{}; } void unhandled_exception() noexcept { _exp = std::current_exception(); } Generator get_return_object() { return Generator(std::coroutine_handle<promise_type>::from_promise(*this)); } void return_void() {} std::suspend_always yield_value(T value) { _value = std::move(value); return std::suspend_always{}; } void rethrow_if_exception() { if (_exp) throw _exp; } T _value = {}; std::exception_ptr _exp = nullptr; }; Generator(std::coroutine_handle<promise_type> h) : _handle(h) {} ~Generator() { if (_handle) _handle.destroy(); } Generator(const Generator&) = delete; Generator& operator=(const Generator&) = delete; Generator(Generator&& other) noexcept : _handle(std::exchange(other._handle, nullptr)) { } Generator& operator=(Generator&& other) { if (this != &other) { if (_handle) _handle.destroy(); //删除当前的协程,管理新协程 _handle = std::exchange(other._handle, nullptr); } return *this; } bool is_done() noexcept { return !_handle || _handle.done(); } T next() { if (is_done()) throw std::runtime_error("Generator exhausted"); _handle.resume(); _handle.promise().rethrow_if_exception(); return _handle.promise()._value; } std::coroutine_handle<promise_type> _handle; // 迭代器 struct Iterator { Generator& _gen; bool _is_end; Iterator(Generator& gen, bool is_end = false) : _gen(gen), _is_end(is_end) {} void move_next() { if (!_gen.is_done()) { _gen._handle.resume(); _gen._handle.promise().rethrow_if_exception(); } else { _is_end = true; } } T operator*() const { return _gen._handle.promise()._value; } Iterator& operator++() { move_next(); return *this; } bool operator!=(const Iterator& other) const { return other._is_end != _is_end; } }; Iterator begin() { Iterator it{ *this }; it.move_next(); return it; } Iterator end() { return Iterator{ *this, true }; } }; Generator<int> fibonacci() { int a = 0; int b = 1; for (;;) { co_yield a; int next = a + b; a = b; b = next; } } int main() { Generator<int> generator = fibonacci(); for (auto x : fibonacci()) { std::cout << x << std::endl; } // std::generator 示例 //for (auto x : fibonacci() | std::views::take(10)) //{ // std::cout << x << std::endl; //} return 0; }泛型与移动语义的优化之前我们在 yield_value 函数中传入的参数是int类型,所以在函数中直接采用赋值运算符没有任何问题,但是考虑到泛化之后它可以生成任意类型的数据,在处理大结构的数据时,采用赋值运算将会产生多余的拷贝。因为函数参数中已经进行了拷贝,同时值传递不影响外部真实的数据,我们直接对参数执行移动操作可以节省一次拷贝。异常处理的支持上一篇,我们简单的将将 unhandled_exception 设置为空函数,这次我们在 promise_type 中保存了一个 std::exception_ptr 异常类型的指针用来捕获协程函数中的异常。这个函数的实现也比较简单,我们说在协程函数发生异常时会调用 promise_type 结构中的 unhandled_exception 接口函数。这个函数中通过 _exp = std::current_exception(); 获取最新的异常信息并保存。在获取下一次的数据的时候,我们直接判断当前是否保存了异常信息,如果有则直接抛出。外界在调用next等函数获取值的时候可以直接捕获Generator 禁止拷贝、仅支持移动操作协程句柄 coroutine_handle 独占一段堆上分配的协程栈与 promise 对象,资源唯一不可共享。所以理论上只能有一个对象管理整个协程。如果允许拷贝,则会出现多个结构同时指向一个协程对象。这些结构在析构时多次调用destroy 造成重复销毁的问题。或者某个对象没有及时更新造成访问无效内存。而移动语义是所有权的转移,在同一时间有且只有一个对象真正的控制协程、拥有 coroutine_handle 句柄。配合最后的析构释放操作,能防止内存泄漏move_next 实现这里我们在迭代器中单独又写了一些与 Generator::next 相同的代码。这里主要出于两点考虑:Generator 支持通过next 来获取下一个数据,但是该函数返回T类型的下一个数据。外界实际上没有途经判断生成器是否已经无法生成多余的数据。所以我通过抛出异常,外界可以通过异常来判断是否还能生成数据,当然这里也可以使用 std::optional 来判断数据是否合理。既然会抛出异常,那么迭代器中的 move_next 就无法直接调用,谁也不希望范围for最后是靠异常退出的。迭代器需要一个end函数,end一般是返回一个越界的迭代器,在协程中我们实际上不需要构建一个额外的Generator 来判断是否越界。所以我在里面额外维护了一个 _is_end。利用该变量来判断迭代器是否越界了。基于以上理由,我没有复用 Generator::next 的代码另外在 Generator::begin 函数中,我们首先调用了一次 move_next ,然后才返回迭代器。这是因为我们的 initial_suspend 函数返回 suspend_always,在生成器对象被创建的时候协程还没有开始运行,此时生成器中的值是无效值。begin函数是用来获取它的起始值,此时值应该是有效的,所以提前调用一次 move_next 让它获取第一个值。小结当然标准库的 std::generator 实现比上述代码要复杂的多,特别是它支持 ranges 组件来设置范围,而我们的简单的生成器的退出完全依赖协程函数自身的退出条件,无法做到自主退出。希望通过本节各位读者能对协程的原理有一个更深入的理解。也希望这个简陋的实现可以做到抛砖引玉的作用。
2026年06月04日
29 阅读
0 评论
0 点赞
2026-05-30
农业银行(601288)初步分析
基本信息公司名称: 中国农业银行股份有限公司所处行业: 银行业 — 国有大型银行核心业务:主营存款、贷款、结算、银行卡、理财及托管等综合金融服务,深耕县域与三农金融市场,兼顾城市对公与零售业务。特点:全国性头部国有大行,县域网点覆盖最全、下沉深度最高;客户基数庞大、负债成本极低;经营风格保守稳健,风控严格,抗周期能力极强。商业模式盈利来源:核心依靠存贷款净息差赚取稳定收益,辅以理财代销、结算、银行卡、托管等中间业务增收,收入结构稳定。护城河:银行业强监管牌照壁垒,行业准入门槛极高,新竞争者极少;国有大行信用背书,揽储成本行业最低,负债端优势显著;全国海量线下网点+县域绝对垄断优势,用户粘性极强;经营风格保守,风控审慎,资产质量长期稳定。未来5到10年分红判断:银行属于国民经济刚需支柱,永续经营属性极强;农行风控保守、资本厚实、监管评级高,未来长期经营无暴雷风险。在监管约束与国企股东回报要求下,分红将长期持续,不会中断。分红历史连续分红: 连续分红16年不间断近 5 年分红: 近5年分红稳步提升近12个月股息率:3.95% 不满足个人4%股息率的买入条件分红率:30%,处于银行行业健康区间,未透支资本金融资派现比361.26%,回馈股东意愿强盈利稳定性5年净利润: 净利润低速稳健增长,无大幅波动5-10年营业额: 营业额稳定连续3年公司扣非净利润为正、净利润是否为正: 扣非净利润持续稳定低速增长,经营稳定特点:银行属于弱周期行业,叠加农行深耕县域、风控保守的特性,宏观经济波动对其冲击远小于股份行与中小银行,经济弱环境下仍能维持正增长,经营韧性极强。现金流经营活动现金流是否稳健: 经营活动现金流持续为正,但是呈现周期性变化近5年营业现金流大于净利润: 经营现金流远大于净利润连续3年自由现金流为正: 自由现金流持续为正财务安全资产负债率: 93.35% 为银行业正常水平,不代表高风险资本充足率: 17.93%,远超监管红线,自有资本厚实,分红与业务扩张均有保障不良贷款率: 1.27% 资产质量优质不良贷款拨备覆盖率:292.55% 资本充足总结:财务安全等级为顶级,无任何财务上的暴雷隐患。赚钱能力ROE: 近5年维持在10%~11%之间,且有小幅下滑趋势,整体偏平稳估值与安全边际股息率: 处于历史低位PE: 处于历史中等偏高水平PB: 处于历史中等偏高水平整体估值偏高,安全边际不足核心风险净息差进一步减少,未来盈利空间会进一步被压缩宏观经济波动可能导致不良贷款小幅上行银行业进入成熟期,整体无高增长,仅能赚取稳健分红收益。结论农业银行作为国有大型龙头银行,商业模式成熟稳定,牌照与国有背景构筑深厚壁垒,客户基础扎实、经营韧性极强。公司财务质量顶级,资本充足、不良率低、拨备储备丰厚,现金流充沛,连续多年稳定分红,股东回报意愿强,属于A股最稳的核心资产之一。但当前标的存在明显短板:股息率3.95%未达个人4%硬性买入标准,且PE、PB均处于历史中等偏高区间,整体无低估安全边际。最终操作策略:纳入核心观察股票池,不急于买入。等待后续股价回落,股息率回升至4%-5%以上、估值进入历史低分位、安全边际充足后,再择机分批配置。
2026年05月30日
42 阅读
0 评论
0 点赞
2026-05-30
双汇发展(000895)初步分析
基本信息公司名称: 河南双汇投资发展股份有限公司所处行业:食品饮料核心业务:公司聚焦肉类主业,构建了贯穿肉类全产业链的业务布局,主要产业涵盖饲料业、养殖业、屠宰业、肉制品加工业、外贸业、调味品业、包装业、商业等特点:国内生猪屠宰、肉制品绝对龙头,全产业链一体化(饲料 — 养殖 — 生猪屠宰 — 深加工肉制品 — 终端渠道),国内常温肉制品市占率断层领先。商业模式靠什么挣钱:生猪屠宰赚取屠宰加工费;火腿肠、低温熟食等肉制品产销赚取产品差价,配套包装、外贸为辅。护城河是什么: 覆盖饲料生产、牲畜饲养、宰杀到制作成食品的完整产业链,平抑未来猪价格变化;线上线下销售渠道广泛;产品的认可度未来5到10年分红会消失吗:不会,目前只要有火腿肠、火腿等肉食产品的需求,双汇的产品就不会受到影响。目前还没有一个同类的产品能达到双汇的规模、低价和全民认可度。但目前看高分红不一定能持续。分红历史连续多少年分红不间断: 29年分红不间断近5年分红是否稳定:近5年分红稳定,但是略有下降最近12个月股息率大概是多少:5.86%分红率 (分红/净利润):近5年一直维持在90%以上累计派现大于累计融资: 融资派现比为93.86%,不满足累计派现大于融资的条件盈利稳定性5 年净利润: 净利润常年 50 亿上下窄幅波动,无大幅涨跌;5-10 年营业额: 营收由高点回落、近年缓慢下行,稳定在 600 亿附近连续3年公司扣非净利润为正、净利润是否为正:扣非净利润持续为正,盈利底盘扎实,但成长性枯竭、业绩稳中趋弱;特点: 行业成熟期,存量市场竞争加剧,终端需求放缓,企业难以实现营收与利润持续增长现金流经营活动现金流是否稳健:经营现金流常年稳定在 50~70 亿区间,现金流稳健近5年营业现金流大于净利润: 双汇经营现金流长期显著高于净利润,利润现金含量充足连续3年自由现金流为正:自由现金流持续为正财务安全资产负债率: 近5年有扩大的趋势流动资产与流动负债的比: 近几年有下降趋势,最近为1.149, 刚好覆盖短期负债,安全边际偏弱是否有大的风险:目前没有大的偿债风险,但是需要警惕债务扩大的风险赚钱能力近3年ROE:24%, 高 ROE 一部分来自高杠杆 + 极致分红减少净资产,并非完全靠内生盈利扩张估值与安全边界股息率: 位于历史正常水平PB: 位于偏低水平PE: 位于历史偏低水平整体估值:整体估值处于合理偏低水平核心风险猪周期原料波动:全产业链对冲,影响弱于同行消费习惯转变:低温鲜肉、预制菜替代常温火腿肠,长期压制传统主业增长;食品安全黑天鹅为行业常态化风险;最近分红水平一直维持在90%以上,但是近几年债务水平上升,营业情况并未有明显提升,有透支未来经营的可能,未来高分红不一定能维持多次股权融资、累计分红不及募资,企业长期在向市场要钱,不符合优质现金奶牛标准。结论商业模式: 商业模式尚可,护城河优秀财务状况: 财务状况稳健,但是近年来债务水平有扩大的风险分红情况:分红连续稳定估值:估值水平在合理偏下双汇全产业链壁垒深厚、龙头地位稳固、现金流扎实、当前估值偏低、股息丰厚,从基本面和估值层面看似优质。但企业存在致命硬瑕疵:常年 90%+ 超高分红透支留存利润,内源积累缺失,只能依靠增发、举债补充经营资金,累计分红总额小于历史融资总额,违背个人选股硬性标准;叠加行业需求放缓、营收长期停滞,高分红难以永久维系,未来存在分红下调、业绩承压的潜在风险。综合风控要求,不纳入备选股票池,放弃配置。
2026年05月30日
29 阅读
0 评论
0 点赞
2026-05-25
C++ 20 协程的探索
C++ 20 中新增的协程特性可以说是近几年更新的最重要的一个特性。早在我使用python的时候,我就体会到python中的协程和它在处理list时使用yield 的优雅。现在C++ 也支持了协程,我们可以实现类似python中的功能了完整的协程例子在python中,我们可以实现如下的函数def fibonacci(n): a, b = 0, 1 for _ in range(n): yield a # 暂停函数,返回a a, b = b, a + b # 使用生成器 for num in fibonacci(5): print(num)早期的C++ 中我们只能使用std::vector<int> fibonacci(int n) { vector<int> res; int a = 0, b = 1; for(int i = 0; i < n; i++) { int c = a + b; a = b; b = c; res.push_back(c); } } for(auto i : fibonacci(5)) std::cout << i << std::endl;上面两个对比,python示例的特点在于它不是每次调用都计算指定范围内的所有结果,而是每调用一次接着上一次的进行调用,能极大的提升运行效率。一个好的消息是,在C++20 中新增了协程,我们也能实现类似的功能。而坏消息就是C++20 的协程设计成了底层的“语言特性骨架”,没有提供开箱即用的高层库,所以它的概念相对复杂。#include <coroutine> struct Generator { struct promise_type { int currentValue; std::suspend_always initial_suspend() { return std::suspend_always{}; } std::suspend_always final_suspend() noexcept { return std::suspend_always{}; } auto yield_value(int value) { currentValue = value; return std::suspend_always{}; } Generator get_return_object() { return Generator{ std::coroutine_handle<promise_type>::from_promise(*this) }; } void return_void() {} void unhandled_exception() { std::terminate(); } }; std::coroutine_handle<promise_type> h; Generator(std::coroutine_handle<promise_type> handle) : h(handle) {} ~Generator() { if (h) h.destroy(); } bool move_next() { if (!h || h.done()) return false; h.resume(); return !h.done(); } int get_value() { return h.promise().currentValue; } }; Generator fibonacci(int n) { int a = 0; int b = 1; int i = 0; while (i < n) { co_yield a; int next = a + b; a = b; b = next; i++; } } int _tmain(int argc, TCHAR* argv[]) { Generator generator = fibonacci(10); while (generator.move_next()) { std::cout << generator.get_value() << std::endl; } return 0; }比起python的版本,它确实复杂了不少。但是我们可以从逻辑上一一拆解协程实现原理首先我们知道,普通的函数是通过栈来存储数据的,在调用时首先经过参数压栈,然后在栈中初始化函数的局部变量,接着执行函数代码。在函数退出时要在接收返回值的内存处初始化返回值对象,最后执行出栈操作清理整个函数栈。协程函数是可以随时挂起并回退到调用处,或者由外部直接恢复执行的,所以在回到调用位置时并没有执行函数栈的清理操作,而且需要保存函数当前执行的上下文环境,在需要的时候进行恢复。C++的协程采用的是无栈的设计,也就是说协程函数本身并没有产生栈,它的所有信息由编译器生成处理。到这里我们知道针对每个协程,编译器会生成处理它的代码包括保存上下文环境,真正执行挂起和恢复。编译器中通过coroutine_handle 对象来管理每个协程对象。我们无需知道编译器具体是如何实现管理协程的,我们只需要获取它的对象,并调用对象的方法就能操作对象。这也是面向对象的体现。我们知道编译器是通过生成一个协程对象来管理协程的。那么它是什么时候生成这个对象的呢?答案是它在发现某个函数为协程函数时会生成一个协程对象,对象生成的时机早于协程函数开始执行的时候,主要是因为它需要接管协程函数的栈并保存上下文环境。那么编译器是如何知道某个函数是协程函数的呢?主要是通过识别里面是否有 co_await、co_yield、co_return 这么几个关键字。到此我们先梳理一下,首先编译器在编译时扫描到了函数中有 co_await、co_yield、co_return 这几个关键字,因此它会生成协程对象接管函数栈和上下文,并且不会为函数本身生成栈帧。对于协程函数,为什么不能直接返回具体的返回值类型,而需要利用结构体包装一层呢?例如对于 fibonacci,我们知道它实际返回的是int类型,为什么不能直接返回int 呢?如果我们直接返回int会得到这样的错误:error C2039: "promise_type": 不是 "std::coroutine_traits<int,int>" 的成员也就是说,协程的类型已经定义好了,它必须是 std::coroutine_traits<T> 的类型,我们可以在标准库中看到,这个类型的定定义如下:template <class _Ret, class = void> struct _Coroutine_traits {}; template <class _Ret> struct _Coroutine_traits<_Ret, void_t<typename _Ret::promise_type>> { using promise_type = typename _Ret::promise_type; }; _EXPORT_STD template <class _Ret, class...> struct coroutine_traits : _Coroutine_traits<_Ret> {};从上面可以看到,返回值必须要包含一个名为 promise_type 的结构。这个结构实际上是一个接口,在编译器帮我们管理协程,实现协程的创建、挂起、恢复、结束时它给我们提供了一系列的接口,方便我们在这些事件发生时执行一些自定义的代码。上面我们实现了这么两个接口:initial_suspend: 协程对象被创建时执行final_suspend: 协程对象被销毁时执行这两个函数的返回值也是一个接口,需要返回一个 awaiter(等待体)。这个 awaiter 我们也可以将它看作一个接口。它主要有三个函数需要实现:bool await_ready(): 如果返回 true,则表示已经就绪,无需挂起;否则表示需要挂起await_suspend(coroutine_handle<>) 当协程被挂起时,协程对象会保存当前协程的对象,此时 await_suspend 会被调用await_resume() 协程恢复执行时,该函数被调用需要注意,上面三个函数除了 await_ready 外,另外两个都没有给出返回值类型,标准并没有规定它们的返回值类型。这里我用了标准库实现的简单的等待体 std::suspend_always,它的实现如下:_EXPORT_STD struct suspend_always { _NODISCARD constexpr bool await_ready() const noexcept { return false; } constexpr void await_suspend(coroutine_handle<>) const noexcept {} constexpr void await_resume() const noexcept {} };还有一个类似的实现_EXPORT_STD struct suspend_never { _NODISCARD constexpr bool await_ready() const noexcept { return true; } constexpr void await_suspend(coroutine_handle<>) const noexcept {} constexpr void await_resume() const noexcept {} };到此为止,我们知道了4个接口,分别是协程对象被创建和销毁时调用,协程被挂起和恢复时调用。到这里,读者可能有疑问,这些接口为什么不设计到promise_type 里面,而非要放到两个结构里面,非要凭空多出一个概念呢?是不是这样更难理解,显得逼格更高呢?原因与难度和逼格无关,这是因为等待体主要是用来控制协程是挂起还是执行,以前我陷入了一个误区,我以前认为每次调用co_yield、co_await 一定会陷入等待。但是实际上它们只是操作等待体,与协程实际进行等待还是继续执行没有关系。我们是通过具体的等待体来实现此时协程是该继续执行还是等待。等待体与协程本身的控制应该分开,协程根据等待体的返回值来决定该等待还是继续执行。到这里我们再总结一次:编译器扫描到了协程函数,会定义一个协程对象来管理协程协程对象创建时执行 initial_suspend 函数,对象根据函数的返回值来决定是否要执行协程函数协程函数被执行时会依次执行,直到遇到 co_yield、co_await、co_return遇到上面的关键字之后它通过关键字操作的等待体中的 await_ready 的返回值来决定这个时候要不要接着执行协程如果需要挂起协程,那么它会调用等待体中的 await_suspend如果在外部恢复了协程,此时会调用等待体中的 await_resume如果协程函数结束了,会调用 final_suspend有读者可能会问了,你说 co_yield、co_await、co_return,我在上面的例子中也没看到有等待体呀。这是因为编译器对我们 co_yield a; 这个语句中执行了类型转换,将int转化为了等待体。我们在实现这个转化上有两种方式,第一个就是我自己定义一个等待体,然后通过构造函数实现int到等待体的转化,第二个就是实现接口, 对于co_yield 来说这个接口是一个名为 yield_value 的函数。编辑器在执行类型转化时,会进行下面的流程:如果在 promise_type 中定义了对应的转换函数,那么会调用转换函数来进行转换否则在全局查找能否有办法将后面的数据类型转化为一个等待体这里我没有自定义等待体,就采用最简单的 yeild_value了。对于 co_await 来说,可以通过 await_transform 函数来进行转化在上面的例子中,还有三个函数没有介绍到:get_return_objectreturn_voidunhandled_exception首先是 get_return_object,从名字上看,它是用来获取返回值对象的,我们是要用它来获取哪个返回值对象呢?是协程函数的吗?当然不是,这个函数是在协程对象自身被创建之后会调用,也就是说这里的返回对象其实是协程对象。return_void / return_value函数,这个函数是协程体结束之后如果协程函数自身返回时被调用,对于第一个函数,它调用的时机是在协程函数结束之前,而return_value 则是在调用 co_return 返回一个值。它们与 co_yield 类似,外部都是通过这种机制来实现获取协程执行到此的一些值,但是调用 return_void 和 return_value 之后意味着协程函数已经执行完毕,没有机会再恢复了。最后一个函数是:unhandled_exception, 这个函数表示,如果协程函数中发生异常,此函数将被调用。总结到此我们根据上述代码来总结一下协程的执行流程:编译器扫描到了协程函数,会定义一个协程管理对象来管理协程协程管理对象被创建之后,执行 get_return_object 此时外界有机会获取到管理对象,此时我们将handle 对象保存到了 Generator 对象中协程管理对象执行 initial_suspend 函数,对象根据函数的返回值来决定是否要执行协程函数。这里我们通过返回suspend_always 来将协程挂起外界通过执行 move_next 调用里面的 h.resume() 来恢复协程的执行,协程会按顺序执行直到遇到 co_yield、co_await、co_return这里遇到了关键字 co_yield 它会调用promise_type 中的 yield_value 执行整形数据到awaiter 的转化,这里返回suspend_always 来将协程挂起此时协程被挂起,那么它会调用等待体中的 await_suspend如果在下一次循环中又一次调用 move_next 恢复了协程,此时会调用等待体中的 await_resume就这样每调用一次 move_next 就执行一次计算,获取数列中的下一个数字循环结束,协程函数执行到函数体尾部或者执行了 co_return ,会调用 return_value或者 return_void 让外界有机会获取到协程函数本身的返回值,这个函数本身不返回值,所以这里会调用 return_void。协程函数结束了,执行 final_suspend,此时可以做一些清理工作。这里我们返回 suspend_always 来暂停协程,主要是为了协程结束之后,仍然可以获取协程计算的结果。主函数结束,Generator 对象被销毁,此时调用析构函数中的 h.destroy() 销毁协程管理对象
2026年05月25日
35 阅读
0 评论
0 点赞
2026-05-23
股票投资学习记录(五)——公司业务分析
在上一篇中,学习了如何分析公司的商业模式。商业模式决定公司能不能长久的轻松的赚钱。就好像一个高智商的学生要想取得好成绩比那些普通学生和低智商的学生要容易得多,但是并不是说智商高的学生成绩一定好,想要好成绩还需要努力学习。公司也是一样的,有好的模式,也需要良好的运作。这个运作主要是开展业务,一般来说就是生产、销售产品,提供平台和服务。本篇聚焦如何分析公司业务如何获取信息A股中拥有庞大数量的上市公司,我们不可能对于每一家都听过,了解,使用过产品。即使我们用过产品,听说过它的名字,想要详细的了解它的业务也是需要一些信息的。目前主要有下面几种获取信息的方式:公司官网:公司官网一般对公司的业务和产品有一个基本的介绍。上市公司的财报:这里说的财报是指每年每半年每季度发布的报告,并不单单指几张财务报表。从财报中我们可以知道公司具体业务有哪些,哪些业务或者产品最赚钱,都在赚谁的钱。券商关于公司的报告:一般在炒股网站上都有券商对于公司的分析报告,有时候我们自己分析可能出现漏洞,我们可以用券商的报告来查漏补缺行业官方的研报:一般在炒股网站上找到公司对应的行业可以找到。也可以在行业协会找到官方对于这个行业的描述以及对行业的相关情况我们可以自己去市场调研。这里的调研并不是那种高大上的,邀约公司高层参观公司工厂那种。对于大众消费品可以自己买他们的产品自己体验,或者对于日常消费品去超市观察一下买它的人多不多,超市在货架上放了多少它们公司的产品。人脉咨询:一般可以问问有些在上市公司工作的朋友问问。产品分析研究分析公司产品首先我们从公司的产品入手。这里我们不区分公司是产品型还是服务型还是平台型。广义上,公司都有相关的产品,平台型公司一般利用产品搭建平台。想要看懂一个公司的业务,最重要的就是看懂公司的产品。如果这个产品我们日常接触不到,一般就不要投资这家公司。只有能轻身体验产品的公司我们才能知道公司产品的优势在哪,为什么那么多人喜欢它。整个A股能覆盖到我们衣食住行用的公司非常多,足够我们投资了。而且芒格和巴菲特也说过自己一生真正搞懂的公司并不多,作为普通人我们能分析弄懂几家公司我觉得已经很不容易了。研究公司产品,我们可以首先找到公司的产品矩阵。用通俗易懂的话就是公司的产品是如何覆盖全应用场景的。大公司一般很少是靠单一产品的。例如苹果公司有iPad、iPhone、iwatch、iMac,甚至它们都有不同的配置不同的价格来适应不同的应用场景和用户。卖饮料的可口可乐也不止可乐一种产品,它也有雪碧等一系列不同风味的饮料。从财务上讲,收入多样化的公司未来风险、营收的增长都比收入单一的公司要好。研究公司产品矩阵我们可以找到公司的核心产品、战略产品、辅助产品、和未来淘汰的产品。其中核心产品就是公司的产品当前收入的主要来源。战略产品主要承担未来收入,公司产品升级转型的任务。辅助产品搭配核心产品一起使用增加产品的核心竞争力,一般是为当前产品提供一些增值服务,例如苹果的icare服务,快递公司提供的运费险,美团外卖的准时达等等。公司的持续发展,公司的产品一定会慢慢更新迭代,有些产品就会落后逐渐被淘汰。我们可以从财务报告中各个产品收入占比看到公司各个产品是否肩负起了它们各自的职责。除了在收入和服务上进行搭配外,公司的产品还可以分为垂直各种细分市场。例如苹果公司手机、平板、电脑、手表等数码产品覆盖数码设备的各个细分领域。国内比亚迪的车有个人消费者的小轿车,也有SUV、越野车等等。纵向划分就是公司是否覆盖消费者的各种收入区间,有面向高端用户的,也有面向低端用户的。从产品上来看公司的风险:面向单一用户的风险大于面向更广用户的。产品单一的风险大于产品多样的。产品地区化的风险大于产品在全国乃至全世界范围内的。例如从产品角度来讲,我认为美的的产品矩阵要优于格力,而且随着小米加入空调领域,对格力的冲击要比对美的大。虽然格力号称有空调核心技术,但是消费者会不会为核心技术的溢价买单又是另一回事了。了解了公司产品布局,我们下一步就需要分析公司产品力了。做同一类型的产品有很多家公司,并且每家公司都各有特点,对别是对于成熟的上市公司来讲,能长期经营,产品质量和服务上没有大的问题,它能于竞争对手拉开差距可能就在产品力这块。分析产品力可以从下面几个维度来进行:成本领先:一般成本领先有这么几种方式,靠走量来拉低成本,这种公司最典型的应该就是可口可乐了;或者靠供应商管理或者自身公司的管理来降本增效,这方面的代表可能就是小米了。技术领先:依靠强大的技术与竞争对手拉卡差距。这种公司的代表是苹果先发优势:这种公司技术上可能不是行业顶尖、成本也不算便宜但是因为最早进入市场,用户都习惯它,而且有很多基于它来提供的增值服务。最典型的应该就是微软了,现在肯定有人能做出比Windows、office等更好用更便宜的产品,但是有海量应用基于Windows、基于office,导致用户替代成本高。国内最典型的就是微信。品牌溢价:这种公司产品与市场上其他产品类似,特殊性不够,它们与其他竞品的唯一区别是贴了某个一个品牌的标。用户就认整个品牌。典型的像耐克、保时捷、一些奢侈品公司产品力的体现就是一个公司的产品能否具有定价权。定价权的问题在上一篇关于商业模式中已有详细的描述,这里就不展开了。产品的风险不光是产品型公司,只要是一家对外提供服务的公司,都具有下面的几种风险:产品线单一,或者说收入来源单一。从产品上看,可能就是依靠某一个产品挑大梁,有些公司没有上述提到的产品矩阵,或者产品矩阵中的各类产品完全担不起它们的任务;从服务的客户上来看,可能长期主要收入来源于某一个大客户。虽然暂时看起来各项数据都不错但是未来承担的风险以及未来的增长潜力是要比那些产品收入来源更合理的公司弱的丧失竞争力:平时我们持续跟踪买入的公司,观察公司的产品竞争力是否还在。会不会有更好的竞品政策风险:政策风险主要观察行业补贴是否存在,公司所从事的业务是否在政策红线上。例如当前新能源汽车存在政策补贴所有很多公司似乎活得都不错,一旦这个补贴停止了,很多公司可能就倒闭了;再比如曾经上层一纸红头文件将整个教培行业搅得天翻地覆。市场营销分析公司的产品解决的问题是公司提供的服务是否是有价值的,公司的产品能否持续稳定的创造价值;而这个价值要转化为收入和利润就需要市场营销。市场营销主要解决的是找到客户在哪,采用哪种方式,哪种价格把产品卖给客户。通常产品型企业的销售模式有三种:直销模式分销模式混合模式从名字上就很好理解,直销模式是企业自己建立销售团队,自己卖;而分销模式就是企业将产品卖给对应的中间商,由中间商负责往下销售。混合型的是兼顾这两种方式。例如苹果有自己的直营店也在京东、淘宝、天猫等平台进行销售,所以它是典型的混合型。而像可口可乐、调味品、一般的小零食,采用的是分销模式。在营销上我们要考虑下面几个维度的风险:渠道冲突:最近几年抖音直播带货兴起,会从传统渠道吸引一些客户。如果处理得当能保持现有渠道销售的情况下扩展新的销售渠道确实对公司是有好处的。但是有可能出现新兴渠道挤压现有渠道的客户。经销商流失:这与第一点是对应的,如果直销模式或者这种新兴的直播带货价格定位不合理挤压经销商的利润空间,经销商可能就会流失库存积压:与前面几个对应,如果处理不好销售渠道或者产品力丢失,会出现货卖不出去,产生库存积压。成本分析成本控制是企业经营很重要的一环,如果货卖的好但是成本上来了,可能导致入不敷出。成本控制好了,在销量提升的情况下能显著提升利润。对于服务型公司来说,成本主要是人力成本。每多服务一个客户就需要多一个员工,就要多出一分钱。而产品型公司的成本主要体现在材料、制造、销售成本。对于产品型公司来说,材料的成本包括原材料成本、人工成本、和制造成本。如果公司具备规模效应,那么随着规模的扩大,制造成本和人工成本对于原料成本来说可以忽略不计。在《一本书读懂财报》中,前两种属于固定成本,不管有没有生产,工厂的工人需要成本,工厂的水电需要成本。而原材料则是生产一件产品就消耗一份原材料,规模扩大之后固定成本会被平摊而原材料的消耗却无法平摊。成规模之后主要考虑的成本就是原材料价格的波动制造环节的成本主要取决于采用的制造模式,公司的制造模式主要有三种:自造模式:自建工厂,这种模式的好处是品控高,但是缺点是需要大量资金投入,灵活性低,出现问题不好调头代工模式:将自家产品的生产交由代工厂处理,这种就于自造模式不同,它是输入品控不好掌握,依靠供应链。好处是轻资产,不用投资建厂和养工厂,也比较灵活,出现问题时只需要减少订单就行混合模式:核心部件自产、而非核心采用代工。平衡成品与产品质量而销售成本我们主要考虑销售的投入能否带来业绩的增长,这个我们只需要持续跟踪报表中关于销售费用和营业额的变化就能知道
2026年05月23日
14 阅读
0 评论
0 点赞
2026-05-23
中国神华(601088)初步分析
基本信息公司名称: 中国神华能源股份有限公司所处行业:煤炭开采——动力煤核心业务:煤炭、电力的生产和销售、铁路港口和船舶运输,煤化工品制造特点:国内实力最强的煤炭、电力、运输、煤化工一体化开发企业商业模式靠什么挣钱:开采销售煤炭、火力发电并卖给电网,附带运输、化工等其他业务收入护城河是什么: 神华拥有煤炭开采、发电、加工成化学品以及运输的完整产业链。煤炭价格上涨靠卖煤对冲,煤炭价格下降靠发电对冲。煤炭行业里“周期最弱、最稳”的公司未来5到10年分红会消失吗:国内火电是基础兜底能源,风光水电无法完全替代;央企保供属性极强,永续经营确定性高。分红历史连续多少年分红不间断: 分红连续19年不间断近5年分红是否稳定:近5年分红金额随周期波动,但从未断分、从未大幅缩水;分红率从往年35%左右持续抬升至近年70%+,分红诚意持续提升最近12个月股息率大概是多少:股息率大概为4.47%左右分红率 (分红/净利润):78.22% ,从过去的35%左右提升到最近的70% 以上累计派现大于累计融资: 融资派现比 329.21% 满足条件盈利稳定性5 年净利润: 净利润不稳定,忽高忽低,近5年净利润下滑5-10 年营业额: 营业收入忽高忽低,最近5年营业额下滑连续3年公司扣非净利润为正、净利润是否为正:扣非净利润持续为正,盈利能力有保证特点: 公司属于典型周期能源行业,营收、净利润随煤价周期涨跌波动明显;近5年整体盈利小幅下行,但始终保持全年盈利、扣非净利润持续为正,经营韧性极强,无亏损暴雷历史。现金流经营活动现金流是否稳健:经营活动现金流持续为正, 但是周期性明显近5年营业现金流大于净利润: 近5年都能维持经营活动现金流大于净利润连续3年自由现金流为正:连续10年以上自由现金流为正, 且充沛财务安全资产负债率: 25年为23.31%,近几年略有降低,神华一直在还债,暂无暴雷风险流动资产与流动负债的比: 1.61 ,无短期偿债压力。是否有大的风险:财务上没有大的风险赚钱能力近3年ROE:虽然近几年一直下降,但是一直维持在10%以上,赚钱能力尚可估值与安全边界股息率: 股息率 4.19% 相对较低,在历史上也属于相对低位PB: 当前处于合理水平PE: 当前处于高估状态整体估值:无低估优势、安全边际薄弱,不具备左侧配置性价比。核心风险行业周期风险:煤炭价格波动直接影响煤炭板块利润,业绩天然具备周期性,无法像公用事业、消费一样平滑稳定。能源替代长期风险:国内风光水核电持续扩容,火电占比长期缓慢下行,行业无增长空间,属于存量成熟行业。政策限价风险:能源保供、电价煤价政策调控强,企业自主定价能力弱,利润上限被政策锁定。成长性缺失:企业体量巨大、行业见顶,未来无增量空间,只能赚分红钱,很难赚估值提升、业绩增长的钱。结论商业模式: 商业模式一般,虽然靠着垄断能有一些利润,但是成本不可控,目前火电与煤炭业务增长有限财务状况: 财务状况优秀,低负债、现金流充沛,无暴雷隐患分红情况:连续 19 年分红,股息率 4.19% 大于 4% 个人标准,派现远大于融资估值:大多处于合理水平,我个人认为比起来说安全边际不足神华的商业模式不属于优秀的范畴,虽然经营稳定但是属于赚辛苦钱,利润受原材料成本影响较大。因此我本人不打算投资它
2026年05月23日
25 阅读
0 评论
0 点赞
2026-05-17
读《财务报表分析与股票估值》
这本书主要介绍两个部分:通过财报分析公司经营情况,然后根据这些情况对股票内在价值进行估值。本书的亮点是作者本身是教财报的老师,但是与传统的学院派不同,作者自己亲自下场使用自己的投资逻辑进行投资并将这些逻辑转化为书中的内容,实操性强、有实践证明作者的方法是否准确在财报分析方面,作者围绕自己搭建的一套框架:公司战略—投资活动现金流(满足投资的筹资活动现金流)—资产经营(资本管理)—收入、成本费用、利润—经营活动现金流;进行分析,主要通过各种指标分析公司在这套以现金赚取更多现金的模式下运行的效果如何。判断财报的质量财报就像公司的体检报告,如果报告出具的单位不诚信,隐瞒重大事实,那么基于此财报后面的分析全是错误的,耽误时间是小事,如果因此做出了错误的投资操作,就会造成永久的本金损失。有以下几个判断财报是否值得分析的标准:确定审核意见:我们只分析标准无保留意见的财报确定会计政策:折旧政策(直线法和加速折旧法)、库存会计政策(先进先出法或平均成本法)、商誉减值和关于职工福利的会计政等等,如果发生变更或者公司与所在行业采取的政策不同,那么公司就有财务造假的嫌疑确定会计的灵活处理:对于具备太多会计灵活性的公司,我们一定要谨慎为上,例如水产养殖行业,我们无法确定下水捞鱼鳖,无法确定库存。评价信息披露的详细程度:作者个人经验是,如果看了一上午资料都无法理解的公司最好不要碰;一些危险的信号:财务报表上出现无法解释的数据变化,公司高管频繁变更,公司变更审计机构,频繁的重组、剥离、和股权转让,公司高管大量减持套现三张表的重构作者认为,传统的现金流量表、资产负债表、利润表对于投资者来说并没有很好的反应三者之间联动、互相作用的效果,因此作者对三张表进行了重构资产负债表的重构首先是资产负债表的重构,作者认为传统的资产负债表将所有资产、负债混列,无法清晰区分哪些是用于主营业务、创造价值的经营类项目,哪些是闲置资金、融资相关的金融类项目。基于上述逻辑,作者将其重构为资产资本表,它的核心逻辑是“资产=经营资产+金融资产;资本=经营负债+金融负债+股东权益”,实现经营与金融的明确分离。重构之后在资产端,经营资产是与企业主营业务直接相关的资产,包括应收账款、存货、固定资产、无形资产、商誉等,是企业价值创造的核心载体;金融资产则是企业闲置资金形成的投资,如货币资金、交易性金融资产、理财产品、债券投资等,其核心作用是实现资金保值,而非直接创造经营收益;长期股权投资因与企业战略布局相关,被单独列为一类,视为战略经营资产。在资本端经营负债是企业经营过程中自发形成的无息负债,如应付账款、应付职工薪酬、应交税费等,无需支付利息,属于企业的“免费资金”;金融负债是企业为融资产生的有息负债,如短期借款、长期借款、应付债券、融资租赁负债等,需要支付利息成本,反映企业的融资规模与财务杠杆。股东权益则保持传统口径,包括普通股、资本公积、留存收益、其他综合收益等。重构后,两个核心恒等公式尤为关键:净经营资产=经营资产−经营负债,净金融负债=金融负债−金融资产,且净经营资产=净金融负债+股东权益,这两个公式贯穿后续所有分析,是连接资产与资本、经营与金融的核心纽带。利润表的重构传统利润表以会计利润为核心,存在两大缺陷:一是未扣除股权资本成本,容易高估企业的盈利水平;二是包含大量非经常性损益,干扰对企业核心盈利能力的判断。因此,该书将利润表重构为“股权价值增加表”,核心逻辑是从经营利润出发,逐步推导至股权价值增加值,本质是借鉴经济增加值(EVA)的思路,衡量企业为股东创造的真实价值第一步,以营业收入为起点,扣除营业成本、税金及附加、销售费用、管理费用、研发费用,得到经营利润,这一步需剔除利息费用、投资收益、资产减值等与经营无关的损益项目,聚焦主营业务的盈利情况;第二步,用经营利润乘以(1−所得税税率),得到税后净营业利润(NOPAT),反映企业经营活动的税后真实收益;第三步,用税后净营业利润减去净经营资产乘以加权平均资本成本(WACC),得到经营资产价值增加值,衡量经营资产为企业创造的超额价值;第四步,加上金融资产收益、长期股权投资收益,减去金融费用及相关所得税调整,最终得到股权价值增加值,该指标直接反映企业为股东创造的真实价值,是判断企业盈利质量的核心指标。在重构过程中,需重点进行三项调整:一是资产减值按资产类型归入经营损益或金融损益,避免混淆;二是其他综合收益并入金融收益(税后),统一核算金融类收益;三是剔除营业外收支、政府补贴等非经常性损益,确保盈利数据反映企业核心经营能力。现金流量表的重构最后是现金流量表的重构,传统现金流量表分类模糊,投资现金流中包含大量理财相关的现金收支,难以准确判断企业主营业务的造血能力。该书对现金流量表的重构核心是“聚焦经营现金流与自由现金流”,剥离非主营业务的现金干扰,还原企业真实的现金创造能力。其中,经营活动现金流(CFO)仅保留与主营业务相关的现金流入与流出,剔除理财、利息、股利等金融类现金收支,直接反映企业主营业务的“造血能力”;自由现金流(FCF)则是在经营现金流的基础上进一步调整,分为经营资产FCF与股权FCFE:经营资产FCF=经营活动现金流−保全性资本支出,其中保全性资本支出是维持企业现有产能所需的资本开支,不包括扩张性资本支出,确保现金流反映企业维持正常经营的实际现金需求;股权FCFE=经营资产FCF−税后利息+新增借款−偿还本金,该指标反映企业可直接分配给股东的现金流量,是后续估值的核心基础。郭永清教授在书中强调,“现金流比利润更重要”,重构后的现金流量表,能更清晰地判断企业的现金创造能力、盈利真实性与财务健康度。财务指标分析报表重构是基础,在此之上,该书构建了系统的报表分析框架,将重构后的三张报表有机结合,从资产资本、盈利质量、现金流三个维度,全面拆解企业的经营状况与价值创造能力,同时通过ROE五因素分解,实现综合分析的闭环。在资产资本表分析中,核心是看企业的投入与效率,重点关注资产结构与资本结构两大维度。资产结构方面,区分轻资产与重资产模式:轻资产企业具有高ROIC(投资资本回报率)、低资本开支的特点,核心竞争力在于品牌、技术等无形资产,盈利稳定性更强;重资产企业则具有低ROIC、高折旧的特点,受行业周期影响较大,盈利波动相对明显。资本结构方面,重点关注净金融负债率(反映财务杠杆水平)与有息负债率(反映财务风险),合理的资本结构能平衡企业的盈利与风险,过高的有息负债会增加企业的利息负担,降低盈利质量。该维度的核心指标是ROIC,即税后净营业利润与净经营资产的比值,该书明确提出,ROIC>10%的企业属于优质企业,该指标是衡量经营资产回报率的核心,直接反映企业的价值创造能力。此外,净经营资产周转率(营业收入与净经营资产的比值)也是重要指标,反映企业经营资产的利用效率,周转率越高,说明资产运营能力越强。在股权价值增加表分析中,核心是看企业的盈利质量与可持续性。重点关注两个核心指标:一是核心利润占比,即核心利润与总利润的比值,该书提出,核心利润占比>80%的企业,盈利质量较高,说明企业的盈利主要来自主营业务,而非非经常性损益;二是毛利率与净利率的稳定性,连续3年以上毛利率、净利率稳定或稳步提升的企业,经营模式成熟,盈利可持续性强,需警惕毛利率、净利率异常波动的企业,可能存在盈利操纵或经营恶化的风险。而股权价值增加值则是最终的判断指标,连续为正的企业,说明其持续为股东创造价值;若连续为负,则说明企业在毁灭股东价值,需谨慎对待。现金流分析是全书的灵魂,郭永清教授反复强调,“盈利可以操纵,但现金流难以造假”,重构后的现金流分析,核心是关注经营现金流与股权价值增加的匹配度,该匹配度能直接反映企业利润的真实性。具体分为四种情况:当CFO/股权价值增加>1时,说明企业利润真实,现金充裕,盈利质量极高;当比值在0.7~1之间时,基本正常,但需关注现金流的稳定性;当比值<0.7时,说明企业利润可能存在虚增,需警惕应收账款、存货泡沫(如应收账款过高导致利润增加,但现金未实际到账);若比值长期<0,则说明企业主营业务缺乏造血能力,直接排除投资可能。此外,该书还总结了经营现金流的5种状态,帮助读者快速判断企业财务健康度:正CFO+正净利润,是最健康的状态,说明企业经营稳定、造血能力强;正CFO+负净利润,说明企业暂时亏损,但主营业务造血能力较强,可能是短期行业波动或投入导致,后续有望扭亏为盈;负CFO+正净利润,属于“纸面富贵”,利润缺乏现金支撑,风险较高;负CFO+负净利润,说明企业经营恶化,需规避;CFO剧烈波动,说明企业业务不稳定,经营风险较大。综合分析方面,该书提出了ROE五因素分解模型,将净资产收益率(ROE)拆解为五个核心因素,全面剖析企业盈利的来源,公式为:ROE=税收负担×经营利润率×净经营资产周转率×权益乘数×财务杠杆效应。其中,税收负担=1−实际税率,反映企业的税收成本;经营利润率=NOPAT/营收,反映企业主营业务的盈利效率;净经营资产周转率=营收/净经营资产,反映资产运营效率;权益乘数=净经营资产/股东权益,反映企业的资本结构;财务杠杆效应=(ROIC−税后债务成本)×净金融负债/股东权益,反映财务杠杆对ROE的放大或缩小作用。通过五因素分解,能清晰判断企业ROE的驱动因素,比如是靠经营效率提升,还是靠财务杠杆放大,从而更准确地评估企业的盈利质量与可持续性。估值分析报表重构与分析的最终目的是为股票估值服务,该书的核心落脚点是估值模型,将估值分为相对估值与绝对估值两类,其中自由现金流贴现(DCF)模型是全书重点,被称为“估值的终极方法”,而相对估值则主要用于快速筛选标的,需结合基本面与安全边际使用。相对估值法主要包括PE(市盈率)、PB(市净率)、PS(市销率)、PEG等常用指标,该方法的优势是简单易懂、操作便捷,能快速对比同行业企业的估值水平,适合初步筛选标的。但该书也明确指出了相对估值法的核心缺陷:受市场情绪、行业周期、会计政策影响较大,容易出现估值偏差,且低PE、低PB并不等于低估,可能是“价值陷阱”(如企业盈利持续恶化,导致PE看似较低)。因此,相对估值法仅适用于同行业、商业模式相近、现金流稳定的公司,且必须结合企业基本面分析与安全边际,不能单独作为估值依据。绝对估值法即自由现金流贴现(DCF)模型,其核心逻辑是“公司价值=未来自由现金流的现值之和”,反映企业的内在价值,不受市场情绪影响,是判断企业估值高低的核心方法。该书详细阐述了DCF模型的计算逻辑、步骤与实操要点,具体可分为五个部分。第一,明确公司价值构成。公司价值=金融资产账面价值+长期股权投资价值+经营资产价值,其中金融资产与长期股权投资的价值可按市值或账面价值计算(若波动较小,可直接采用账面价值),而经营资产价值是核心,等于未来经营资产FCF的现值之和,是DCF模型的计算重点。股权价值则是在公司价值的基础上减去净金融负债(债务价值按账面价值计算),即股权价值=公司价值−净金融负债,每股价值=股权价值/总股本。第二,自由现金流(FCF)的计算。理论上自由现金流是公司经营现金流净额扣除硬性的维持运营需要投入的资金以外其他可以自由支配的现金流。不同的行业采取的可能是不同的计算方法,对于一般的公司而言可以采用:经营资产自由现金流量=经营活动现金流量净额-长期经营资产减值损失-信用减值损失-固定资产折旧、油气资产折耗、生产性生物资产折旧、使用权资产折旧-无形资产摊销-长期待摊费用摊销-处置长期资产的损失-固定资产报废损失而对于机场、水电站这种建成之后摊平收租的企业来说,可以 通过自由现金流量=经营活动现金流量净额-经过计算得出的保全性资本支出 来计算。估值是艺术而不是科学,它建立在对公司业务具有深刻理解的基础之上,有深刻理解的一大条件就是能准确的判断当前产生的自由现金流,或者说能准确知道哪些是维持运营必须要投入的资金。第三,折现率的确定,折现率可以理解为投资人投资公司的资金成本,在《一本书读懂财报》中讲到,公司股权成本可以采用投资该行业的平均收益率。本书中认为,折现率因人而异,因具体的经济环境而异。可以采用当前5年国债利率加上4%~5%的风险溢价,如果认为公司经营未来风险比较高,那么风险溢价多一点,否则就少一点。例如我个人觉得如果投资沪宁高速这种低风险,经营稳定,同样线路又没有竞争对手的公司可以将风险溢价给到4%,现在国债利率为1.5%左右,也就是它的折现率我觉得可以给到5.5%到6%第四,估值模型的选择。该书推荐使用三阶段模型,根据企业的增长阶段分为零增长模型、固定增长模型与两阶段模型,其中两阶段模型最常用,适用于大多数企业。零增长模型适用于成熟、零增长的公司, 公式为$$ V = \frac{FCF}{r} $$固定增长模型适用于增长稳定的蓝筹企业,要求增长率g≤3%,公式为$$ V = \sum_{\infty}^{t=1} \frac{FCF_0(1+g)^n}{(1+r)^t} = FCF_0 \times \frac{1+g}{r-g}=\frac{FCF_1}{r-g} $$其中,FCF1为下一年度的自由现金流两阶段模型则分为高速增长期(通常为5–10年)与永续增长期,高速增长期需逐年预测自由现金流,第二阶段则给予较低的增长率,在实际应用中,有时候会对详细预测期进行简化,直接对第一阶段采用一个较高的增长率g1来替代大量的预测分析,第二阶段则采用一个较低的增长率g2。此时两阶段模型的公式为$$ 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)^t} $$第五,实操步骤。该书结合A股案例,给出了DCF估值的完整实操流程:第一步,历史重构,整理企业近3–5年的资产资本表、股权价值增加表,计算历史自由现金流,了解企业的经营规律与盈利特点;第二步,未来预测,结合行业发展趋势、企业核心竞争力,预测未来5–10年的营收增长率、经营利润率、资本开支率、营运资本周转率,进而预测每年的自由现金流;第三步,计算WACC,确定无风险利率、市场风险溢价、贝塔系数、债务成本等参数,合理估算WACC(通常为8%–10%);第四步,贴现自由现金流,采用两阶段模型,计算高速增长期自由现金流的现值与永续增长期终值的现值,加总得到经营资产价值;第五步,加总公司价值,将经营资产价值、金融资产价值、长期股权投资价值相加,得到公司总价值;第六步,计算股权价值与每股价值,用公司总价值减去净金融负债得到股权价值,再除以总股本得到每股价值;第七步,确定安全边际,该书强调,投资的核心是“安全边际”,只有当股价≤内在价值的50%–70%时,才具备投资价值,能有效规避估值风险。我认为本书的精髓在于给出了从财报分析公司,到根据这些分析对股票进行估值的详细过程,并且给出了一些真实企业的案例,后续可以跟着书中的思路,对一些股票池中的股票进行同样步骤的分析和估值,以此指导我们进行股票投资。也可以按照书中的具体案例重新走一遍作者的分析路线,重新给这些公司一个估值
2026年05月17日
34 阅读
0 评论
0 点赞
2026-05-17
美的集团(000333)初步分析
基本信息公司名称: 美的集团股份有限公司所处行业:家用电器 — 白家电龙头核心业务:主营家用空调、冰箱、洗衣机、小家电,同时布局工业自动化、机器人、海外家电、新能源及智能楼宇等多元业务。特点:国内白家电绝对龙头,空调、小家电市占率稳居行业前列;全球化布局完善,海内外双市场支撑业绩,品牌壁垒极强。商业模式靠什么挣钱:以各类白家电、小家电销售为核心利润来源,同时靠智能制造、机器人、海外业务、IoT 智能家居生态增收。护城河是什么: 品牌心智优势、全品类规模效应、供应链成本优势、渠道全网覆盖、全球化布局、研发与智能化技术壁垒。未来5到10年分红会消失吗:不会,家电行业是刚需,有自然更新换代周期;海外市场打开增量,龙头经营永续性强,分红不会中断。分红历史连续多少年分红不间断: 分红连续13年不间断近5年分红是否稳定:分红稳定提升,最近26年度分红有望超过每股4元最近12个月股息率大概是多少:股息率大概为5.21%左右分红率 (分红/净利润):73.81% ,历年股利支付率在逐年提升累计派现大于累计融资: 融资派现比 1122.25% 满足条件盈利稳定性5 年净利润: 近 5 年净利润整体稳健向上,没有大起大落;即便疫情、地产下行冲击,业绩韧性极强,无年度亏损,盈利稳定性拉满。5-10 年营业额: 近5年营业总收入维持不错的增长连续3年公司扣非净利润为正、净利润是否为正:连续10年以上净利润为正,盈利稳定性极强特点: 公司业务增长强劲,带动利润增长,属于典型的挣钱能力强的公司现金流经营活动现金流是否稳健:经营活动现金流持续为正, 最近25年有下降近5年营业现金流大于净利润: 近5年都能维持经营活动现金流大于净利润连续3年自由现金流为正:连续10年以上自由现金流为正, 且充沛财务安全资产负债率: 25年为61%,近几年略有降低,行业中等水平,无暴雷风险流动资产与流动负债的比: 1.21 属于行业正常水平,不算极强,但完全覆盖短期流动负债,无短期偿债压力。是否有大的风险:财务上没有大的风险赚钱能力近3年 ROE:近些年有下降的趋势,但是也有19%,赚钱能力优秀估值与安全边界股息率: 股息率 5.21% 相对较高,在历史上也属于相对高点PB: 当前处于低估状态PE: 当前处于中等水平核心风险国内地产景气低迷,拖累家电新房置换需求行业价格战加剧,挤压毛利率海外地缘贸易壁垒、汇率波动影响出口利润结论商业模式: 家电行业龙头,且产品线多,覆盖率广,市场占有率高财务状况: 财务状况优秀,低负债、现金流充沛,无暴雷隐患分红情况:连续 13 年分红,股息率 5% 大于 4% 个人标准,派现远大于融资估值:大多处于正常偏低水平,有一定的安全边界当前股息率5%远大于4%的标准,价格合理。可以考虑买入
2026年05月17日
20 阅读
0 评论
0 点赞
2026-05-10
宇通客车(600066)初步分析
基本信息公司名称: 宇通客车股份有限公司所处行业:汽车整车 — 客车细分龙头核心业务:客车产品研发、制造与销售。特点:国内客车绝对龙头,市占率常年断层第一;覆盖公交、客运、校车、新能源客车,海外出口体量行业第一商业模式靠什么挣钱:主营各类燃油 + 新能源客车销售,同时靠海外出口、售后维保、配件增值服务赚钱。护城河是什么: 国内客车行业龙头 + 规模效应,成本比小厂低;产品可靠性高、故障率低,政企采购优先选择;全国线下售后网点密集,政企客户粘性极强;出海品牌壁垒:海外市占率常年国内第一,打开第二增长曲线未来5到10年分红会消失吗:不会,客车是刚需公共交通资产,国内更新换代 + 海外新兴市场需求长期存在,龙头地位稳固,不会被轻易替代。分红历史连续多少年分红不间断: 分红连续24年不间断近5年分红是否稳定:分红稳定, 每10股分红稳定在15元左右最近12个月股息率大概是多少:股息率大概为7.01%左右分红率 (分红/净利润):99.65% ,分红率接近100%,意味着把当年赚的利润几乎全部分光,几乎不留留存利润用于:更新设备、研发新能源、应对行业下行、储备现金流累计派现大于累计融资: 融资派现比 510.59% 满足条件盈利稳定性5 年净利润: 近5年利润大幅增长,但是考虑到疫情的冲击,这些只是短期的业绩修复5-10 年营业额: 近5年营业总收入持续增长连续3年公司扣非净利润为正、净利润是否为正:连续10年以上净利润为正,近5年扣非净利润为正,且大幅增长,盈利稳定性极强特点: 公司经历行业低谷后近两年业绩触底回升、盈利修复明显;长期净利润、扣非净利润常年为正,经营韧性强;靠新能源转型 + 出海业务带来新的业绩增量。现金流经营活动现金流是否稳健:前4年经营活动的现金流持续大幅增加,25年大幅下降,但是现金流仍然充沛近5年营业现金流大于净利润: 近4年经营活动现金流净额均大于净利润,25年经营活动的现金流大幅下降小于净利润连续3年自由现金流为正:连续10年以上自由现金流为正财务安全资产负债率: 近几年维持在51%左右,行业中等水平,无暴雷风险流动资产与流动负债的比: 基本维持稳定,近期维持在1.8 左右,短期偿债能力极强,完全不用担心短期还债问题是否有大的风险:财务上没有大的风险赚钱能力近3年 ROE:近两年业绩反弹,ROE 大幅回升达到30%以上,但持续性存疑估值与安全边界股息率: 股息率 7% 极高,属于明显高收益区间PB: 中等偏上PE: 当前处于偏低水平核心风险国内公交、校车采购周期波动,业绩有周期性新能源客车行业竞争加剧,毛利率承压海外地缘政治、贸易壁垒影响出口业务分红率接近 100%,长期无法留存利润,未来分红有下调压力结论商业模式: 客车绝对龙头,技术、售后、海外出口构筑强壁垒,业务永续性强财务状况: 财务状况优秀,低负债、现金流充沛,无暴雷隐患分红情况:连续 24 年分红,股息率 7% 远超 4% 个人标准,派现远大于融资估值:PE 处于历史偏低位置,有一定安全边际;两大核心隐患需要进一步排查:分红率高达 99.65%,几乎分光全年利润,长期分红可持续性存疑;2025 年经营现金流大幅下滑,多年首次现金流小于净利润,盈利现金质量变差,需查明原因是否为基本面恶化。当前股息率7%远大于4%的标准,价格合理。不急于买入;必须先搞懂「现金流下滑原因、高分红是否透支未来」,排除基本面隐患后,再考虑配置。
2026年05月10日
31 阅读
0 评论
0 点赞
2026-05-04
股票投资学习记录(四)——公司商业模式分析
在分析公司时,商业模式是重中之重,甚至可以说是我们决定是否投资的首要条件。好的商业模式+高效执行,才能收获理想的投资结果;反之,即便执行能力再强,糟糕的商业模式也很难带来出色的回报。商业模式直接决定了公司赚钱“累不累”、能否实现快速扩张,以及能否获得长期持续的增长动能。这一篇我想要解决这么几个问题:什么是商业模式为什么商业模式如此重要常见的商业模式有哪些如何分析一家企业的商业模式为什么商业模式如此重要在投资决策中,我们可以将公司大致分为三类:优秀公司、中等公司和垃圾公司。格雷厄姆在《聪明的投资者》中告诫我们,要投资具备安全边际的龙头公司,这类公司正是各行业的优秀代表。垃圾公司往往能通过财务指标快速筛选——比如常年净利润为负、负债率远超经营活动现金流承载能力,或是持续依赖外部融资维持运营。而区分中等公司与优秀公司的核心关键,恰恰是商业模式。中等公司与优秀公司的经营执行力往往不相上下,但最终的盈利水平和成长空间却天差地别。俗话说“女怕嫁错郎,男怕入错行”,商业模式的差异,本质上就是“赚钱难度”的差异:有些模式几乎能“躺着赚钱”,有些模式却要“赚着卖白菜的钱,操着卖白粉的心”。因此,投资的核心逻辑之一,就是优先选择商业模式优秀的公司。什么是商业模式商业模式并非高大上、难以理解的概念,恰恰相反,它非常接地气,核心就是回答两个问题:公司靠什么挣钱?怎么持续挣钱?我们可以用个人赚钱方式类比公司的商业模式,更易理解:出售时间:给公司打工,用时间换取劳动报酬;对应到公司,就是提供外包服务、定制方案等,每多服务一个客户,就需要额外投入人力、时间等成本,增长空间相对有限。出售产品:自己创造产品(如自媒体、课程、APP、书籍等),靠产品销售盈利;对应到公司,就是各类产品型企业——卖手机的苹果、小米,卖电脑的戴尔、联想,以及卖家电、食品、软件的公司都属于这类。这类模式通常优于服务型,核心原因是产品可大规模、低成本复制,一旦完成设计、生产和上市,销量提升无需额外消耗过多核心资源。出租资源:自己买一堆房子,靠房子出租获得收入,这一类赚钱方法对应到公司上就是公司靠自身拥有的资本(或资源)出租获利;在互联网时代,最典型的资源就是“平台”。比如打车平台、外卖平台,这类模式比产品型更具优势——产品型公司扩张时,需要新增工厂、生产线、工人等投入,而平台型公司一旦搭建完成,服务客户量的增加几乎无需额外付出过高成本,扩张效率极高。常见的商业模式有哪些网上关于商业模式的解读,往往充斥着复杂术语,难以直观理解。我结合自身理解,将常见商业模式归类到上述三种核心类型中(仅为个人解读,供参考,不代表绝对标准)。传统基础的商业模式制造业:企业通过大规模生产产品,直接销售给经销商或终端客户,盈利来自产品进销差价。这属于典型的产品型模式,核心是通过生产制造满足消费者需求。例如数码行业的苹果、三星、小米,汽车行业的本田、丰田、比亚迪等,均属于此类。零售模式:企业从供应商采购产品,通过线下门店、线上店铺等渠道,以更高价格销售给终端消费者,盈利来自零售差价。常见于沃尔玛、线下京东超市等超市业态,本质上也属于产品型公司——自身不生产产品,相当于将生产环节外包,核心是通过渠道优势将产品传递给千家万户。服务模式:企业通过提供特定服务满足客户需求,盈利来自服务费,比如法律服务、会计服务、定制软件开发服务等企业。需注意:有观点将银行归为服务行业,但我个人更倾向于将其归为“资源出租型”——银行收集用户闲置资金,再出租给有资金需求的用户,赚取利差,这与滴滴整合闲置车辆资源、出租给有出行需求的用户的逻辑一致。新型及复合商业模式平台双边模式:核心是搭建平台,连接供需双方,自身不直接提供产品/服务,通过收取佣金、服务费、广告费等盈利,核心优势是网络效应(供需双方越多,平台价值越高)。这类模式属于“出租资源型”,平台本身就是核心资源,企业通过搭建平台,供用户享受和消费资源获利。订阅模式:企业向用户提供定期的产品/服务,用户通过按月、按年付费获取权益,盈利来自稳定的订阅收入,核心是提升用户留存率、降低流失率。这类模式需结合具体服务内容归类:提供专业软件订阅的,属于产品型;流媒体平台(如网飞、哔哩哔哩)则属于平台型,采用“两头收费”模式——内容提供商需付费获得推广,用户需付费观看高质量内容。免费增值模式(Freemium):基础功能免费,吸引海量用户,高端功能、增值服务付费,盈利来自付费用户的增值服务费,核心是提升免费用户向付费用户的转化率。这类公司本质上属于产品型,但部分企业会逐步向平台型转型,通过积累用户构建生态。共享经济模式:通过互联网平台整合闲置资源,实现资源高效利用,企业通过收取平台服务费盈利,核心是资源标准化和信任体系构建。这类模式属于平台型,例如摩拜单车——虽自身提供单车资源,但核心盈利逻辑是通过单车出租获取服务费,本质是资源出租。剃须刀-刀片模式(诱饵模式):以低价销售主产品(诱饵)锁定用户,再通过销售高利润耗材、后续服务盈利,核心是提高客户转换成本和耗材定价权。典型案例是游戏机业务:游戏机低价销售,后续通过平台售卖游戏,向开发商和玩家双向收费。这类模式属于复合类型——售卖的游戏机是产品型,搭建的应用商店是平台型。如何分析一家公司的商业模式分析商业模式的核心,就是回归其本质——公司靠什么赚钱。在此基础上,我们只需问自己三个关键问题,就能快速判断商业模式的优劣:它卖什么赚钱?它卖的产品/服务是标准化的吗?能大规模生产/复制吗?它能“躺着不动”就赚钱吗?结合具体案例,我们可以更清晰地理解这三个问题的应用:餐饮行业的模式转型早期餐饮行业的核心依赖厨师,菜品口味高度取决于厨师水平,即便两名高水平厨师,炒出的菜也可能存在差异。每开一家新店,都需要依赖优秀厨师,导致口味难以统一,无法快速扩张,也无法实现大规模标准化生产——这就是典型的服务型模式,增长受限。麦当劳、肯德基率先打破这一困境:通过制定统一的烹饪标准,所有门店使用相同原材料,薯条在固定油温下炸制固定时间,确保无论谁操作,都能做出口味一致的产品。这一变革,让餐饮行业从服务型成功转型为产品型,大幅降低了扩张成本,实现了规模化发展。中餐厅中,火锅是最易实现标准化的品类:火锅底料可工业化大规模生产,食材只需提前备好,无需厨师现场烹饪,消费者自行涮煮即可。这种模式也能轻松实现产品化和规模化扩张。服装行业的标准化变革早期裁缝店的模式的是“量身定制”:顾客选料后,裁缝量取个人尺寸,再手工制作,由于每个人的身材、审美不同,无法批量生产,属于服务型模式,增长有限。现代服装工业解决了这一痛点:按照国际通用尺码,批量生产标准化服装、鞋子,顾客根据自身身材挑选合身产品,实现了大规模生产和销售,成功转型为产品型模式,扩张效率大幅提升。快递行业的模式局限快递行业的核心痛点的是“无法标准化”:每个客户的住址、寄送物品、寄送需求都不同,无法用统一标准服务所有客户。业务规模扩大时,必须新增快递员、开辟新运输路线,运营成本随规模同步增加,难以实现大规模同质化服务,因此本质上仍属于服务型模式,增长潜力有限。核心总结:产品型、服务型与平台型的区别搞清楚“卖什么”,以及“能否标准化、大规模生产”,就能判断公司是产品型还是服务型;而第三个问题“能否躺着赚钱”,则是区分产品型与平台型的关键。产品型公司的特点类似“一锤子买卖”:一手交钱、一手交货,每一笔新业务都需要公司新增投入。例如,消费者每买一台iPhone,苹果就需要额外生产一台,本质是“投入-产出”的线性关系。平台型公司的核心优势是“一次投入,持续收益”:一旦平台搭建完成,无需过多额外投入,就能持续赚钱。例如:苹果的iPhone、iMac、iPad是产品型业务,但在此基础上搭建的App Store、iTunes的是平台型业务——每一笔用户与开发商的交易,苹果都会收取佣金。Steam平台、游戏机厂商的应用商店,均属于平台型业务,靠平台交易抽水盈利。国内的高速公司、港口、机场等,属于传统资源出租型平台;美团、京东、滴滴、淘宝、拼多多等,属于互联网平台型公司,靠整合供需资源、收取服务费盈利。补充案例:早期微软的Office、Windows属于产品型业务,靠每台电脑的装机费盈利,后续需按合同提供维护更新,要想获得新收入,必须推出功能大幅升级的新版本。而近年来,微软等软件公司纷纷向平台型转型,推出订阅制和SaaS模式,核心是将“一锤子买卖”转化为持续稳定的现金流——虽仍需持续维护、更新功能,但能实现长期收益,比传统产品型模式更具优势。投资决策建议从投资角度来看,服务型公司的潜力相对有限——业务增长往往伴随着运营成本的同步提升,盈利效率偏低。当然,能实现上市的服务型公司,在运营管理、细分领域竞争力上可能优于很多产品型、平台型公司,但就像“资质普通的人,付出数倍努力才勉强达到中游水平”,长期成长空间和盈利稳定性仍有局限,我个人不建议优先投资这类公司。产品型公司:优先选择“高用户黏性、有定价权”的标的产品型与平台型公司并无绝对优劣——虽然平台型公司赚钱更轻松,但产品型公司的成长潜力并不逊色。当前全球股市市值最高的公司(英伟达、特斯拉、苹果、微软),均属于产品型公司,这足以证明产品型公司的投资价值。这些顶级产品型公司的共同特点是:依靠强大的产品力,与用户建立强绑定,并逐步将产品优势转化为平台优势。因此,投资产品型公司的核心,是选择“用户黏性极强、几乎离不开”的标的——这类公司最有能力将产品力转化为“躺着赚钱”的平台。判断产品型公司用户黏性的关键指标,是“定价权”。这里的定价权,并非“想定多少就定多少”,而是“自身定价能影响竞争对手”。例如,国内矿泉水普遍卖2元,核心原因是可口可乐的瓶装水定价3元,形成了行业价格锚点——这就是定价权。科技类产品公司的定价权,通常体现在高毛利率上;食品饮料类产品公司,多采用“薄利多销”策略,定价权体现在行业定价主导地位上。平台型公司:优先选择“护城河极深、无明显对手”的标的平台型公司的核心风险,是“平台领先优势的丧失”。例如,美团的核心盈利来自外卖平台,若有大型互联网公司(如阿里、京东)决心进军外卖行业,凭借资金、流量优势抢占市场,美团的现有优势可能快速瓦解;同理,淘宝、京东等电商平台,也面临着新玩家崛起的潜在风险。这类公司本质上是将线下的商业模式搬到线上,没有技术优势,它们能建立起来纯粹是最早在国内实践并成功,无法有效阻止潜在玩家入场。因此,投资平台型公司,必须选择“几年甚至十几年内看不到明确对手、拥有极深护城河”的标的。这类公司要么具备技术断层领先优势,要么通过自身运营水平将价格压倒极低,要么拥有垄断性资源——例如,央国企控制的水电、机场、高速、铁路等,具备天然的垄断优势,护城河极深;部分互联网平台若能形成强大的网络效应、用户粘性,也能构建难以突破的护城河。
2026年05月04日
23 阅读
0 评论
0 点赞
1
...
7
8
9
...
45