作者: ianzhi

  • 红利资产的长期配置价值:从股息率角度看投资逻辑

    红利资产的长期配置价值:从股息率角度看投资逻辑

    红利资产的长期配置价值:从股息率角度看投资逻辑

    在A股市场波动加剧、利率中枢下移的背景下,红利资产正成为越来越多长期资金的配置首选。本文从股息率角度出发,系统梳理红利资产的投资逻辑、历史表现及选股框架,为稳健型投资者提供参考。

    一、什么是红利资产

    红利资产是指那些持续、稳定派发现金股息的上市公司股票。典型特征包括:

    • 股息率较高(通常年化超过3%,显著高于十年期国债收益率)
    • 盈利稳定,现金流充沛,具备持续分红能力
    • 行业多集中于银行、公用事业、高速公路、能源等成熟行业
    • 估值相对保守,市场情绪波动对其影响较小

    二、红利策略的历史表现

    回溯A股历史数据,中证红利指数长期跑赢沪深300指数,尤其在震荡市和熊市中表现出显著的防御属性。核心原因有三:

    1. 股息复利效应:高股息再投资,长期复利显著
    2. 低估值保护:低市盈率买入,安全边际较高
    3. 情绪避险:市场恐慌时,稳健分红资产获增量资金青睐
    

    三、如何评估一只红利股

    并非所有”高股息”都值得配置,需综合以下维度评估:

    指标合理区间说明
    股息率3%~7%过高需警惕不可持续性
    分红比例30%~80%过低说明吝啬,过高不可持续
    净资产收益率(ROE)>10%高ROE支撑持续分红能力
    经营性现金流/净利润>0.8验证盈利质量
    有息负债率<50%防范高杠杆侵蚀分红能力

    四、当前市场环境下的配置逻辑

    2026年以来,在利率下行、资管产品收益率普遍走低的背景下,红利资产的相对吸引力进一步提升:

    1. 无风险利率下行:十年期国债收益率维持低位,3%以上的股息率具备显著比较优势。
    2. 长期资金入市:保险、社保等长期资金持续增配高股息资产,形成资金面支撑。
    3. 估值仍处合理区间:中证红利指数市盈率仍在历史中位数附近,未出现系统性高估。

    需要注意的是,红利策略并非”无风险策略”。当利率转向上行、资金偏好成长风格时,红利资产可能阶段性跑输市场,投资者需有周期视角。

    五、选股实操框架

    结合上述分析,构建红利组合时可遵循以下三步筛选法:

    第一步:初筛
      - 近3年持续现金分红
      - 近12个月股息率 ≥ 3%
      - 总市值 > 100亿(防范小盘流动性风险)
    
    第二步:质量排除
      - 经营性现金流连续2年为负 → 排除
      - 有息负债率 > 70% → 排除
      - 分红比例 > 100%(透支式分红)→ 排除
    
    第三步:估值保护
      - 市盈率 < 行业中位数
      - 市净率 > 0.8(防范"价值陷阱")
    

    六、风险提示

    红利资产并非没有风险,投资者应关注以下三类风险:

    • 行业周期风险:能源、原材料类红利股受大宗商品价格影响较大,股息可持续性存在周期波动。
    • 政策风险:公用事业、银行等高股息板块受监管政策影响显著,分红比例可能因政策要求而调整。
    • 估值修复风险:当市场风格转向成长、利率预期上行时,红利资产可能面临估值压缩。

    总体而言,红利资产适合作为长期资产配置的”压舱石”,而非短期博弈工具。投资者应以其股息收入的确定性,对抗市场波动的不确定性。


    本文不构成投资建议,投资有风险,入市需谨慎。

  • 创业板新高下的残酷分化:5月28日A股复盘

    创业板新高下的残酷分化:5月28日A股复盘

    指数概览:双创板强势领涨

    5月28日,A股在前一日大跌后低开高走,三大指数全线收红。截至收盘:

    指数收盘点位涨跌幅
    上证指数4,098.64+0.12%
    深证成指15,861.89+0.80%
    创业板指4,125.07+1.96%
    科创50+1.59%
    北证50+2.55%

    两市全天成交约2.99万亿元,较前一交易日缩量逾2700亿元,为连续第24个交易日成交额超2.5万亿元。个股方面,上涨3018只、下跌2365只,涨停126只、跌停12只,涨跌比约1.27:1。

    从日K线来看,上证指数盘中最低探至4,055.83点——击穿了4月下旬整理平台下沿后,在双创板带动下回升,但尾盘仍未能站稳4,100点整数关口。创业板指则低开高走、振幅达4.05%,以盘中最高4,135.38点刷新历史新高后高位震荡。

    板块分化:通信半导体一枝独秀

    31个申万一级行业涨跌参半,通信板块以4.59%的涨幅遥遥领先,建筑材料(+3.78%)和电子(+1.73%)紧随其后。题材概念层面,靶材(+9.45%)、锗镓概念(+7.75%)、电子布(+7.41%)涨幅居前。

    跌幅榜方面,前一日获避险资金流入的食品饮料(-2.00%)、商贸零售(-1.80%)和非银金融(-1.74%)成为拖累大盘的主要力量,防御性板块普遍回落。

    资金面同样呈现极端偏好:主力资金净流入前三的概念为5G(+169亿元)、通信技术(+156亿元)和光通信(+99亿元),而人形机器人、特斯拉概念、存储芯片则分别净流出86亿元、86亿元和82亿元。通信板块单日吸纳资金量之大,在近期市场中实属罕见。

    光模块三巨头:推高指数的”定海神针”

    创业板指年内涨幅已达28.78%,而同期约57%的个股年内下跌。这种”指数牛市、个股熊市”的分化核心在于权重结构。

    Wind数据显示,中际旭创、新易盛、天孚通信三只光模块龙头在创业板指中的合计权重超过20%。5月28日,这三家公司股价再度集体刷新历史新高:中际旭创大涨逾7%,市值站上1.33万亿元;新易盛收涨逾3%,市值超7150亿元;天孚通信涨逾4%,市值逼近3500亿元。

    换句话说,仅这三只股票就贡献了创业板指当日涨幅的绝大部分。指数新高的背后,是少数龙头的狂欢,而非市场整体繁荣。

    背后的隐忧:两个”背离”暗藏风险

    第一重背离:指数与个股。年初至今,在全市场5500余只个股中,下跌的多达3150只,其中跌幅超过20%的有1032只。在指数不断创新高的同时,约六成投资者可能面临亏损,这已在相当程度上动摇了市场信心基础。

    第二重背离:成交缩量与情绪过热。虽然成交仍维持在2.5万亿以上,但28日缩量逾2700亿元,反映出市场的追高意愿正在减弱。银河证券分析师明确指出:中小综指、平均股价指数的破位阳线属于”下降趋势中的正常反抽”,科创板的强势更接近”下跌中继”。

    华龙证券投顾进一步分析认为,科创50成交数量减少幅度小于成交金额减少幅度,”意味着筹码进一步分散化,加之尾盘1小时高位滞涨”。这指向一个关键信号——高位派发正在悄然进行。

    宏观环境:外部压力边际缓解

    外围方面,美国一季度GDP年化环比增速被下修至1.6%(初值2%),4月核心PCE环比增长0.2%,低于预期的0.3%。通胀数据温和有助于缓解美联储加息预期。美元指数小幅走低至99.22,现货黄金跳涨至4,393美元/盎司。

    美伊局势方面,伊朗国家安全委员会成员透露,双方达成的初步协议草案包含第一阶段60天全面停火承诺。地缘风险缓和,油价稳定在95美元/桶附近,对全球风险偏好构成阶段性支撑。

    但需要警惕的是,国内超级IPO(长存、长鑫)的推进仍在持续稀释科技板块估值,叠加高拥挤交易的结构性风险,市场短期波动或将进一步加大。

    后市策略:守正出奇

    方正证券首席经济学家燕翔认为,本轮全球股市走牛的核心驱动力在于企业盈利预期的显著提升,AI产业进展加速是核心引擎。这一判断有其合理之处——光模块为代表的高景气赛道确实在兑现业绩。

    但投资者不应忽视几个关键问题:

    1. 拥挤度已入危险区域。上周融资净流入240亿元,其中电子板块独占280亿元,其余30个行业合计净流出。这种单边抱团的程度,与2021年初的”茅指数”行情如出一辙。
    2. 增量资金存疑。市场成交已连续缩量,高位博弈的资金博弈特征日趋明显。一旦光模块板块出现持续回调,能否有其他板块有效承接资金,将决定调整的深度和时长。
    3. 估值与基本面距离拉大。创业板指TTM市盈率已达73倍,而全市场盈利修复节奏尚待验证。在高估值环境下,任何业绩不及预期的信号都可能触发剧烈调整。

    当前阶段,与其追逐高位拥挤的AI主线,不如关注调整充分、基本面扎实的方向——新能源、医疗健康、消费等板块正处在估值和情绪的”双底”区域,性价比已显著提升。正如华龙证券投顾所言,”投资者应规避高位转势风险,等待充分调整后低吸”。在结构性牛市中,守正出奇比追涨杀跌更考验定力与耐心。

    *本文不构成投资建议,投资有风险,入市需谨慎。*

  • 腾讯与小米Q1财报拆解:AI重注下的两条路径

    腾讯与小米Q1财报拆解:AI重注下的两条路径

    两份季报,两种叙事

    5月下旬,腾讯(0700.HK)与小米(1810.HK)先后交出2026年一季度成绩单。同样是港股科技龙头,同样在AI上押下重注,两份季报却讲出了截然不同的故事——一个是以利润换未来的蓄力者,一个是双主业失速后的艰难转身

    对比维度腾讯控股(0700.HK)小米集团(1810.HK)
    Q1营收1964.58亿元,+9%991.42亿元,-10.9%
    Q1净利润581亿元,+21%47.23亿元,-56.5%
    调整后利润增速剔除AI:+17%-43.1%
    最新股价434.40港元28.40港元
    YTD涨跌幅-26.83%-27.74%
    PE(TTM)14.8718.28
    总市值(港元)3.96万亿7338亿

    两份季报的核心差异,可以归结为一句话:腾讯的AI投入在”侵蚀”利润,但主营业务在加速;小米的AI投入在”承接”主业下滑,但新业务尚未接棒。

    腾讯:AI成本可量化,核心业务在加速

    腾讯本季最大的看点不是营收增速——1964.58亿、同比增长9%,略低于市场预期的1994亿——而是管理层首次对AI投入做了量化披露

    剔除新AI产品(元宝、Hy、CodeBuddy、WorkBuddy等)的投入影响后,Non-IFRS经营利润将从756亿元提升至844亿元,同比增长17%。

    这意味着AI的”代价”现在是可审计的,而不是一个模糊的担忧。摩根大通在财报后快评中明确指出:AI的稀释效应从叙事性问题变成了可量化的损益表项目。按管理层指引,2026年AI投资将从2025年的180亿元翻倍至360亿元以上。

    而核心业务本身,表现远超整体数字所呈现的:

    • 广告业务:营销服务收入382亿元,同比增长20%,增速连续加速。AI定向投放是核心驱动力。
    • 游戏业务:国内游戏收入增长6%,国际增长13%,展现全球扩张能力。
    • 金融科技与企业服务:收入599亿元,同比增长9%,云服务受AI需求拉动加速。

    更关键的是自由现金流——本季度达567亿元,轻松覆盖370亿资本开支和79亿回购。摩根大通维持”增持”评级,目标价690港元;高盛虽然因AI开支将2026年净利预期下调1-2%,但依然维持”买入”,认为腾讯正处于从”基础模型追赶者”向”智能体时代受益者”转变的关键节点

    当前14.87倍的PE,处于近年低位。美银美林在最新研报中写道:”耐心是一种美德。”

    小米:双主业失速,押注更难啃的骨头

    如果说腾讯的季报是”以利润换未来”,小米的季报则更像是”在逆风中换引擎”。

    一季度智能手机业务收入442.73亿元,出货量3380万台,同比下降19%。据Counterpoint数据,Q1全球手机市场整体出货量同比下降6%,而小米按Omdia口径仅以12%份额排名第五,IDC数据更显示其已跌出前五。

    IoT与生活消费产品收入246.81亿元,同比大降23.68%。两大主业合计占营收69.55%,双双下滑。

    电动汽车一季度收入198.64亿元,同比增长仅6.91%,毛利率同比下滑3.07个百分点,单车毛利已回落至YU7上市前水平。

    曾经被视为”第二增长曲线”的造车业务,增速从2025年超200%骤降至个位数,打破了市场对线性高增长的预期。

    但雷军的选择仍然是继续加大投入。一季度研发支出89.5亿元,同比增长33.4%。管理层宣布未来三年AI投入将超过600亿元、五年研发总投入2000亿元,重心从汽车切换至物理AI(芯片、机器人)。

    200亿港元的回购计划(6月2日起生效)能否托住股价,是市场的核心关切。小米股价已从去年6月的61.45港元高点腰斩至28.40港元。

    投资启示:AI时代的仓位选择

    两相对比,腾讯和小米代表了AI时代的两种投资路径:

    • 腾讯:用稳固的现金流业务为AI提供弹药,AI回报已开始在广告、云服务中体现。估值处于历史低位(PE 14.87),安全边际较厚。
    • 小米:在主业承压时大举押注物理AI,弹性更大但不确定性也更高。如果手机和汽车业务无法企稳,AI投入可能成为新的负担。

    对于投资者而言,问题的核心不是”AI要不要投”,而是“你愿意为哪种AI叙事承担多少不确定性”。腾讯的AI故事刚刚开始被量化验证,小米的AI故事则还处于”相信”的阶段。

    *本文不构成投资建议,投资有风险,入市需谨慎。*

  • 投资中的耐心与纪律

    投资中的耐心与纪律

    投资中的耐心与纪律

    在 A 股市场,大多数散户亏钱的原因不是因为信息不足或分析能力不够,而是缺乏耐心与纪律。

    耐心:等待好价格的艺术

    巴菲特说:”股市是一个财富转移的场所,从急躁的人手里转移到有耐心的人手里。”

    时间是优秀企业的朋友,是平庸企业的敌人。

    在 A 股,真正的投资机会往往出现在市场恐慌、个股被错杀的时候。但大多数投资者恰恰相反——追涨杀跌,在高点买入,在低点割肉。

    纪律:严格执行投资策略

    投资纪律包括:

    • 仓位管理纪律:不孤注一掷,单只股票不超过总仓位 20%
    • 止损纪律:设定止损线(如 -10%)并严格执行,不抱侥幸心理
    • 估值纪律:只买低估或合理估值的股票,不追高泡沫
    • 分散纪律:不把所有资金押注在一个行业或一只股票上
    # 简单的仓位管理策略
    max_single_position = 0.20  # 单只股票最大仓位 20%
    max_sector_exposure = 0.40  # 单一行业最大暴露 40%
    stop_loss_threshold = -0.10  # 止损线 -10%

    实战案例:茅台的两次黄金买点

    回顾贵州茅台(600519.SH)的历史走势:

    时间价格区间PE(动态)市场情绪
    2018 年底500-550 元约 20 倍恐慌(去杠杆 + 贸易战)
    2022 年 10 月1300-1400 元约 25 倍恐慌(疫情 + 消费疲软)

    这两次都是市场极度悲观、茅台被错杀的黄金买入机会。但当时敢于重仓买入并持有至今的投资者,寥寥无几。


    如何培养耐心与纪律?

    1. 建立投资检查清单:每次买入前,对照清单逐项检查(估值、行业前景、财务健康度、催化剂)
    2. 写投资日志:记录每笔交易的买入理由、预期持仓时间、止损线,定期复盘
    3. 设定”冷却期”:看中一只股票后,强制等待 3-5 个交易日再买入,避免情绪化决策
    4. 远离短线噪音:少看盘、少刷财经新闻、不参与短线炒作,专注于长期价值

    结语

    投资是一场马拉松,不是百米冲刺。在 A 股赚钱,不需要你比别人更聪明,只需要你比别人更有耐心、更守纪律。

    记住:慢就是快,少就是多。

    发布时间:2026 年 5 月 27 日 | 分类:投资 | 标签:价值投资、投资纪律、耐心、A 股

    *本文不构成投资建议,投资有风险,入市需谨慎。*
  • WordPress AI Provider for DeepSeek 插件实现分析

    WordPress AI Provider for DeepSeek 插件实现分析

    前言

    WordPress 6.9 引入了 PHP AI Client SDK,为 WordPress 生态提供了统一的 AI 服务接入标准。本文分析我最近实现的 AI Provider for DeepSeek 插件,它是该 SDK 的 DeepSeek 适配实现,同时支持作为 Composer 包和 WordPress 插件两种使用方式。

    插件架构概览

    插件的目录结构遵循 PSR-4 规范:

    wp-ai-provider-for-deepseek/
    ├── plugin.php                          # WordPress 插件入口
    ├── readme.txt                        # WordPress 插件描述
    ├── assets/images/deepseek.svg        # 供应商 Logo
    └── src/
        ├── autoload.php                 # PSR-4 自动加载器
        ├── Provider/
        │   ├── DeepSeekProvider.php            # 主 Provider 类
        │   └── DeepSeekProviderAvailability.php # API Key 可用性检查器
        ├── Models/
        │   └── DeepSeekTextGenerationModel.php # 文本生成模型实现
        └── Metadata/
            └── DeepSeekModelMetadataDirectory.php # 模型元数据目录
    

    核心实现分析

    1. 插件入口与 Hook 注册(plugin.php)

    插件通过三个关键 Hook 完成初始化:

    // 注册 AI Provider(优先级 5,确保在 AI Client 之后加载)
    add_action('init', __NAMESPACE__ . '\\register_provider', 5);
    
    // 输出 Provider 数据到前端(确保 admin 页面可用)
    add_action('admin_enqueue_scripts', __NAMESPACE__ . '\\ensure_provider_data_output', 5);
    
    // 注册 Connector(WordPress 连接器系统)
    add_action('wp_connectors_init', __NAMESPACE__ . '\\register_connector', 10);
    
    // 自动审批 Connector 使用权限(优先级 20,确保 Approvals_Store 可用)
    add_action('init', __NAMESPACE__ . '\\auto_approve_connector', 20);
    

    设计亮点:

    • register_provider() 先检查 AiClient 类是否存在,避免依赖未安装时 fatal error
    • 使用 $registry->hasProvider() 防止重复注册
    • ensure_provider_data_output() 处理边缘情况:当 AI Client 的脚本未加载时,手动输出 window.aiProviderData

    2. Provider 主类(DeepSeekProvider.php)

    核心类继承自 AbstractApiProvider,实现四个工厂方法:

    class DeepSeekProvider extends AbstractApiProvider
    {
        // API 基础 URL
        protected static function baseUrl(): string
        {
            return 'https://api.deepseek.com';
        }
    
        // 创建模型实例(根据能力分发到具体模型类)
        protected static function createModel(...): ModelInterface
        {
            foreach ($capabilities as $capability) {
                if ($capability->isTextGeneration()) {
                    return new DeepSeekTextGenerationModel(...);
                }
            }
            throw new \RuntimeException('Unsupported model capabilities');
        }
    
        // 创建 Provider 元数据(支持版本化特性)
        protected static function createProviderMetadata(): ProviderMetadata
        {
            $args = [
                'deepseek',
                'DeepSeek',
                ProviderTypeEnum::cloud(),
                'https://platform.deepseek.com/api_keys',
                RequestAuthenticationMethod::apiKey()
            ];
    
            // 1.2.0+ 支持描述
            if (version_compare(AiClient::VERSION, '1.2.0', '>=')) {
                $args[] = __('Text generation with DeepSeek models.', 'ai-provider-for-deepseek');
            }
    
            // 1.3.0+ 支持 Logo
            if (version_compare(AiClient::VERSION, '1.3.0', '>=')) {
                $args[] = dirname(__DIR__, 2) . '/assets/images/deepseek.svg';
            }
    
            return new ProviderMetadata(...$args);
        }
    
        // 自定义可用性检查器(用真实 API 请求验证 Key)
        protected static function createProviderAvailability(): ProviderAvailabilityInterface
        {
            return new DeepSeekProviderAvailability(static::class);
        }
    
        // 模型元数据目录(动态从 API 发现可用模型)
        protected static function createModelMetadataDirectory(): ModelMetadataDirectoryInterface
        {
            return new DeepSeekModelMetadataDirectory();
        }
    }
    

    版本兼容处理是这段代码的精华:通过 version_compare 逐步添加新特性支持,确保插件在旧版 PHP AI Client 上也能正常运行。

    3. API Key 验证与缓存(DeepSeekProviderAvailability.php)

    DeepSeek 不支持标准的”列出模型”端点,因此插件采用真实请求验证法:发送一个 max_tokens=1 的最小化请求,根据 HTTP 状态码判断 Key 是否有效。

    public function isConfigured(): bool
    {
        // 1. 检查缓存(5 分钟过期)
        $cached = get_transient(self::CACHE_KEY);
        if ($cached !== false) {
            return (bool) $cached;
        }
    
        // 2. 获取 API Key(优先 WordPress 选项,fallback 到环境变量)
        $apiKey = $this->getApiKey();
        if (empty($apiKey)) {
            $this->cacheResult(false);
            return false;
        }
    
        // 3. 发送最小化请求
        $response = wp_remote_post($url, [
            'headers' => [
                'Content-Type'  => 'application/json',
                'Authorization' => 'Bearer ' . $apiKey,
            ],
            'body' => json_encode([
                'model'    => 'deepseek-v4-flash',
                'messages' => [['role' => 'user', 'content' => 'test']],
                'max_tokens' => 1,
            ]),
            'timeout' => 30,
        ]);
    
        // 4. 根据状态码判断(200/400 = Key 有效,401/403 = Key 无效)
        $responseCode = wp_remote_retrieve_response_code($response);
        $isConfigured = !in_array($responseCode, [401, 403], true);
    
        // 5. 缓存结果
        $this->cacheResult($isConfigured);
        return $isConfigured;
    }
    

    缓存策略有效减少了重复验证请求:使用 WordPress Transient API,5 分钟过期。注意错误时不缓存,允许下次重试。

    4. 模型元数据动态发现(DeepSeekModelMetadataDirectory.php)

    插件通过调用 DeepSeek 的 /models 端点动态获取可用模型列表,而非硬编码:

    protected function parseResponseToModelMetadataList(Response $response): array
    {
        $responseData = $response->getData();
        
        // 定义 DeepSeek 模型支持的能力和选项
        $textGenerationCapabilities = [
            CapabilityEnum::textGeneration(),
            CapabilityEnum::chatHistory(),
        ];
        
        $textGenerationOptions = [
            new SupportedOption(OptionEnum::systemInstruction()),
            new SupportedOption(OptionEnum::candidateCount()),
            new SupportedOption(OptionEnum::maxTokens()),
            new SupportedOption(OptionEnum::temperature()),
            new SupportedOption(OptionEnum::topP()),
            new SupportedOption(OptionEnum::customOptions()),
            new SupportedOption(OptionEnum::inputModalities()),  // 修复:添加必需的能力声明
            new SupportedOption(OptionEnum::outputModalities()),
        ];
    
        // 将 API 响应映射为 ModelMetadata 对象
        $models = array_map(function ($modelData) use ($textGenerationCapabilities, $textGenerationOptions) {
            return new ModelMetadata(
                $modelData['id'],    // model ID(如 deepseek-v4-flash)
                $modelData['id'],    // model name
                $textGenerationCapabilities,
                $textGenerationOptions
            );
        }, $responseData['data']);
    
        // 排序:deepseek-v4-flash 优先,其次是 deepseek-v4-pro,然后字母序
        usort($models, [$this, 'modelSortCallback']);
        
        return $models;
    }
    

    注意inputModalitiesoutputModalities 的添加——这是修复 ModelRequirements::fromPromptData()generate_text() 调用的关键,缺少这两个选项会导致运行时错误。

    5. 文本生成模型实现(DeepSeekTextGenerationModel.php)

    DeepSeek API 兼容 OpenAI 的 Chat Completions 格式,因此直接继承 AbstractOpenAiCompatibleTextGenerationModel

    class DeepSeekTextGenerationModel extends AbstractOpenAiCompatibleTextGenerationModel
    {
        protected function createRequest(
            HttpMethodEnum $method,
            string $path,
            array $headers = [],
            $data = null
        ): Request {
            // 覆盖父类:使用 DeepSeek Provider 的 URL 而非 OpenAI 的
            return new Request(
                $method,
                DeepSeekProvider::url($path),  // => https://api.deepseek.com/chat/completions
                $headers,
                $data,
                $this->getRequestOptions()
            );
        }
    }
    

    这个实现非常简洁,因为大部分工作(请求格式化、响应解析、流式输出等)都由父类 AbstractOpenAiCompatibleTextGenerationModel 完成。只需要覆盖 createRequest() 将请求路由到 DeepSeek 的 API 地址即可。

    Connector 审批系统

    WordPress 的 AI Client 引入了 Connector 审批机制:每个插件使用 Connector(如 DeepSeek)前必须获得审批。本插件在 init hook(优先级 20)自动审批自己:

    function auto_approve_connector(): void
    {
        if (!class_exists('\WordPress\AI\Connector_Approval\Approvals_Store')) {
            return;  // 旧版 AI Client 不支持审批系统
        }
    
        $store = new \WordPress\AI\Connector_Approval\Approvals_Store();
        $plugin_basename = plugin_basename(__FILE__);
        $connector_id = 'deepseek';
    
        if ($store->is_approved($plugin_basename, $connector_id)) {
            return;  // 已审批,跳过
        }
    
        $store->set_approval($plugin_basename, $connector_id, true);
    }
    

    这避免了用户手动在设置页面审批插件,提升了用户体验。

    使用方式

    作为 WordPress 插件

    // 1. 安装并激活插件(依赖 PHP AI Client 插件)
    // 2. 配置 API Key
    putenv('DEEPSEEK_API_KEY=your-api-key');
    
    // 3. 使用
    $result = AiClient::prompt('解释量子计算')
        ->usingProvider('deepseek')
        ->generateTextResult();
    
    echo $result->toText();
    

    作为 Composer 包

    composer require wordpress/ai-provider-for-deepseek
    
    <?php
    use WordPress\AiClient\AiClient;
    use WordPress\DeepSeekAiProvider\Provider\DeepSeekProvider;
    
    // 注册 Provider
    $registry = AiClient::defaultRegistry();
    $registry->registerProvider(DeepSeekProvider::class);
    
    // 设置 API Key
    putenv('DEEPSEEK_API_KEY=your-api-key');
    
    // 生成文本
    $result = AiClient::prompt('Explain quantum computing')
        ->usingProvider('deepseek')
        ->generateTextResult();
    
    echo $result->toText();
    

    技术亮点总结

    特性 实现方式 价值
    版本兼容 version_compare 渐进式添加特性 支持旧版 AI Client,无 breaking change
    API Key 验证 最小化真实请求 + Transient 缓存 准确验证 + 减少重复请求
    动态模型发现 调用 /models API + 元数据映射 自动支持新模型,无需更新代码
    Connector 审批 init hook 自动审批 零配置用户体验
    OpenAI 兼容 继承 AbstractOpenAiCompatible* 复用大量现有逻辑,代码量极小
    双模式运行 Composer 包 + WordPress 插件 最大灵活性,可在任何 PHP 项目中使用

    结论

    这个插件的实现展示了如何为一个新的 AI 服务商编写符合 WordPress PHP AI Client 标准的 Provider。核心要点:

    1. 继承正确的抽象类:文本生成继承 AbstractOpenAiCompatibleTextGenerationModel
    2. 实现四个工厂方法baseUrl()createModel()createProviderMetadata()createModelMetadataDirectory()
    3. 自定义可用性检查:当标准方法(列出模型)不可用时,用真实请求验证
    4. 版本兼容处理:使用 version_compare 渐进式添加新特性支持
    5. WordPress 集成:正确注册 Hook、Connector、审批

    完整代码已开源在 GitHub,欢迎试用和贡献。

  • 5月26日A股复盘:有色逆市逞强,科技回调是危是机?

    5月26日A股复盘:有色逆市逞强,科技回调是危是机?

    5月26日,A股全天弱势震荡,量能微增至3.26万亿元,但亏钱效应显著——4082只个股收跌,仅1354只上涨。沪指收跌0.17%报4145.37点,创业板指微涨0.11%报4025.43点,深证成指涨0.12%。31个申万一级行业中22个收跌,市场整体赚钱难度较大。

    有色板块逆市领涨:涨价逻辑持续演绎

    当日最亮眼的当属有色金属板块。中国铝业、华锡有色、盛龙股份、招金黄金、金钼股份涨停,整个板块资金净流入近42亿元。细分来看,有色(锡)概念大涨4.80%、博通概念涨4.64%、有色(锑)涨3.31%、白银概念涨2.72%。

    这波有色行情的背后有三重驱动力:一是全球流动性宽松预期持续,大宗商品价格中枢抬升;二是PPI(工业品出厂价格指数)由负转正,上游资源品率先受益于生产资料再通胀;三是部分小金属(锡、锑)存在供给约束,价格弹性更突出。华锡有色10%涨停就是一个典型——公司同时覆盖锡和锑两大品种,直接受益于供给收缩与需求回暖的双重催化。

    从资金面看,铜概念当日主力净流入约48.17亿元,有色金属概念净流入约41.91亿元,显示机构资金在“高切低”过程中选择了估值偏低、涨价逻辑清晰的资源品方向。

    科技板块分化:算力回调,半导体暗流涌动

    前期领涨的科技板块出现明显分化。科创板50指数收跌1.49%,北证50更是大跌2.47%。军工、计算机板块领跌,综合板块跌幅超3%,国防军工跌逾2%。

    但半导体内部分化剧烈:长电科技、华天科技涨停,通富微电涨逾8%报75.39元,兆易创新涨2.21%报526.22元。通信设备方面,新易盛涨逾6%报700元,中际旭创涨近1%报1103元。而澜起科技跌逾4%,显示出资金在科技赛道内部正在进行精细化筛选。

    多家机构对此产生了分歧。尚艺基金总经理王峥指出,“科技回调不能简单视为上车机会,需同时关注估值修复、景气改善、资金回流及拥挤度下降等信号。”大道兴业投资总经理黄华艳则提醒,“科技板块当前情绪过于亢奋,市场过热本身就是最大风险。”

    但富荣基金表达了相对乐观的看法:对于产业趋势确定性高、竞争格局清晰、未来1-2年景气路径明确的细分龙头,当前回调正是逢低关注的良机。

    机构后市研判:三条主线浮现

    综合多家机构观点,5月下旬至6月的配置思路正逐渐清晰,三条主线值得关注:

    第一,上游资源品与涨价逻辑。摩根士丹利基金认为,油气、有色、小金属、化工原料等方向最直接受益于PPI修复和生产资料再通胀。东吴证券也推荐有色金属、基础化工、公用事业等板块。从数据看,有色板块年初至今涨幅已达35%以上(如华锡有色所在的锡概念年初至今涨35.30%),但部分品种如铜概念60日仍跌8%,估值仍在合理区间。

    第二,AI算力硬件的结构性机会。尽管科技板块整体回调,但AI算力产业链基本面依然强劲。大模型参数指数级增长带动算力需求持续爆发,PCB(印制电路板)和存储芯片受益于AI服务器架构升级,产业链订单饱满。方正证券强调,AI产业已从“概念炒作”进入“业绩兑现期”,硬件需求确定性最强。

    第三,供给收缩型中游的利润拐点。核心不是PPI有没有上涨,而是PPI能否跑赢PPIRM(动力购进价格指数),以及库存压力是否下降、行业竞争格局是否改善。商用车、电网设备、纺织制造、电子化学品等方向正处在产能周期底部,一旦需求回暖,利润弹性可观。

    风险提示:震荡市中需要盯住的三大信号

    当前市场处于前期趋势性上涨后的震荡分化阶段,投资者需要关注以下风险指标:

    一是高拥挤赛道波动放大风险。部分科技方向前期交易热度较高,成交换手率一旦持续回落,可能触发踩踏式下跌。二是市场宽度不足。指数窄幅震荡但多数个股下跌,赚钱效应并不稳定,结构性行情下选股难度加大。三是外部变量扰动,包括海外利率变化、美联储新任主席政策取向、大宗商品价格波动等。

    操作层面,黄华艳建议“分散配置,满仓亦无妨,切忌单押某一板块或个股”。这或许是当前震荡市中最务实的策略。

    *本文不构成投资建议,投资有风险,入市需谨慎。*

  • 2026年5月A股投资观察:在震荡中寻找确定性

    2026年5月A股投资观察:在震荡中寻找确定性

    2026年已过去近五个月,A股市场在政策托底与外部环境不确定性之间反复拉锯。站在5月底这个时点,回顾年初以来的走势,梳理当前的主要矛盾,对下半年的布局思路做一些思考。

    一、年初以来的市场脉络

    2026年A股的开年并不差。1月底至3月中旬,在春节消费数据超预期、两会政策预期的双重催化下,沪深300一度反弹约12%。科技板块表现尤为突出,AI算力、半导体国产替代两条主线交替领涨,市场情绪明显回暖。

    但3月下旬开始,随着美联储降息预期反复摇摆、地缘政治风险升温,市场进入震荡调整。4月关税摩擦再度成为扰动项,出口链相关板块承压,指数在3100-3300点之间反复拉锯,成交量较3月高点萎缩约三成。

    二、当前市场的核心矛盾

    站在5月底,市场实际上面临几组并行的矛盾:

    政策托底 vs 内生动力不足。今年以来财政和货币政策持续发力,特别国债、设备更新改造再贷款等工具接连出台,对基建和制造业投资形成支撑。但居民消费信心和房地产链条的恢复依然偏慢,内需的「最后一公里」尚未打通。

    外部扰动 vs 资产重估。中美博弈长期化已成市场共识,但节奏上的反复仍会造成短期波动。与此同时,国内无风险利率持续下行,居民资产再配置的需求在积累,红利资产、高股息板块的配置价值在提升。

    科技叙事 vs 业绩兑现。AI和国产替代是长周期逻辑,这一点市场已有充分共识。但部分标的的估值已提前反映了远期预期,中报季来临,能否兑现业绩预期,将成为下一阶段分化的关键。

    三、值得关注的结构性机会

    在指数震荡、主线不明的阶段,与其押注短期方向,不如在结构性机会中寻找确定性更高的配置:

    红利资产的中期逻辑依然稳固。在利率下行、刚兑逐步打破的背景下,高股息资产的稀缺性在提升。电力、运营商、国有大行等板块,分红率稳定、估值并不高估,适合作为底仓配置。

    出口链的差异化机会。关税摩擦是系统性风险,但不同行业的暴露度差异很大。汽车零部件、部分机械设备细分领域,对美依赖度低、同时在「一带一路」和新兴市场有增量空间,值得深度挖掘。

    科技板块的业绩验证窗口。中报季(7-8月)将是AI算力、半导体板块的重要验证节点。优先关注订单可见度高、客户结构优质、毛利率趋势向好的标的,回避纯靠叙事支撑的高估值品种。

    四、风险提示与应对

    当前需要警惕的风险点主要有两个:一是外部冲击的节奏难以预判,建议通过仓位管理而非方向判断来应对;二是指数层面的趋势性机会可能有限,赚 alpha 比赚 beta 更重要,选股的重要性在上升。

    操作层面,建议维持中等仓位,结构上偏重红利底仓+科技成长的组合,在震荡中逐步建仓,避免追涨杀跌。

    小结

    2026年的A股,大概率是震荡中有结构、指数平淡但个股活跃的一年。在确定性上下注,在不确定性上止损,可能是今年最务实的投资哲学。

    本文不构成投资建议,投资有风险,入市需谨慎。

  • Go项目架构实战:从零搭建生产级API服务

    Go项目架构实战:从零搭建生产级API服务

    为什么项目结构很重要

    代码结构是团队协作的隐形成本。好的结构让人一眼看懂模块边界,差的结构让改一个 bug 需要改七个文件。随着项目增长,重新组织结构的代价会越来越高——所以从第一天就把结构做好。

    一种实用的 Go 项目分层

    myapp/
    ├── cmd/
    │   └── server/
    │       └── main.go          # 入口,只负责 wire 和启动
    ├── internal/
    │   ├── handler/             # HTTP/gRPC handler(接收请求)
    │   ├── service/              # 业务逻辑层(纯函数,无依赖注入简化测试)
    │   ├── repo/                 # 数据访问层(DB / Cache / 外部 API)
    │   └── model/                # 数据模型(贫血模型,纯数据结构)
    ├── pkg/
    │   └── response/             # 对外暴露的公共库
    ├── migrations/              # 数据库迁移文件
    ├── config/
    │   └── config.go             # 配置加载
    ├── Makefile
    └── go.mod

    各层职责定义

    Handler 层负责解析请求参数、做基础校验、调用 Service 层、组装响应。注意:Handler 不写任何业务逻辑。

    Service 层包含核心业务逻辑。推荐用纯函数风格,依赖通过参数传入,方便写单元测试。

    Repo 层封装所有数据访问,只对 Service 层暴露存储抽象——换数据库、换缓存策略,不影响上层代码。

    避免几个常见反模式

    • 把 model 当贫血模型塞进 repo 层,导致 repo 越来越胖
    • 在 handler 里直接写 SQL,耦合数据库细节
    • 全局变量(var db *sql.DB)跨包共享,测试时无法 mock
    • 把所有类型都放在 model 包,没有按领域聚合

    小结

    Go 的项目结构没有标准答案,但有一个原则:让每一层都专注于一件事。如果你的 handler 里有 SQL,你的 service 里在 new 各种客户端,那是结构在提醒你需要调整了。

    来源:https://www.dnote.cn

  • 从利润表到现金流:拆解一家公司到底赚不赚钱

    从利润表到现金流:拆解一家公司到底赚不赚钱

    净利润是最容易被操纵的数字

    利润表(Income Statement)上的净利润,是按照权责发生制编制的——卖出商品就算收入,不看钱有没有到账。这意味着可以通过应收款虚增收入、通过会计估计调整来平滑利润。读懂净利润背后的故事,才是财报分析的核心。

    两个核心比率

    第一个是「经营现金流/净利润」比率(盈利质量比率)。正常公司这个比率应该大于 1,说明净利润都有真实的现金支撑。长期低于 0.8 的公司需要警惕。

    第二个是「收现比」:销售商品、提供劳务收到的现金 / 营业收入。这个比率反映每 1 元收入实际收到了多少现金。低于 0.8 说明大量收入停留在应收款里。

    案例:某消费电子公司

    某公司连续三年净利润增速超过 30%,但经营现金流持续为负。深入一看:应收账款从 10 亿增长到 40 亿——原来是通过给经销商大量赊账来「制造」收入增长。这种高增长是危险的,一旦渠道去库存,收入会断崖式下跌。

    如何用自由现金流估值

    DCF 估值本质上是对未来自由现金流的折现。计算公式:自由现金流 = 经营现金流 – 维持性资本支出。简化版可以用「经营现金流净额 × 80%(保守估算资本支出)」来估算。

    小结

    利润是会计游戏,现金流是商业现实。读财报时,永远把现金流量表放在和利润表同等重要的位置。两表对照,才能看清一家公司真正的赚钱能力。

    来源:https://www.dnote.cn

    本文不构成投资建议,投资有风险,入市需谨慎。

  • Go 并发编程:Goroutine 与 Channel 实战指南

    Go 并发编程:Goroutine 与 Channel 实战指南

    为什么 Go 的并发模型值得专门学

    Go 的并发哲学来自 C.A.R. Hoare 的 CSP 理论,与传统线程模型完全不同。理解这套模型,是写出高性能 Go 服务的基础。

    Goroutine 到底是什么

    goroutine 是由 Go 运行时管理的轻量级线程,创建成本极低(约 2KB 栈空间),可以轻松创建数万个 goroutine 而不耗尽系统资源。与 OS 线程的 1:1 模型不同,Go 使用 M:N 调度——M 个 OS 线程上运行 N 个 goroutine,由 Go 运行时 GOMAXPROCS 控制并行度。

    一个简单的 goroutine 示例

    // 启动一个 goroutine
    go func() {
        fmt.Println("running in goroutine")
    }()
    
    // 主 goroutine 继续执行,不等待子 goroutine
    fmt.Println("main exits")

    Channel:goroutine 之间的通信桥梁

    channel 是 goroutine 间传递数据的管道,有带缓冲(buffered)和不带缓冲(unbuffered)两种。推荐优先使用无缓冲 channel,这样发送与接收必须配对,强制调用方思考同步问题,避免隐藏的竞态。

    ch := make(chan int)         // 无缓冲
    ch <- 42                       // 发送(阻塞直到有人接收)
    value := <-ch                  // 接收
    
    // 带缓冲 channel(队列)
    bufCh := make(chan int, 100)  // 最多缓存 100 条,不阻塞

    select:多路复用的并发协调

    select 关键字让一个 goroutine 可以同时监听多个 channel,就跟 select 系统调用监听多个 fd 一样。配合 default case 可以实现非阻塞发送/接收。

    select {
    case msg := <-ch1:
        fmt.Println("received from ch1:", msg)
    case msg := <-ch2:
        fmt.Println("received from ch2:", msg)
    case <-time.After(time.Second):
        fmt.Println("timeout")
    default:
        fmt.Println("no message available")
    }

    常见踩坑与最佳实践

    • 不要用 channel 传递所有数据——共享内存(sync.Mutex/sync.Map)有时更简单
    • 永远不要关闭由别人发送的 channel,避免 panic
    • 使用 context.Context 来控制 goroutine 的生命周期,而不是用 channel 硬传退出信号
    • 在生产环境加上 -race 参数跑单元测试,检查数据竞争

    总结

    Go 的并发模型用起来简单,但要真正用好,需要理解 goroutine 的调度原理、channel 的阻塞语义,以及 context 在多层调用中的传递方式。掌握这些,你就能写出既高效又安全的并发代码。

    来源:https://www.dnote.cn

  • 财报速读指南:拿到一份年报该从哪里开始

    财报速读指南:拿到一份年报该从哪里开始

    为什么要自己读财报

    市场上的财报解读要么太浅(只说增长了多少),要么太碎(逐字逐句读,缺乏投资视角)。真正有用的财报阅读,是以投资问题为出发点,在有限时间内找到关键答案。

    第一步:读审计意见

    打开年报先翻到「审计报告」,看审计师给的是「标准无保留意见」还是带说明段的保留意见。如果是后者,说明这家公司的财务数据存在不确定性,需要提高警惕。

    第二步:看收入与利润的趋势

    找到「合并利润表」,重点看近 3-5 年的收入增速和毛利率变化。不要只看数字,要看趋势——是加速增长、增速放缓,还是周期性波动?增速放缓的「高增长」公司是最危险的陷阱。

    第三步:读现金流量表

    利润可以造假,现金流很难。经营活动现金流净额长期低于净利润,说明利润质量差,可能是应收款堆积或关联交易在「制造」利润。自由现金流(经营现金流 – 资本支出)才是企业真正的赚钱能力。

    第四步:读资产负债表的两端

    看负债端:资产负债率是否在合理范围?是否有大量短期借款需要近期偿还?看资产端:商誉占总资产比例?应收账款是否异常增长?这些数字反映了公司的财务健康度。

    第五步:找到管理层讨论与分析(MD&A)

    这是年报中最有价值的定性内容——管理层亲口解释为什么业绩上升/下降,对行业趋势的判断,以及下一年计划。读这里比读研报更能建立对公司的真实理解。

    一个实用的年报速读流程

    • 审计意见 → 排除财务风险
    • 收入/毛利率趋势 → 判断成长性
    • 经营现金流 vs 净利润 → 判断利润质量
    • 资产负债率 + 短债压力 → 判断财务安全
    • MD&A → 理解管理层思路

    小结

    读财报不需要会计专业,核心是建立一套提问框架:这份年报能回答我的投资问题吗?如果找不到答案,就继续找下一个投资标的。财报是用来排除公司的,不是用来证明公司有多好的。

    来源:https://www.dnote.cn

    本文不构成投资建议,投资有风险,入市需谨慎。

  • Go部署:Docker/K8s实战配置

    Go部署:Docker/K8s实战配置

    多阶段构建:让镜像小到 10MB 以内

    Go 是静态编译语言,只需要编译后的二进制文件,不需要运行时环境。多阶段构建可以分离构建环境和运行环境,最终镜像只包含二进制文件。

    # 阶段1:构建
    FROM golang:1.23-alpine AS builder
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o server .
    
    # 阶段2:运行
    FROM alpine:3.19
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    WORKDIR /app
    COPY --from=builder /app/server .
    RUN chmod +x server
    USER appuser
    CMD ["./server"]

    利用 Docker BuildKit 加速构建

    # 启用 BuildKit
    export DOCKER_BUILDKIT=1
    
    # 并行下载依赖,大幅加速
    docker build --progress=plain -t myapp:latest .

    健康检查:让 K8s/Compose 知道服务已就绪

    在 Dockerfile 里加上 HEALTHCHECK,让 orchestrator 在服务真正能接收请求时才将其加入负载均衡。

    HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
      CMD wget -qO- http://localhost:8080/health || exit 1

    环境变量注入的坑

    Go 程序默认会在 ENV 改变时重新加载,但 Docker 层会缓存 ENV。用 ENTRYPOINT 脚本或 Viper 动态读取,比硬编码 ENV 常量更灵活。

    小结

    Docker 化 Go 服务的核心是:镜像要小(多阶段构建)、构建要快(BuildKit)、健康要可感知。做到这三点,生产部署就没什么大问题了。

    来源:https://www.dnote.cn

  • 李录北大演讲全文:全球价值投资与时代

    李录北大演讲全文:全球价值投资与时代

    2024年12月7日,价值投资课程创办十周年,李录第三次站在北大光华管理学院的讲台上,发表了《全球价值投资与时代》的主题演讲。这是一篇信息量极高、诚意十足的长文,推荐直接观看文末的视频。

    一、世界形势判断

    全球格局正在重塑

    我们正处在二战后全球秩序的一个重大调整期,旧的秩序在逐渐松动,新的秩序还没有完全成型。

    核心变化 表现
    美国战略转向 从”全球警察”转向国内优先(就业、产业回流、债务)
    多极化趋势 不再有单一国家主导,全球进入多中心时代
    大国关系 “既竞争又不得不合作”(气候、供应链、金融风险)
    全球化特征 从”效率优先”转向”安全优先”,区域化趋势明显

    投资背景

    • 通胀粘性:高利率时代来临,”躺赢”投资时代结束
    • 机会所在:科技创新、能源转型、高端制造、医疗健康、消费升级

    二、中国现状分析

    核心矛盾:生产能力 vs 消费能力

    指标 中国 美国
    消费占GDP比重 ~40% >70%
    居民储蓄率 ~50%

    不爱花钱的原因:对未来预期不稳定(看病、养老、育儿、买房)

    两大制约因素

    1. 社会保障体系不完善

    家庭自保效率极低。100万大病存款 vs 1万/年保险分摊——这是效率的巨大差异。

    2. 资本市场不成熟

    国有银行主导,难以高效配置到创新企业。要保障香港的独立性,发挥连接全球资本的桥梁作用。

    中国前景判断

    阶段 说明
    2.5阶段 工业化基本完成,城市化>50%,向高收入阶段迈进
    优势 14亿人统一大市场;勤奋、爱学习、储蓄率高、企业家精神
    关键变量 消费占比从40%→60%,就是巨大增长空间

    三、价值投资六原则

    ① 买股票就是买公司

    股票是公司所有权,不是炒作筹码。案例:持有比亚迪22年,经历多次50%+下跌,从未卖出。

    ② 市场先生是你的仆人

    利用其情绪波动,不被其主导。恐慌时买入,狂热时卖出。

    ③ 安全边际

    “四毛钱买一块钱的东西”——应对未来不确定性的唯一工具。

    ④ 坚守能力圈

    不懂绝对不碰。芒格:承认不懂比假装懂更重要。

    ⑤ 去有鱼的地方钓鱼

    芒格名言。全球”有鱼”:科技、能源转型、医疗、品牌消费。中国”有鱼”:产业升级、内需消费、绿色经济、数字化。

    ⑥ 财富 = 购买力占比

    持有最优经济体的最优公司股权,是保住购买力的最好方式。

    四、给投资者的建议

    建议 要点
    接受现实 不抱怨、不幻想,专注能控制的事
    用闲钱投资 绝对不借钱炒股,不拿短期要用的钱投资
    理性看中国 不悲观、不盲目乐观,好公司能穿越周期

    五、两条道德底线

    1. 追求真知:把对智慧和真理的追求当作道德责任,避免”屁股决定脑袋”
    2. 受托人责任:把客户的钱当父母的钱打理,把客户利益放在自己之前

    结语

    “价值投资恰恰诞生于经济动荡、认知混乱的时期”

    越是在动荡的时代,价值投资的优势就越明显。


    附:李录简介

    1966年生于唐山,1985年考入南京大学物理系,1990年赴哥大深造,6年获得三个学位。因在哥大听了巴菲特演讲,下定决心做价值投资,后创立喜马拉雅资本。查理·芒格的家族资本投在李录管理的基金里。

    演讲视频:可在B站搜索”李录 北京大学 全球价值投资与时代”

  • 用 Excel 做财务建模:从收入预测到利润表

    用 Excel 做财务建模:从收入预测到利润表

    为什么投资人也需要会建模

    很多投资者依赖研报里的模型,但研报模型往往是「乐观假设」的包装。自己动手建模,才能真正理解假设对估值的影响有多敏感——这才是财务分析的核心竞争力。

    建模的基本框架

    财务建模的核心是三张表之间的联动:利润表 ←→ 资产负债表 ←→ 现金流量表。一个简单的 Excel 建模流程:

    • 输入假设:收入增速、毛利率、费用率、税率
    • 预测利润表:收入 × 毛利率 – 费用 = EBIT
    • 预测现金流量表:EBIT → 折旧加回 → 资本支出 → FCF
    • 检查平衡:资产负债端的变动是否合理

    一个简单的收入预测模型

    # Excel 中的收入预测公式(按年)
    
    假设 sheet 中:
    - B1 = 基期收入(100亿)
    - B2 = 预测增速(15%)
    
    B3 = B2 * B1 + B1           # 第二年收入
    B4 = B3 * B1 + B3           # 第三年收入
    # 以此类推...

    敏感性分析:用 Data Table 看估值区间

    DCF 模型最有价值的部分是敏感性分析。用 Excel 的「数据表」功能,把折现率和永续增长率作为横纵轴,一次性显示所有组合下的估值结果——直观看到哪个假设对估值影响最大。

    建模的几个原则

    • 假设和计算分开:不要把数字写死在公式里
    • 用颜色区分输入(蓝)、公式(黑)、链接(绿)
    • 始终检查三张表之间的逻辑一致性
    • 做敏感性分析,不要只报一个「目标价」

    小结

    Excel 财务建模不需要 VBA,不需要宏,只需要清晰的结构和严谨的假设。它是基本面投资者最重要的工具之一,能帮你把「模糊的看好」变成「有依据的估值」。

    来源:https://www.dnote.cn

    本文不构成投资建议,投资有风险,入市需谨慎。

  • Go ORM对比:GORM vs Ent vs Kitex

    Go ORM对比:GORM vs Ent vs Kitex

    为什么 Go 生态里有这么多 ORM 选择

    Go 生态偏好显式而非隐式,所以没有 Java Hibernate 那样的大一统 ORM。GORM、Ent 和 Kitex(配合 codegen)是三条不同的路,各有适用场景。

    GORM:最成熟,上手最快

    GORM 是事实标准,生态丰富、文档完善。缺点是隐式 SQL、链式 API 容易写出难以维护的代码,且性能一般。适合快速开发或中小型项目。

    Ent:代码生成,类型安全

    Ent 是 Facebook 出品的代码生成式 ORM。Schema 定义后自动生成代码,类型安全、IDE 友好、支持图结构查询。缺点是学习曲线稍陡,新增字段需要重新生成。

    Kitex + SQLBricks:微服务场景的最佳组合

    字节跳动的 Kitex 框架不绑定 ORM,推荐配合 sqlx 或 sqlc 使用。sqlc 可以从 SQL 语句生成类型安全的 Go 代码,彻底避免 SQL 注入,同时保持 SQL 的可读性。

    各场景推荐

    场景 推荐 原因
    快速原型/MVP GORM 上手快,生态成熟
    中大型项目 Ent 类型安全,可维护
    高性能微服务 Kitex + sqlx 零抽象,性能可控
    需要图查询 Ent 原生支持图结构

    小结

    选 ORM 就是选抽象程度:GORM 是高抽象(牺牲性能和可维护性),Ent 是中抽象(平衡),sqlx 是低抽象(保留 SQL 的所有优点)。没有最优解,只有最适合当前项目规模和团队风格的方案。

    来源:https://www.dnote.cn

  • 估值方法对比:PE、PEG、ROE、DCF 各适合什么场景

    估值方法对比:PE、PEG、ROE、DCF 各适合什么场景

    估值不是算命,是概率判断

    很多人以为估值是精确计算出一个「真实价值」,其实不是。估值是一种概率判断——当前股价相对于内在价值,是偏贵还是偏便宜?不同方法适用于不同类型的公司,没有万能公式。

    PE(市盈率):最常用,但最容易被误用

    PE = 股价 / 每股收益,是最直观的估值指标。但要注意:低 PE 未必便宜(可能是衰退行业),高 PE 未必贵(可能是高速成长期)。还要区分静态 PE(用去年 EPS)和动态 PE(用分析师预测 EPS)。

    PEG:弥补 PE 无法衡量增速的缺陷

    PEG = PE / 净利润增速(G)。PEG < 1 说明增速相对于估值有安全边际,PEG > 2 则明显偏贵。这个指标适合成长股,不适合成熟期公司和周期股。

    ROE(净资产收益率):衡量赚钱效率

    ROE = 净利润 / 净资产,反映每投入 1 元能赚多少。长期 ROE > 15% 的公司通常有护城河。但要注意:高 ROE 是来自高净利润率、高周转率,还是高杠杆?后者的 ROE 是危险的。

    DCF(现金流折现):最严谨,但最难用对

    DCF 的核心是预测未来自由现金流并折现。问题在于:DCF 对折现率和增速假设极其敏感——折现率差 1%,估值可能差 30%。适合现金流稳定、可预测性强的公司(消费、水电),不适合盈利波动大的周期股和初创公司。

    各估值方法的适用场景

    方法 适用场景 不适用场景
    PE 稳定增长、消费类 亏损、周期、极高增速
    PEG 成长股(增速 15-50%) 周期股、低增速/负增速
    ROE 所有公司(配合杜邦分析) 单独使用不够,需结合负债
    DCF 现金流稳定的水电/消费 周期、亏损、早期公司

    小结

    估值是一种思维框架,不是精确公式。用 PE 看当前市场定价,用 DCF 做内在价值锚定,用 ROE 验证盈利质量——三者结合,比任何单一指标都更可靠。

    来源:https://www.dnote.cn

    本文不构成投资建议,投资有风险,入市需谨慎。

  • Go并发编程精讲:goroutine/channel原理与避坑指南

    Go并发编程精讲:goroutine/channel原理与避坑指南

    深入理解 GMP 调度模型

    Go 运行时调度器将 goroutine 映射到 OS 线程上执行,GMP 代表 G(Goroutine)、M(Machine/OS 线程)、P(Processor,执行上下文)。P 的数量默认等于 CPU 核心数,可以通过 GOMAXPROCS 调整,这是 Go 并发性能的关键参数。

    goroutine 的生命周期与状态

    goroutine 有多个状态:waiting(阻塞在 channel 或系统调用)、runnable(就绪等待调度)、running(正在执行)。理解这些状态有助于分析死锁和性能问题。

    channel 的底层实现

    channel 内部有环形队列和两个等待队列(sendq 和 recvq)。向已满的无缓冲 channel 发送会阻塞,goroutine 被挂在 sendq 上;接收时会从 recvq 唤醒一个 sender 或从队列取数据。

    常见并发陷阱

    • 向已关闭的 channel 发送数据会 panic,但接收会返回零值
    • 多个 goroutine 同时等待同一个 channel,只有 1 个会被唤醒——用 sync.WaitGroup 而非 channel 控制退出
    • for range channel 会一直阻塞直到 channel 关闭
    • context.WithCancel 是优雅退出多个 goroutine 的标准方式

    小结

    理解 GMP 调度和 channel 底层原理,才能真正写出高效的并发代码。遇到性能问题时,用 runtime.NumGoroutine() 和 pprof 分析 goroutine 的状态分布是第一步。

    来源:https://www.dnote.cn

  • 用 Taro 开发小程序:答题卡网格布局的兼容性问题总结

    用 Taro 开发小程序:答题卡网格布局的兼容性问题总结

    背景

    在做一个刷题小程序时,需要实现一个答题卡界面——用网格展示所有题目状态(未答/已答/当前题),支持点击跳转。在 Web 上几行 CSS 搞定,在小程序里却踩了不少坑。

    问题一:gap 属性在小程序里不生效

    这是最常见的问题。CSS gap 属性用于设置网格/弹性盒子的间距,在主流浏览器都支持,但在微信小程序、支付宝小程序里均不支持。解决方案:

    /* ❌ 小程序不支持 */
    .grid { display: grid; gap: 16px; }
    
    /* ✅ 改用 margin 模拟 */
    .grid { display: grid; }
    .grid-item { margin-right: 16px; margin-bottom: 16px; }
    /* 最后一项去掉右边距 */
    .grid-item:last-child { margin-right: 0; }

    问题二:display: grid 在某些机型的兼容情况

    iOS 微信大部分版本支持 grid,但 Android 端部分机型(尤其是低端机)的 UC/QQ 浏览器内核不支持。推荐降级方案:用 flex + 百分比宽度实现网格。

    /* ✅ 兼容写法:flex 模拟网格 */
    .row { display: flex; flex-wrap: wrap; }
    .cell { width: 48px; height: 48px; margin: 0 4px 8px 0; }

    问题三::nth-child 在某些场景下失效

    nth-child 在动态列表(数据来自接口)时表现正常,但在用 v-for 遍历固定数量的数字时,微信开发者工具和部分真机行为不一致。解决方案是改用 v-if 或加辅助 class。

    实战答题卡组件代码

    const AnswerCard = ({ questions, currentIndex, onJump }) => {
      return (
        <View className='answer-card'>
          <View className='row'>
            {questions.map((q, i) => (
              <View
                key={q.id}
                className={`cell ${i === currentIndex ? 'current' : ''} ${q.answered ? 'done' : 'undone'}`}
                onClick={() => onJump(i)}
              >
                {i + 1}
              </View>
            ))}
          </View>
        </View>
      )
    }

    小结

    小程序开发的本质是与 CSS 兼容层打交道。遇到 display、gap、nth-child 等属性,先查 caniuse,再想降级方案。开发阶段多用真机调试,开发者工具的结果不一定准确。

    来源:https://www.dnote.cn

  • Docker 容器化 Go 服务的几个实战细节

    Docker 容器化 Go 服务的几个实战细节

    多阶段构建:让镜像小到 10MB 以内

    Go 是静态编译语言,只需要编译后的二进制文件,不需要运行时环境。多阶段构建可以分离构建环境和运行环境,最终镜像只包含二进制文件。

    # 阶段1:构建
    FROM golang:1.23-alpine AS builder
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -ldflags='-w -s' -o server .
    
    # 阶段2:运行
    FROM alpine:3.19
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    WORKDIR /app
    COPY --from=builder /app/server .
    RUN chmod +x server
    USER appuser
    CMD ["./server"]

    利用 Docker BuildKit 加速构建

    # 启用 BuildKit
    export DOCKER_BUILDKIT=1
    
    # 并行下载依赖,大幅加速
    docker build --progress=plain -t myapp:latest .

    健康检查:让 K8s/Compose 知道服务已就绪

    在 Dockerfile 里加上 HEALTHCHECK,让 orchestrator 在服务真正能接收请求时才将其加入负载均衡。

    HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
      CMD wget -qO- http://localhost:8080/health || exit 1

    环境变量注入的坑

    Go 程序默认会在 ENV 改变时重新加载,但 Docker 层会缓存 ENV。用 ENTRYPOINT 脚本或 Viper 动态读取,比硬编码 ENV 常量更灵活。

    小结

    Docker 化 Go 服务的核心是:镜像要小(多阶段构建)、构建要快(BuildKit)、健康要可感知。做到这三点,生产部署就没什么大问题了。

    来源:https://www.dnote.cn

  • WordPress 6.9.4 正式发布:更新内容速览

    WordPress 6.9.4 已于 2026年04月15日 正式发布。以下是本次更新的主要内容整理,供站长参考。

    ⚠️ 安全版本:本次更新包含安全修复,建议所有用户尽快升级。

    本次 6.9.4 是一个安全维护版本,修复了 10 个安全问题。WordPress 安全团队发现此前版本中部分安全修复未完全生效,因此紧急发布 6.9.4 补丁。

    🔒 安全修复

    • 路径穿越漏洞(PclZip 组件)
    • 授权绕过漏洞
    • XXE(XML 外部实体注入)漏洞

    如何升级

    登录 WordPress 后台 → 仪表盘 → 更新,点击「立即更新」即可完成升级。建议升级前先备份数据库和文件。

    参考链接

    本文由自动化脚本监测到 WordPress 新版本后自动生成,仅供参考。