Files
Toolbox/public/tools/markets/wallstreet_wisdom - 17到21之前.html
yangxiangyuan d3856cb52a chore: add and update gitignore rules for project files
add a comprehensive gitignore file to exclude unnecessary files like dependencies, runtime data, uploads, local configs and debug temporary files
2026-06-22 21:24:46 +08:00

2481 lines
160 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Noto+Serif+SC:wght@400;600&family=Courier+Prime:ital@0;1&display=swap');
:root {
--gold: #C9A84C;
--gold-light: #E8D5A3;
--gold-dim: rgba(201,168,76,0.15);
--dark: #0D0D0D;
--dark2: #161616;
--dark3: #1E1E1E;
--text: #F0EDE6;
--text-dim: #9A9080;
--text-faint: rgba(240,237,230,0.35);
--red: #C0392B;
--green: #1D9E75;
--blue: #2E6DA4;
--zh-font: "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Heiti SC", sans-serif;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--dark);
color: var(--text);
font-family: 'Noto Serif SC', serif;
min-height: 100vh;
padding: 0;
overflow-x: hidden;
}
/* ── TOP NAV ── */
.top-nav {
display: flex;
align-items: flex-end;
gap: 0;
padding: 28px 24px 0;
border-bottom: 0.5px solid rgba(201,168,76,0.2);
position: relative;
}
.top-nav::before {
content: '华尔街智慧手册';
position: absolute;
top: 14px; left: 24px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.25em;
color: rgba(201,168,76,0.35);
text-transform: uppercase;
}
.tab-btn {
background: transparent;
border: none;
border-bottom: none;
color: var(--text-dim);
font-family: 'Noto Serif SC', serif;
font-size: 15px;
padding: 10px 22px 12px;
cursor: pointer;
position: relative;
transition: color 0.25s;
letter-spacing: 0.05em;
white-space: nowrap;
}
.tab-btn::after {
content: '';
position: absolute;
bottom: -0.5px; left: 0; right: 0;
height: 1.5px;
background: var(--gold);
transform: scaleX(0);
transition: transform 0.3s ease;
}
.tab-btn.active {
color: var(--gold-light);
}
.tab-btn.active::after {
transform: scaleX(1);
}
.tab-btn:hover:not(.active) {
color: rgba(232,213,163,0.6);
}
/* ── PANELS ── */
.panel { display: none; }
.panel.active { display: block; }
/* ══════════════════════════════════
PANEL 1 — 盈利的代价
══════════════════════════════════ */
.p1-wrap {
padding: 32px 24px 40px;
max-width: 720px;
margin: 0 auto;
}
.p1-header {
text-align: center;
margin-bottom: 36px;
position: relative;
}
body::after {
content: '❝';
position: fixed;
top: 60px; left: 18px;
font-size: 70px;
color: rgba(201,168,76,0.04);
font-family: 'Playfair Display', serif;
pointer-events: none;
}
.week-strip {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-bottom: 4px;
}
.wline { height: 0.5px; width: 48px; background: linear-gradient(to right, transparent, var(--gold)); }
.wline.r { background: linear-gradient(to left, transparent, var(--gold)); }
.wnum { font-family: 'Playfair Display', serif; font-size: 14px; color: var(--gold); letter-spacing: 0.18em; }
.quote-card {
background: var(--dark2);
border: 0.5px solid rgba(201,168,76,0.18);
border-radius: 2px;
padding: 40px 38px;
position: relative;
animation: cardIn 0.65s ease forwards;
}
/* side nav buttons */
.q-btn-side {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 2;
}
.q-btn-left { left: -60px; }
.q-btn-right { right: -60px; }
@keyframes cardIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.quote-card::before { content: ''; position: absolute; top: 11px; left: 11px; width: 18px; height: 18px; border-top: 1px solid rgba(201,168,76,0.35); border-left: 1px solid rgba(201,168,76,0.35); }
.quote-card::after { content: ''; position: absolute; bottom: 11px; right: 11px; width: 18px; height: 18px; border-bottom: 1px solid rgba(201,168,76,0.35); border-right: 1px solid rgba(201,168,76,0.35); }
.q-theme {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.28em;
color: var(--gold);
opacity: 0.55;
text-transform: uppercase;
margin-bottom: 22px;
}
.q-en {
font-family: 'Playfair Display', serif;
font-style: italic;
font-size: 14px;
line-height: 1.75;
color: var(--gold-light);
margin-bottom: 14px;
}
.q-zh {
font-family: var(--zh-font);
font-size: 16px;
font-weight: 500;
line-height: 1.8;
color: var(--text);
margin-bottom: 8px;
}
.q-colloquial {
font-family: var(--zh-font);
font-size: 14px;
line-height: 1.7;
color: var(--text-dim);
margin-bottom: 20px;
}
.q-divider {
height: 0.5px;
background: linear-gradient(to right, transparent, rgba(201,168,76,0.28), transparent);
margin-bottom: 24px;
}
.q-attr {
display: flex;
align-items: flex-start;
gap: 13px;
margin-bottom: 24px;
}
.q-avatar {
width: 34px; height: 34px;
border-radius: 50%;
border: 1px solid rgba(201,168,76,0.28);
display: flex; align-items: center; justify-content: center;
font-family: 'Playfair Display', serif;
font-size: 15px;
color: var(--gold);
background: rgba(201,168,76,0.05);
flex-shrink: 0; margin-top: 2px;
}
.q-name { font-family: 'Playfair Display', serif; font-size: 16px; color: var(--text); margin-bottom: 3px; }
.q-title { font-family: 'Courier Prime', monospace; font-size: 12px; color: var(--text-dim); letter-spacing: 0.06em; }
.q-insight {
background: rgba(201,168,76,0.035);
border: 0.5px solid rgba(201,168,76,0.1);
border-radius: 1px;
padding: 14px 18px;
}
.q-insight-label {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.2em;
color: var(--gold);
opacity: 0.45;
text-transform: uppercase;
margin-bottom: 7px;
}
.q-insight-text {
font-family: var(--zh-font);
font-size: 15px;
line-height: 1.8;
color: var(--text-dim);
}
/* progress */
.prog-wrap { margin-top: 24px; }
.prog-bar-out { height: 1.5px; background: rgba(201,168,76,0.1); border-radius: 99px; margin-bottom: 7px; overflow: hidden; }
.prog-bar-in { height: 100%; background: linear-gradient(to right, #8B4513, var(--gold)); border-radius: 99px; transition: width 0.5s ease; }
.prog-text { font-family: 'Courier Prime', monospace; font-size: 12px; color: var(--text-dim); text-align: center; letter-spacing: 0.1em; }
/* nav buttons */
.q-nav {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 22px;
}
.q-btn {
background: transparent;
border: 0.5px solid rgba(201,168,76,0.22);
color: var(--gold);
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.1em;
padding: 8px 18px;
cursor: pointer;
transition: all 0.2s;
text-transform: uppercase;
}
.q-btn:hover:not(:disabled) { background: rgba(201,168,76,0.07); border-color: rgba(201,168,76,0.45); }
.q-btn.primary { background: rgba(201,168,76,0.08); border-color: rgba(201,168,76,0.35); }
.q-btn:disabled { opacity: 0.25; cursor: not-allowed; }
/* dots */
.week-dots {
display: flex;
justify-content: center;
gap: 4px;
margin-top: 14px;
flex-wrap: wrap;
max-width: 380px;
margin-left: auto;
margin-right: auto;
}
.dot {
width: 4px; height: 4px;
border-radius: 50%;
background: rgba(201,168,76,0.13);
cursor: pointer;
transition: all 0.2s;
}
.dot.active { background: var(--gold); transform: scale(1.5); }
.dot.visited { background: rgba(201,168,76,0.38); }
.footer-line {
text-align: center;
margin-top: 20px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
color: rgba(160,152,128,0.3);
letter-spacing: 0.1em;
}
/* ══════════════════════════════════
PANEL 2 — 本金与子弹
══════════════════════════════════ */
.p2-wrap {
padding: 32px 24px 40px;
max-width: 720px;
margin: 0 auto;
}
.p2-intro {
text-align: center;
margin-bottom: 30px;
}
.p2-title {
font-family: 'Playfair Display', serif;
font-size: 26px;
color: var(--gold-light);
margin-bottom: 6px;
}
.p2-subtitle {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.2em;
color: var(--text-dim);
opacity: 0.6;
}
.p2-section {
margin-bottom: 10px;
border-radius: 2px;
border: 0.5px solid rgba(201,168,76,0.14);
background: var(--dark2);
overflow: hidden;
transition: border-color 0.2s;
}
.p2-section:hover { border-color: rgba(201,168,76,0.28); }
.p2-section-header {
display: flex;
align-items: center;
gap: 14px;
padding: 16px 20px;
cursor: pointer;
user-select: none;
}
.p2-icon {
width: 32px; height: 32px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 14px;
flex-shrink: 0;
border: 0.5px solid rgba(201,168,76,0.25);
background: rgba(201,168,76,0.06);
}
.p2-section-label {
font-family: 'Noto Serif SC', serif;
font-size: 16px;
color: var(--text);
flex: 1;
}
.p2-section-en {
font-family: 'Courier Prime', monospace;
font-size: 12px;
color: var(--gold);
opacity: 0.5;
letter-spacing: 0.15em;
margin-top: 2px;
}
.p2-chevron {
font-size: 12px;
color: var(--gold);
opacity: 0.4;
transition: transform 0.25s;
}
.p2-section.open .p2-chevron { transform: rotate(90deg); }
.p2-body {
display: none;
padding: 0 20px 20px;
border-top: 0.5px solid rgba(201,168,76,0.1);
}
.p2-section.open .p2-body { display: block; }
.p2-law {
display: flex;
align-items: flex-start;
gap: 14px;
padding: 14px 0;
border-bottom: 0.5px solid rgba(255,255,255,0.04);
}
.p2-law:last-child { border-bottom: none; }
.p2-law-num {
font-family: 'Playfair Display', serif;
font-size: 12px;
color: var(--gold);
opacity: 0.5;
flex-shrink: 0;
width: 20px;
margin-top: 2px;
}
.p2-law-content { flex: 1; }
.p2-law-title {
font-family: var(--zh-font);
font-size: 16px;
color: var(--text);
margin-bottom: 4px;
font-weight: 600;
}
.p2-law-body {
font-family: var(--zh-font);
font-size: 15px;
line-height: 1.85;
color: var(--text-dim);
}
.p2-law-quote {
margin-top: 8px;
padding: 8px 12px;
background: rgba(201,168,76,0.04);
border-left: 1.5px solid rgba(201,168,76,0.25);
font-family: 'Playfair Display', serif;
font-style: italic;
font-size: 14px;
color: rgba(232,213,163,0.7);
line-height: 1.7;
}
.p2-law-tag {
display: inline-block;
margin-top: 8px;
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.12em;
padding: 2px 8px;
border-radius: 99px;
border: 0.5px solid rgba(201,168,76,0.2);
color: var(--gold);
opacity: 0.6;
text-transform: uppercase;
}
/* core formula */
.p2-formula {
margin: 20px 0 10px;
background: rgba(201,168,76,0.04);
border: 0.5px solid rgba(201,168,76,0.18);
border-radius: 2px;
padding: 18px 22px;
text-align: center;
}
.p2-formula-label {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.22em;
color: var(--gold);
opacity: 0.45;
text-transform: uppercase;
margin-bottom: 10px;
}
.p2-formula-eq {
font-family: 'Playfair Display', serif;
font-size: 18px;
color: var(--gold-light);
line-height: 1.8;
}
.p2-formula-sub {
font-size: 13px;
color: var(--text-dim);
margin-top: 8px;
line-height: 1.7;
}
/* ══════════════════════════════════
PANEL 3 — 实战与得失
══════════════════════════════════ */
.p3-intro {
text-align: center;
margin-bottom: 28px;
}
.p3-title {
font-family: 'Playfair Display', serif;
font-size: 26px;
color: var(--gold-light);
margin-bottom: 6px;
}
.p3-subtitle {
font-family: 'Courier Prime', monospace;
font-size: 12px;
letter-spacing: 0.2em;
color: var(--text-dim);
opacity: 0.6;
}
.p3-creed-card {
margin-bottom: 16px;
padding: 28px 32px;
}
.p3-creed-body {
margin-top: 16px;
padding: 10px 14px;
background: rgba(201,168,76,0.04);
border: 0.5px solid rgba(201,168,76,0.1);
border-radius: 1px;
}
</style>
</head>
<body>
<!-- TOP NAVIGATION -->
<div class="top-nav">
<button class="tab-btn active" onclick="switchTab(0, this)">盈利的代价</button>
<button class="tab-btn" onclick="switchTab(1, this)">本金与子弹</button>
<button class="tab-btn" onclick="switchTab(2, this)">实战与得失</button>
<button class="tab-btn" onclick="switchTab(3, this)">火炉边的闲聊</button>
</div>
<!-- ══ PANEL 1 ══ -->
<div class="panel active" id="panel0">
<div class="p1-wrap">
<div class="p1-header">
<div class="week-strip">
<div class="wline"></div>
<div class="wnum" id="weekNum">WEEK 1</div>
<div class="wline r"></div>
</div>
</div>
<div class="quote-card" id="quoteCard">
<button class="q-btn q-btn-side q-btn-left" id="prevBtn" onclick="changeWeek(-1)">← 上一周</button>
<button class="q-btn q-btn-side q-btn-right" id="nextBtn" onclick="changeWeek(1)">下一周 →</button>
<div class="q-theme" id="qTheme"></div>
<div class="q-zh" id="qZh"></div>
<div class="q-colloquial" id="qColloquial"></div>
<div class="q-en" id="qEn"></div>
<div class="q-divider"></div>
<div class="q-attr">
<div class="q-avatar" id="qAvatar"></div>
<div>
<div class="q-name" id="qName"></div>
<div class="q-title" id="qTitle"></div>
</div>
</div>
<div class="q-insight">
<div class="q-insight-label">对你的意义</div>
<div class="q-insight-text" id="qInsight"></div>
</div>
</div>
<div class="prog-wrap">
<div class="prog-bar-out"><div class="prog-bar-in" id="progBar"></div></div>
<div class="prog-text" id="progText"></div>
</div>
<div class="q-nav">
<button class="q-btn primary" onclick="goNow()">本周</button>
</div>
<div class="week-dots" id="weekDots"></div>
<div class="footer-line">每周一句 · 慢慢改变 · 长期复利</div>
</div>
</div>
<!-- ══ PANEL 2 ══ -->
<div class="panel" id="panel1">
<div class="p2-wrap">
<div class="p2-intro">
<div class="p2-title">本金与子弹</div>
<div class="p2-subtitle">Cash · Dry Powder · Expected Value · Capital Allocation</div>
</div>
<div class="p2-formula">
<div class="p2-formula-label">核心公式 · The Core Equation</div>
<div class="p2-formula-eq">
长期财富 = 本金安全 × 子弹效率 × 等待耐心
</div>
<div class="p2-formula-sub">
三项任何一项为零,结果归零。<br>
三项同时最大化,才能实现非对称的长期复利。
</div>
</div>
<!-- Section 1 -->
<div class="p2-section open" id="s0">
<div class="p2-section-header" onclick="toggleSection(0)">
<div class="p2-icon"></div>
<div>
<div class="p2-section-label">现金仓的本质</div>
<div class="p2-section-en">Cash is not zero. Cash is an option.</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">现金不是零收益,是一张永不过期的期权</div>
<div class="p2-law-body">持有现金意味着你拥有在任意时刻、以任意价格买入任意资产的权利。这张期权没有行权成本,没有到期日,只有一个代价:你在等待期间的机会成本。</div>
<div class="p2-law-quote">"Cash combined with courage in a crisis is priceless." — Buffett</div>
<div class="p2-law-tag">期权价值理论</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">现金仓的三层结构</div>
<div class="p2-law-body">第一层:随时可用,应对闪崩(24小时内出手)。第二层:短期备用,应对政策/加息窗口(1~30天)。第三层:永久Dry Powder,永远不挂单,只为完全预料不到的事。三层不能混用。</div>
<div class="p2-law-tag">桥水资本 流动性分层框架</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">现金仓的最低红线:10%~15%</div>
<div class="p2-law-body">无论行情多好,永远保留10%~15%的现金仓不动。这不是保守,这是保证你在市场最极端时刻永远有出手能力。一旦子弹打完,你就从猎人变成了观众。</div>
<div class="p2-law-tag">仓位管理铁律</div>
</div>
</div>
</div>
</div>
<!-- Section 2 -->
<div class="p2-section" id="s1">
<div class="p2-section-header" onclick="toggleSection(1)">
<div class="p2-icon">🎯</div>
<div>
<div class="p2-section-label">机会成本</div>
<div class="p2-section-en">Opportunity Cost · Best Use of Capital</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">每笔资金都有隐形成本</div>
<div class="p2-law-body">你把¥4,220挂在¥2.11,它的机会成本不是零,而是这笔钱在更高赔率机会(¥1.80)里能创造的收益。机会成本是真实的,即使它不出现在账单上。</div>
<div class="p2-law-quote">"The cost of something is what you give up to get it." — N. Gregory Mankiw</div>
<div class="p2-law-tag">经济学第一原理</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">资本配置优先级三问</div>
<div class="p2-law-body">在使用任何资金前,必须问:① 这是当前最高赔率的机会吗?② 赔率是否足够倾斜(向上空间 ÷ 向下空间 ≥ 2)?③ 使用这笔资金的机会成本是什么?三问全部通过,才动用资金。</div>
<div class="p2-law-tag">Capital Allocation Hierarchy</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">小机会是大机会的天敌</div>
<div class="p2-law-body">把子弹打在赔率普通的机会上(¥2.11),导致赔率极高的机会来临时(¥1.80)没有子弹——这才是现金仓管理最大的失误。不是持有太多现金,而是把子弹打在了错误的目标上。</div>
<div class="p2-law-tag">Druckenmiller 重仓原则</div>
</div>
</div>
</div>
</div>
<!-- Section 3 -->
<div class="p2-section" id="s2">
<div class="p2-section-header" onclick="toggleSection(2)">
<div class="p2-icon">📐</div>
<div>
<div class="p2-section-label">期望值管理</div>
<div class="p2-section-en">Expected Value · Kelly Criterion</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">期望值公式</div>
<div class="p2-law-body">期望值 = 胜率 × 盈利幅度 − 败率 × 亏损幅度。只有期望值为正,且足够高,才值得出手。赔率不够时,期望值可能为正但极小——凯利公式会告诉你最优仓位接近零。</div>
<div class="p2-law-quote">"It's not whether you're right or wrong, but how much you make when right and lose when wrong." — Soros</div>
<div class="p2-law-tag">Kelly Criterion · 1956 Bell Labs</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">管理的是系统,不是单笔</div>
<div class="p2-law-body">一次踏空(没买到¥2.11)不影响系统期望值。重要的是:每次决策是否符合框架?框架的长期期望值是否为正?单次结果是随机的,系统的期望值才是真实的。</div>
<div class="p2-law-tag">Annie Duke · Resulting 谬误</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">频繁交易是期望值的侵蚀剂</div>
<div class="p2-law-body">在震荡市里+3%/+5%来回做,手续费+摩擦成本+机会成本加总后,实际收益趋近于零。凯利公式在低赔率情景下的答案是:仓位接近零。不做,有时候是最高期望值的选择。</div>
<div class="p2-law-tag">均值回归陷阱</div>
</div>
</div>
</div>
</div>
<!-- Section 4 -->
<div class="p2-section" id="s3">
<div class="p2-section-header" onclick="toggleSection(3)">
<div class="p2-icon">🔫</div>
<div>
<div class="p2-section-label">子弹纪律</div>
<div class="p2-section-en">Dry Powder Discipline · Conviction Sizing</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">子弹的三种错误死法</div>
<div class="p2-law-body">太早打完:市场跌5%全仓,跌15%的真正机会来了没子弹。永远不打:等到跌40%才敢买,市场只跌30%就反弹。③打在错误目标:赔率普通的机会消耗了赔率极高时需要的子弹。你的问题主要是③。</div>
<div class="p2-law-tag">子弹消耗失误分类</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">高确信度时重仓,这是职业和业余的分水岭</div>
<div class="p2-law-body">把最多的子弹压在最高确信度的区间。你的日经52,000~54,000、标普5,700~6,000是高确信区,理应是最大注。哨兵档的子弹越少越好,主仓档的子弹越多越好。</div>
<div class="p2-law-quote">"The best investment you can make is one where you risk a little to make a lot." — Druckenmiller</div>
<div class="p2-law-tag">Conviction Sizing · 集中押注原则</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">买入标准:必要条件 vs 充分条件</div>
<div class="p2-law-body">必要条件:价格合理(如溢价消失)。充分条件:价格合理 且 赔率足够高 且 这是当前资本最优配置。你的卖出系统(阶梯止盈)是充分条件设计。你的买入系统需要同样的严格标准。</div>
<div class="p2-law-tag">买入充分条件框架</div>
</div>
</div>
</div>
</div>
<!-- Section 5 -->
<div class="p2-section" id="s4">
<div class="p2-section-header" onclick="toggleSection(4)">
<div class="p2-icon"></div>
<div>
<div class="p2-section-label">市场状态过滤器</div>
<div class="p2-section-en">Market Regime Filter · Big Picture First</div>
</div>
<div class="p2-chevron">▶</div>
</div>
<div class="p2-body">
<div class="p2-law">
<div class="p2-law-num">01</div>
<div class="p2-law-content">
<div class="p2-law-title">大盘是所有ETF的公因子</div>
<div class="p2-law-body">大盘不好,整个板块都不好。在做个股/ETF决策之前,先判断市场整体处于什么状态。大盘是流动性和情绪的晴雨表,是第一道过滤开关,不是预测工具。</div>
<div class="p2-law-tag">Market Regime Filter · 桥水 / AQR</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">02</div>
<div class="p2-law-content">
<div class="p2-law-title">沪深300四档状态机</div>
<div class="p2-law-body">4,000点以上:正常,不追加仓位。3,500~4,000:警戒,准备子弹开始挂单。3,200~3,500:恐慌,第一批子弹触发。3,200以下:极端,主仓子弹全部出动。大盘状态决定整体仓位上限。</div>
<div class="p2-law-tag">你自己悟出的 Regime Filter</div>
</div>
</div>
<div class="p2-law">
<div class="p2-law-num">03</div>
<div class="p2-law-content">
<div class="p2-law-title">预期值不是绝对,是开关</div>
<div class="p2-law-body">不需要知道最低点在哪里。只需要知道"现在的市场状态允不允许我动手"。大盘过滤器把不可知的(精确低点)转化为可判断的(状态档位),这是系统从感性走向理性的关键一步。</div>
<div class="p2-law-tag">你的原话,华尔街叫 Regime Filter</div>
</div>
</div>
</div>
</div>
<div class="footer-line" style="margin-top:20px">本金是前提 · 子弹是工具 · 纪律是护城河</div>
</div>
</div>
<!-- ══ PANEL 3: 实战与得失 ══ -->
<div class="panel" id="panel2">
<div class="p1-wrap">
<div class="p3-intro">
<div class="p3-title">实战与得失</div>
<div class="p3-subtitle">Battle Scars · Hard-Won Wisdom · From Practice to Theory</div>
</div>
<!-- 顶部引言卡 -->
<div class="quote-card p3-creed-card">
<div class="q-theme">核心信条 · The Creed</div>
<div class="q-en" style="font-size:17px;">"证券几百年就这么一点东西。找对方法,克服人性,就可以赚钱。"</div>
<div class="q-zh" style="margin-top:16px;">— 清河,2026年</div>
<div class="p3-creed-body">
<div class="q-insight-label">华尔街的同一句话</div>
<div class="q-insight-text">"Investing is simple, but not easy." — Warren Buffett. 简单,是因为原理就那几条。不容易,是因为对抗人性需要一辈子的修炼。</div>
</div>
</div>
<!-- 条目翻页 -->
<div class="p1-header">
<div class="week-strip">
<div class="wline"></div>
<div class="wnum" id="p3num">01</div>
<div class="wline r"></div>
</div>
</div>
<div class="quote-card" id="p3card">
<div class="q-theme" id="p3theme"></div>
<div class="q-en" id="p3en" style="font-size:17px;"></div>
<div class="q-zh" id="p3zh"></div>
<div class="q-divider"></div>
<div style="margin-bottom:14px;">
<div class="q-insight-label">实战经历</div>
<div class="q-insight-text" id="p3exp"></div>
</div>
<div class="q-insight">
<div class="q-insight-label">华尔街理论印证</div>
<div class="q-insight-text" id="p3theory"></div>
</div>
<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;" id="p3tags"></div>
</div>
<div class="prog-wrap">
<div class="prog-bar-out"><div class="prog-bar-in" id="p3prog"></div></div>
<div class="prog-text" id="p3progtext"></div>
</div>
<div class="q-nav">
<button class="q-btn" id="p3prev" onclick="changeLesson(-1)">← 上一条</button>
<button class="q-btn primary" onclick="changeLesson(0,'first')">第一条</button>
<button class="q-btn" id="p3next" onclick="changeLesson(1)">下一条 →</button>
</div>
<div class="week-dots" id="p3dots"></div>
<div class="footer-line">从实战中悟出 · 被理论印证 · 持续迭代</div>
</div>
</div>
<script>
// ── QUOTES DATA ──
const quotes = [
{ theme:"等待 · Patience", en:"The stock market is a device for transferring money from the impatient to the patient.", zh:"股票市场是一台把钱从没耐心的人手里转移到有耐心的人手里的机器(大白话:股市本质就是财富搬运机:把急躁散户的钱,转给耐得住的投资者)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你设了挂单,然后等待。大多数人等不住,在最低点前割肉。你的耐心,本身就是你的优势。" },
{ theme:"纪律 · Discipline", en:"The few times I've been most certain, I've been most wrong.", zh:"越是笃定行情稳赚不赔的时候,往往越容易出现重大亏损(大白话:越觉得稳赢满仓梭哈,越容易踩大坑大亏)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"感觉最确定的时候,恰恰需要最谨慎。条件单的价值,是在你最亢奋时阻止你追高。" },
{ theme:"止盈 · Taking Profits", en:"No one ever went broke taking profits.", zh:"从来没有人因为及时止盈落袋最终破产(大白话:止盈永远不会亏到破产,贪到底才容易坐过山车由盈转亏)", name:"Bernard Baruch", title:"华尔街传奇投机者", avatar:"B", insight:"你的阶梯止盈系统,正是这句话的执行版本。止盈是确定性的胜利,不是胆怯。" },
{ theme:"现金仓 · Dry Powder", en:"Cash combined with courage in a crisis is priceless.", zh:"市场大跌危机中,手握现金再加敢于布局的胆识是无价之宝(大白话:熊市手里有闲钱、敢低位加仓,就是最硬的底牌)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的Dry Powder不是闲置,是在等待危机。危机来临时,有子弹的人是猎人,没子弹的人是猎物。" },
{ theme:"遗憾 · Regret", en:"The biggest mistake is not having a rule at all. Selling too early is the cost of sleeping well.", zh:"投资最大的错误是没有任何交易纪律,过早卖出只是换取安稳睡眠的合理成本(大白话:炒股最怕毫无规矩乱操作,卖早少赚点,但能睡踏实不焦虑)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你每一次提前止盈的遗憾,换来的是确定性。在充满不确定性的市场里,确定性本身有价值。" },
{ theme:"系统 · System", en:"I have two rules. Rule 1: Never lose money. Rule 2: Never forget Rule 1.", zh:"我有两条投资铁律:第一条永远不要亏损本金;第二条牢记第一条规则(大白话:守好本金是第一要务,时时刻刻不能忘)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"仓位上限、止损框架、Dry Powder——你的每一道规则,都是在保护本金不受永久性损失。" },
{ theme:"重仓 · Conviction", en:"Diversification is protection against ignorance. It makes little sense if you know what you are doing.", zh:"分散投资是对认知不足的风险对冲,当你吃透标的后,过度分散没有意义(大白话:看不懂才靠分散保命,研究透彻后分散反而稀释收益)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把主仓压在日经52,000~54,000、标普5,700~6,000,不是分散不够,是对高确信区间的集中押注。" },
{ theme:"非对称 · Asymmetry", en:"The best investment you can make is one where you risk a little to make a lot.", zh:"优质投资是用小幅可控风险,去博取长期丰厚收益(大白话:好机会就是亏有限、赚空间巨大的布局)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的伏击策略本质上是非对称收益——现价不动子弹归零,跌到位满仓获利翻倍。这就是最好的投资结构。" },
{ theme:"决策质量 · Process", en:"A good decision can have a bad outcome. A bad decision can have a good outcome. Outcomes cannot judge decision quality.", zh:"正确的决策短期也可能亏损,错误的决策靠运气也能盈利,单次盈亏无法评判决策好坏(大白话:一次赚钱不代表思路对,一次被套不代表策略失效)", name:"Annie Duke", title:"扑克世界冠军 / 决策科学家", avatar:"D", insight:"¥2.11没买、它涨上去了——这是好决策的坏结果。用结果评价决策是陷阱,用框架评价决策才是正道。" },
{ theme:"复利 · Compounding", en:"The first rule of compounding: never interrupt it unnecessarily.", zh:"复利第一准则:不要毫无缘由随意打断盈利复利滚动(大白话:盈利拿住别频繁止盈清仓,轻易中断复利等于丢大钱)", name:"Charlie Munger", title:"伯克希尔·哈撒韦 副主席", avatar:"M", insight:"你的系统每次完整执行——买入、止盈、回补——就是在让复利运转。打断它的,往往是情绪,不是理性。" },
{ theme:"市场先生 · Mr. Market", en:"Mr. Market is your servant, not your guide.", zh:"市场先生是为你服务的仆人,不是指引你买卖的向导(大白话:涨跌波动帮你捡低价筹码,别跟着行情涨跌追涨杀跌)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"市场跌到你的挂单价,它是在为你服务。市场飙升让你追高,它是在误导你。你的条件单,让你永远是主人。" },
{ theme:"情绪管理 · Emotion", en:"Once you have ordinary intelligence, what you need is the temperament to control the urges that get other people into trouble.", zh:"投资不需要绝顶智商,关键是拥有克制情绪化操作的心态(大白话:智商够用就行,管住追涨割肉的冲动才是赢钱关键)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你用条件单管住了冲动。这比任何分析技巧都重要。气质,才是散户和机构真正的分水岭。" },
{ theme:"等待机会 · Selectivity", en:"I only swing at pitches in my sweet spot.", zh:"我只在自己熟悉的优势区间出手布局(大白话:看不懂的行情一概不碰,只在自己的低估舒适区建仓)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"放弃¥2.11,等待¥1.80,就是在等甜蜜区的球。不是每个球都值得挥棒。" },
{ theme:"宏观判断 · Macro", en:"When I see a pile of money in the corner, I just go pick it up.", zh:"当市场出现明显低估的捡钱机会,果断进场布局即可(大白话:跌到明确价值底不用犹豫,分批捡筹码)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"你的套息平仓逻辑、中期选举统计——都是在寻找那堆角落里的钱。不是每次都有,但一旦找到,重仓。" },
{ theme:"风险管理 · Risk", en:"Rule No. 1 of risk management: survive to fight another day.", zh:"风险管理第一条准则:先保证账户存活,保留后续再战的本金(大白话:风控优先活下来,留得本金在不怕没行情)", name:"Ray Dalio", title:"桥水基金 创始人", avatar:"D", insight:"你的仓位上限——标普¥8万、纳指¥5万、日经¥3.5万——不是胆小,是确保你永远有机会再战。" },
{ theme:"黑天鹅 · Black Swan", en:"Prepare for the expected. But also prepare for the unexpected.", zh:"既要做好常规行情的预案,也要预留资金应对突发意外风险(大白话:常规下跌要防,黑天鹅暴跌也要留后手仓位)", name:"Nassim Taleb", title:"《黑天鹅》作者", avatar:"T", insight:"你的C档极端伏击价——日经45,000、标普4,800——就是为意外做的准备。大多数时候用不到,用到了是奇袭。" },
{ theme:"执行力 · Execution", en:"It's not what you know that makes you rich. It's what you do.", zh:"让人盈利的不是掌握多少投资道理,而是严格落地执行策略(大白话:懂再多没用,按规则实操才能落袋赚钱)", name:"Paul Tudor Jones", title:"都铎投资 创始人", avatar:"J", insight:"你知道套息逻辑,你知道选举统计,但让这些知识变成收益的,是你3月23日那天按下买入键。" },
{ theme:"本金保护 · Capital Preservation", en:"The most important thing about making money is not to let the losses get out of hand.", zh:"盈利的核心关键,是避免亏损持续失控放大(大白话:小亏不止损,最后容易深度套牢大亏)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的仓位上限、分档买入、Dry Powder,构成了一套完整的亏损防火墙。这是系统最重要的设计。" },
{ theme:"长期主义 · Long Term", en:"In the short run, the market is a voting machine. In the long run, it is a weighing machine.", zh:"短期市场是情绪化投票器,长期市场是价值称重器(大白话:短线涨跌看散户情绪,长线涨跌靠公司内在价值)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"你的伏击策略是长期主义的——不管短期怎么投票,只要资产真实价值在,称重机终会还原真相。" },
{ theme:"逆向思维 · Contrarian", en:"Be fearful when others are greedy, and greedy when others are fearful.", zh:"别人疯狂贪婪追涨时保持谨慎,市场集体恐慌割肉时逐步布局(大白话:全民狂热要收手,遍地恐慌敢捡筹)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的条件单在市场最恐慌时自动触发。这不是勇气——这是你在平静时做的决策,在恐慌中自动执行。" },
{ theme:"期望值 · Expected Value", en:"In investing, what is comfortable is rarely profitable.", zh:"投资里操作起来顺手舒服的选择,往往很难赚到钱(大白话:追涨买在高位最舒服,最后大多被套亏钱)", name:"Robert Arnott", title:"Research Affiliates 创始人", avatar:"A", insight:"3月23日大跌时买入,是痛苦的,不舒适的。正因为不舒适,大多数人不做,所以才有超额回报。" },
{ theme:"复利 · Eighth Wonder", en:"Compound interest is the eighth wonder of the world. He who understands it, earns it.", zh:"复利是世界第八大奇迹,吃透复利规律的人能从中获利(大白话:懂复利慢慢滚资产,不懂的白白错过财富增长)", name:"Einstein(被引用)", title:"被华尔街广泛引用", avatar:"E", insight:"你的阶梯止盈后立即设回补单,本质上是在让资金循环复利——每一次完整的买卖循环,都是复利的一次迭代。" },
{ theme:"自我认知 · Know Your Holdings", en:"Know what you own, and know why you own it.", zh:"清楚自己持仓的品种,同时明确买入的逻辑理由(大白话:每只持仓都要讲得出买入逻辑,杜绝无脑跟风买入)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你的每一笔挂单都有书面理由。这不是形式,这是确保你在市场震荡时,知道自己为什么在这里。" },
{ theme:"时间 · Time in Market", en:"Time in the market beats timing the market.", zh:"长期留在市场持仓,胜过频繁预判高低点择时(大白话:拿着等行情,远比天天猜顶摸底靠谱)", name:"Ken Fisher", title:"费雪投资 创始人", avatar:"F", insight:"你的系统不预测高低点,而是在足够低的区间分批建仓。这比试图精确抄底,更可执行,更有效。" },
{ theme:"凯利公式 · Kelly", en:"Bet big when the odds are in your favor. Bet small when they're not. Don't bet at all when you can't tell.", zh:"赔率占优时重仓布局,赔率不明时小仓试错,完全看不懂就空仓观望(大白话:划算机会重仓,模糊机会轻仓,看不懂直接不进场)", name:"Edward Thorp", title:"《击败庄家》作者 / 量化投资先驱", avatar:"T", insight:"凯利公式的精髓。你放弃¥2.11(赔率普通),保留资金等¥1.80(赔率高),这就是凯利在实战中的应用。" },
{ theme:"宏观过滤 · Don't Fight", en:"Don't fight the Fed. Don't fight the tape.", zh:"不要逆着货币政策操作,不要和中长期大趋势反向博弈(大白话:政策收紧别硬做多,大趋势向下别逆势抄底)", name:"Martin Zweig", title:"华尔街传奇分析师", avatar:"Z", insight:"你的大盘过滤器想法——用沪深300点位设买入开关——正是这句话的执行版本。宏观环境是第一道关卡。" },
{ theme:"独立思考 · Independence", en:"You are neither right nor wrong because the crowd disagrees with you.", zh:"持仓对错和大众观点无关,由背后的数据与逻辑决定(大白话:散户都反对不代表你错,逻辑数据过硬才是硬道理)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"在大跌时买入,所有人都说你疯了。但你的数据(历史支撑位)和推理(套息逻辑)是对的。" },
{ theme:"幸存者偏差 · Survivorship", en:"The market is filled with individuals who know the price of everything, but the value of nothing.", zh:"市场里多数人只紧盯股价涨跌,却无视资产本身内在价值(大白话:天天盯涨跌价位,从来不研究标的值不值钱)", name:"Philip Fisher", title:"成长股投资之父", avatar:"F", insight:"那个大V说全年空仓只做两三次——他告诉你的是价格,不是价值,也不是他的完整决策框架。" },
{ theme:"简单 · Simplicity", en:"Investing is simple, but not easy.", zh:"投资的道理通俗易懂,但是落地执行十分艰难(大白话:低买高卖人人会说,克服人性做到的寥寥无几)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的系统很简单:条件单、分档建仓、阶梯止盈。但执行它——在恐慌中不割肉,在亢奋中不追高——不容易。" },
{ theme:"适应性 · Adaptability", en:"It's not the strongest species that survives, nor the most intelligent. It's the one most responsive to change.", zh:"存活下来的不是最强壮的,也不是最聪明的,而是最能适应变化的。(大白话:股市里没有常胜将军,能活下来的不是最猛的那个,而是懂得顺势应变的人)", name:"Darwin(被引用)", title:"进化论之父", avatar:"D", insight:"你的策略从网格到选举策略到止盈框架,三次演变,每次有据可查。这种适应性,是长期存活的关键。" },
{ theme:"非对称收益 · Payoff", en:"I'm always thinking about losing money rather than making money.", zh:"我总在想怎么不亏钱,而不是怎么赚钱。(大白话:天天琢磨怎么赚钱容易踩坑,先想好怎么不亏钱才是正经事)", name:"Paul Tudor Jones", title:"都铎投资 创始人", avatar:"J", insight:"先想最坏情景——如果全部挂单触发后继续下跌怎么办——再决定仓位。这是反直觉但正确的思维顺序。" },
{ theme:"集中 · Concentration", en:"Wide diversification is only required when investors do not understand what they are doing.", zh:"只有投资者看不懂投资标的时,才需要大范围分散持仓(大白话:外行才遍地撒网乱买,内行精选少数标的集中布局)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把大量资金集中在日经52,000~54,000,标普5,700~6,000——这不是分散不够,是对高确信区间的正确集中。" },
{ theme:"机会成本 · Option Value", en:"The opportunity cost of holding cash is real, but so is the option value of waiting.", zh:"持有现金的机会成本是真实的,但等待的期权价值也是真实的。(大白话:空仓看别人涨确实难受,但耐心等确定性机会的潜在回报同样真实)", name:"Howard Marks", title:"橡树资本 创始人", avatar:"M", insight:"¥4,220放在¥2.11是机会成本;放在账户等¥1.80是期权价值。两者都真实,但后者在这个时刻更高。" },
{ theme:"周期 · Cycles", en:"The four most dangerous words in investing are: 'this time it's different.'", zh:"投资中最危险的四个字是:这次不一样。(大白话:每次牛市都有人喊这次不一样,结果发现该来的调整一个都不会少)", name:"John Templeton", title:"邓普顿基金 创始人", avatar:"T", insight:"套息崩塌、加息打压估值、选举年震荡——这些都不是第一次发生。历史会重演,不完全一样,但足够相似。" },
{ theme:"耐心 · The Long Game", en:"The stock market is designed to transfer money from the active to the patient.", zh:"股票市场是一台把钱从没耐心的人手里转移到有耐心的人手里的机器(大白话:股市本质就是财富搬运机:把急躁散户的钱,转给耐得住的投资者)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的条件单让你从活跃变成耐心。设好单,然后什么都不做——这是最难的操作,也是最有价值的操作。" },
{ theme:"概率思维 · Probability", en:"In the short run, results are dominated by randomness. In the long run, skill wins.", zh:"短期收益由随机行情主导,拉长周期专业能力终将兑现盈利(大白话:单次盈亏靠运气,长年赚钱靠成熟交易系统)", name:"Michael Mauboussin", title:"哥伦比亚商学院教授", avatar:"M", insight:"¥2.11没买到然后涨上去了——这是随机性。你的系统长期执行下去,能力会在足够多次后显现。" },
{ theme:"错误管理 · Managing Mistakes", en:"The most important thing is not to be right, but to make money when you are right.", zh:"最重要的不是要正确,而是正确时赚大钱,错误时少亏钱。(大白话:预测对错不重要,关键是对了要重仓赚足,错了要轻仓少亏)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的非对称设计:最坏情景子弹空置损失机会成本,最好情景满仓在底部获利翻倍。错误成本远小于正确收益。" },
{ theme:"记录 · Journaling", en:"Write down your reasons for every investment before you make it.", zh:"在每次投资前写下你的理由。如果你说不清楚,你可能不应该做。(大白话:动手买之前写清楚买入逻辑,讲不明白就别碰)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你的投资日志不是记录,是决策过滤器。每次写下理由,就是在强迫自己确认逻辑是否站得住脚。" },
{ theme:"市场情绪 · Sentiment", en:"Markets are constantly in a state of uncertainty and flux. Money is made by discounting the obvious.", zh:"市场永远处于不确定和波动中。钱是通过忽视显而易见、押注意外来赚的。(大白话:赚钱的机会藏在没人看好的角落里,跟风追热门注定赚不到大钱)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"大跌时人人恐慌,那是显而易见的情绪。你的条件单在那时自动买入,押注的是意外的反弹。" },
{ theme:"人性 · Human Nature", en:"The investor's chief problem — and even his worst enemy — is likely to be himself.", zh:"投资者最大的问题——甚至是最大的敌人——很可能是他自己。(大白话:炒股最大的敌人不是庄家也不是市场,而是自己的贪婪和恐惧)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"你用条件单把自己锁在决策链之外。这不是放弃控制权,这是把决策权交给更清醒的自己——设单时的你。" },
{ theme:"价值 · Price vs Value", en:"Price is what you pay. Value is what you get.", zh:"价格是你付出的成本,价值是你实际拿到的内在资产(大白话:你掏真金白银买的是股价,真正赚到靠的是公司本身价值)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"160644在¥2.11,价格合理了,但价值没有变。价值等于净值,溢价是情绪,不是价值。买价值,不买情绪。" },
{ theme:"专注 · Saying No", en:"Really successful people say no to almost everything.", zh:"真正成功者对几乎所有事说不。(大白话:高手不是机会多,而是大多数机会都舍得放掉,只抓最有把握的)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你放弃了¥2.11,说不。你有足够多的机会在等待——只做最高赔率的,忽略其他。这是真正的选择。" },
{ theme:"信念 · Conviction Sizing", en:"You need to have a big position in things when you have a huge edge.", zh:"当你有巨大优势时,要下大注。(大白话:没把握就小仓试错,有把握要敢于重仓,看对了不敢下注等于白看)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"你把主仓压在日经52,000~54,000、标普5,700~6,000。这两个区间是你的巨大优势区,应该是最大注。" },
{ theme:"学习 · Continuous Learning", en:"The more you learn, the more you earn.", zh:"学得越多,赚得越多。(大白话:投资认知每上一个台阶,赚钱能力就跟着长一截)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"从网格到选举策略,从单一挂单到资本配置优先级,你的系统在进化。每一次迭代,都是学习的复利。" },
{ theme:"现实主义 · No Forecasting", en:"Forecasts may tell you a great deal about the forecaster; they tell you nothing about the future.", zh:"预测告诉你很多关于预测者的事;对未来,它什么都说不了。(大白话:别信那些拍胸脯预测涨跌的,没人能看透未来,做好预案比猜方向靠谱)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"没有人知道日经什么时候跌到45,000,标普什么时候跌到5,700。不预测,只准备。这才是可执行的系统。" },
{ theme:"坚持 · Temperament", en:"The most important quality for an investor is temperament, not intellect.", zh:"投资者最重要的品质是气质,不是智力。(大白话:高智商不一定赚钱,跌了不慌、涨了不飘、空仓不急,这心态才是真本事)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在大跌时不割肉,在亢奋时不追高,在遗憾时不降低标准——这种气质,比任何分析能力都稀有。" },
{ theme:"系统思维 · Buy the Haystack", en:"Don't look for the needle in the haystack. Just buy the haystack.", zh:"不要在草堆里找针。把整个草堆买下来。(大白话:选股不如买指数,费劲挑半天还不如直接买整个市场省心赚钱)", name:"John Bogle", title:"先锋集团 创始人", avatar:"B", insight:"你的ETF组合——标普、纳指、日经——正是这个思路。买整个市场,让时间和分散做工作。" },
{ theme:"贪婪与恐惧 · Greed & Fear", en:"Try to be greedy when others are fearful. And try to be fearful when others are greedy.", zh:"别人贪婪狂热时保持谨慎,只有市场集体恐慌时才主动布局(大白话:全民追涨我收手,市场恐慌我分批进场)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"现在标普、纳指都在历史新高——这是别人贪婪的时刻。你把子弹留着,等别人恐惧时用。" },
{ theme:"过程 · Process Over Outcome", en:"A good process consistently applied will produce good outcomes over time.", zh:"一个持续执行的好过程,长期来看会产生好结果,即使单次结果有好有坏。(大白话:别在意一两次盈亏,坚持把交易流程走对,长期自然赚钱)", name:"Howard Marks", title:"橡树资本 创始人", avatar:"M", insight:"你的日志、条件单、分档系统——这是好过程。单次结果(某笔踏空或止盈早了)不影响过程的长期价值。" },
{ theme:"时间 · Plant a Tree", en:"Someone is sitting in the shade today because someone planted a tree a long time ago.", zh:"今天有人坐在树荫下,是因为很久以前有人种了一棵树。(大白话:现在赚的每一分钱,都是以前做对的布局结的果)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你今天设的每一张条件单,是在种树。也许三个月后触发,也许两年后触发。但树一直在生长。" },
{ theme:"改变 · Habit Formation", en:"The chains of habit are too light to be felt until they are too heavy to be broken.", zh:"习惯的锁链太轻,轻到感觉不到;直到它变得太重,重到无法打破。(大白话:坏习惯刚养成时觉得没什么,等发现改不掉时已经亏了大钱)", name:"Buffett引用Samuel Johnson", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"每周一句金句,是在建立投资认知的习惯。现在感觉轻——只是读一句话。一年后,它会成为你思维的一部分。" },
{ theme:"慢慢变富 · Slowly Rich", en:"Nobody wants to get rich slowly.", zh:"没有人愿意慢慢变富。(大白话:都想一夜暴富不愿慢慢攒,但股市里赚快钱的人最后都还回去了)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在做别人不愿意做的事——等待、忍耐、接受遗憾。这种反人性的坚持,就是超额回报的来源。" },
{ theme:"终章 · The Long Arc", en:"Our favorite holding period is forever.", zh:"我们最喜欢的持有期限是:永远。(大白话:好资产拿得住才是真本事,别总想着高抛低吸折腾)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"52周走完了。回头看——你的认知变了吗?你的决策框架更清晰了吗?如果是,这52句话做到了它该做的事。" },
{ theme:"等待 · Patience", en:"The stock market is a device for transferring money from the impatient to the patient.", zh:"股票市场是一台把钱从没耐心的人手里转移到有耐心的人手里的机器。(大白话:频繁操作不如耐心等,大多数人的钱都是等不住亏掉的)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你设了挂单,然后等待。大多数人等不住,在最低点前割肉。你的耐心,本身就是你的优势。" },
{ theme:"纪律 · Discipline", en:"The few times I've been most certain, I've been most wrong.", zh:"我最确定的那几次,往往是我最错的时候。(大白话:每次自己觉得稳赢的时候,往往才是最危险的时候)", name:"Stanley Druckenmiller", title:"杜肯家族办公室 创始人", avatar:"D", insight:"感觉最确定的时候,恰恰需要最谨慎。条件单的价值,是在你最亢奋时阻止你追高。" },
{ theme:"止盈 · Taking Profits", en:"No one ever went broke taking profits.", zh:"没有人因为止盈而破产。(大白话:赚了就跑永远是对的,别贪最后一口铜板)", name:"Bernard Baruch", title:"华尔街传奇投机者", avatar:"B", insight:"你的阶梯止盈系统,正是这句话的执行版本。止盈是确定性的胜利,不是胆怯。" },
{ theme:"现金仓 · Dry Powder", en:"Cash combined with courage in a crisis is priceless.", zh:"危机中,现金加上勇气,是无价之宝。(大白话:手上有钱心里不慌,真跌下来的时候谁有现金谁说了算)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的Dry Powder不是闲置,是在等待危机。危机来临时,有子弹的人是猎人,没子弹的人是猎物。" },
{ theme:"遗憾 · Regret", en:"Selling too early is the cost of sleeping well.", zh:"卖早了,是睡得好的代价。(大白话:卖飞了是常态,能睡踏实才是真本事)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你每一次提前止盈的遗憾,换来的是确定性。在充满不确定性的市场里,确定性本身有价值。" },
{ theme:"系统 · System", en:"I have two rules. Rule 1: Never lose money. Rule 2: Never forget Rule 1.", zh:"我有两条规则。第一:永远不要亏钱。第二:永远不要忘记第一条。(大白话:炒股第一条是不亏钱,第二条是别忘第一条)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"仓位上限、止损框架、Dry Powder——你的每一道规则,都是在保护本金不受永久性损失。" },
{ theme:"重仓 · Conviction", en:"Diversification is protection against ignorance.", zh:"分散投资是对无知的对冲。(大白话:分散买一堆看不懂的票,本质就是在为自己的无知买单)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把主仓压在日经52,000~54,000、标普5,700~6,000,不是分散不够,是对高确信区间的集中押注。" },
{ theme:"非对称 · Asymmetry", en:"The best investment you can make is one where you risk a little to make a lot.", zh:"最好的投资,是用小风险博取大回报。(大白话:亏的时候只亏点小钱,赚的时候能赚个大的,这才是好买卖)", name:"George Soros", title:"量子基金 创始人", avatar:"S", insight:"你的伏击策略本质上是非对称收益——现价不动子弹归零,跌到位满仓获利翻倍。这就是最好的投资结构。" },
{ theme:"决策质量 · Process", en:"A good decision can have a bad outcome. Outcomes cannot judge decision quality.", zh:"好决策可能有坏结果。结果不能用来判断决策质量。(大白话:这次赚了不代表操作对,亏了也不代表当初判断错,别用结果倒推决策好坏)", name:"Annie Duke", title:"扑克世界冠军 / 决策科学家", avatar:"D", insight:"¥2.11没买、它涨上去了——这是好决策的坏结果。用结果评价决策是陷阱,用框架评价决策才是正道。" },
{ theme:"复利 · Compounding", en:"The first rule of compounding: never interrupt it unnecessarily.", zh:"复利的第一条规则:永远不要不必要地打断它。(大白话:复利最怕中途打断,没事别瞎折腾把盈利仓清掉)", name:"Charlie Munger", title:"伯克希尔·哈撒韦 副主席", avatar:"M", insight:"你的系统每次完整执行——买入、止盈、回补——就是在让复利运转。打断它的,往往是情绪,不是理性。" },
{ theme:"逆向思维 · Contrarian", en:"Be fearful when others are greedy, and greedy when others are fearful.", zh:"别人贪婪时我恐惧,别人恐惧时我贪婪。(大白话:大家都抢着买的时候你跑,没人敢要的时候你捡,就是这么反人性)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你的条件单在市场最恐慌时自动触发。这不是勇气——这是你在平静时做的决策,在恐慌中自动执行。" },
{ theme:"凯利公式 · Kelly", en:"Bet big when the odds are in your favor. Don't bet at all when you can't tell.", zh:"赔率有利时大注,看不清时不注。(大白话:胜算大的时候才敢下重注,看不清方向的时候千万别动手)", name:"Edward Thorp", title:"《击败庄家》作者 / 量化先驱", avatar:"T", insight:"你放弃¥2.11(赔率普通),保留资金等¥1.80(赔率高),这就是凯利公式在实战中的应用。" },
{ theme:"人性 · Self Enemy", en:"The investor's chief problem — and even his worst enemy — is likely to be himself.", zh:"投资者最大的问题——甚至是最大的敌人——很可能是他自己。(大白话:炒股最大的对手不是庄家,是你管不住的那个自己)", name:"Benjamin Graham", title:"价值投资之父", avatar:"G", insight:"你用条件单把自己锁在决策链之外。这不是放弃控制权,这是把决策权交给更清醒的自己——设单时的你。" },
{ theme:"气质 · Temperament", en:"The most important quality for an investor is temperament, not intellect.", zh:"投资者最重要的品质是气质,不是智力。(大白话:炒股到后面拼的不是分析能力,是跌了不慌涨了不飘的心态)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在大跌时不割肉,在亢奋时不追高,在遗憾时不降低标准——这种气质,比任何分析能力都稀有。" },
{ theme:"生活选股 · Know What You Own", en:"Invest in what you know. The best ideas come from your daily life.", zh:"投资你了解的东西。最好的想法来自你的日常生活。(大白话:身边天天用的东西就是最好的选股池,比看研报靠谱)", name:"Peter Lynch", title:"富达麦哲伦基金 前基金经理", avatar:"L", insight:"你用银行卡、宽带、加油站、家电筛选标的,是Consumer Intelligence——机构分析师最难获得的一手信息。" },
{ theme:"能力圈 · Circle of Competence", en:"Risk comes from not knowing what you are doing.", zh:"风险来自于不知道自己在做什么。(大白话:自己搞不懂的东西坚决不碰,看不懂的涨跌跟你没关系)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你放弃兆易创新,是因为你不懂半导体周期。不懂就不碰,是能力圈边界的正确应用,比买了再止损更高明。" },
{ theme:"慢慢变富 · Slowly Rich", en:"Nobody wants to get rich slowly.", zh:"没有人愿意慢慢变富。(大白话:都想一夜暴富不愿慢慢攒,但股市里赚快钱的人最后都还回去了)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你在做别人不愿意做的事——等待、忍耐、接受遗憾。这种反人性的坚持,就是超额回报的来源。" },
{ theme:"种树 · Plant Early", en:"Someone is sitting in the shade today because someone planted a tree a long time ago.", zh:"今天有人坐在树荫下,是因为很久以前有人种了一棵树。(大白话:今天下的每一张单都是在种树,现在忍得住以后才有阴凉)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你今天设的每一张条件单,是在种树。也许三个月后触发,也许两年后触发。但树一直在生长。" },
{ theme:"过程 · Process Over Outcome", en:"A good process consistently applied will produce good outcomes over time.", zh:"一个持续执行的好过程,长期来看会产生好结果。(大白话:一两次亏赚说明不了问题,把交易流程走对,长期自然能赚钱)", name:"Howard Marks", title:"橡树资本 创始人", avatar:"M", insight:"你的日志、条件单、分档系统——这是好过程。单次踏空或止盈早了不影响过程的长期期望值。" },
{ theme:"习惯 · Habit", en:"The chains of habit are too light to be felt until they are too heavy to be broken.", zh:"习惯的锁链太轻,轻到感觉不到;直到它变得太重,重到无法打破。(大白话:坏习惯一开始觉得没什么,等发现改不掉的时候已经亏了大钱)", name:"Buffett引用Samuel Johnson", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"每周一句金句,是在建立投资认知的习惯。现在感觉轻——只是读一句话。一年后,它会成为你思维的一部分。" },
{ theme:"周期 · Cycles", en:"The four most dangerous words in investing are: 'this time it's different.'", zh:"投资中最危险的四个字是:这次不一样。(大白话:每一次熊市都说这次不一样,结果发现该来的一个都不会少)", name:"John Templeton", title:"邓普顿基金 创始人", avatar:"T", insight:"套息崩塌、加息打压估值、选举年震荡——这些都不是第一次发生。历史会重演,不完全一样,但足够相似。" },
{ theme:"不预测 · No Forecasting", en:"Forecasts may tell you a great deal about the forecaster; they tell you nothing about the future.", zh:"预测告诉你很多关于预测者的事;对未来,它什么都说不了。(大白话:天天猜涨跌纯属浪费时间,做好分档等机会比预测准靠谱)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"不预测最低点在哪里,只准备在足够低的区间分批建仓。这才是可执行的系统,不是感觉驱动的猜测。" },
{ theme:"终章 · The Long Arc", en:"Our favorite holding period is forever.", zh:"我们最喜欢的持有期限是:永远。(大白话:好资产拿得住才是真本事,别总想着高抛低吸折腾)", name:"Warren Buffett", title:"伯克希尔·哈撒韦 CEO", avatar:"B", insight:"你把投资定义为终身事业。退休后继续,只是策略越来越防守。这个定位从根本上改变了你和市场的关系。" },
];
// ── LOCAL STORAGE ──
const STORAGE_KEY = 'wallstreet-wisdom-state';
function loadState() {
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (raw) {
const state = JSON.parse(raw);
if (state && typeof state.week === 'number') {
cw = Math.max(0, Math.min(quotes.length - 1, state.week));
if (Array.isArray(state.visited)) {
state.visited.forEach(v => visited.add(v));
}
renderQuote();
return;
}
}
} catch {}
// no saved state — default to current week
goNow();
}
function saveState() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
week: cw,
visited: Array.from(visited)
}));
} catch {}
}
// ── TAB SWITCHING ──
// ── HELPERS ──
const escHtml = s => String(s || '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
function switchTab(idx, btn) {
document.querySelectorAll('.tab-btn').forEach((b,i) => b.classList.toggle('active', i===idx));
document.querySelectorAll('.panel').forEach((p,i) => p.classList.toggle('active', i===idx));
}
// ── QUOTE LOGIC ──
function getCurrentWeek() {
const start = new Date('2026-06-05');
const today = new Date();
const diff = Math.floor((today - start) / 86400000);
return Math.max(0, Math.min(Math.floor(diff/7), quotes.length - 1));
}
let cw = 0;
const visited = new Set();
function renderQuote() {
const q = quotes[cw];
document.getElementById('weekNum').textContent = `WEEK ${cw+1}`;
document.getElementById('qTheme').textContent = q.theme;
document.getElementById('qEn').textContent = `"${q.en}"`;
const zhFull = q.zh;
const parenIdx = zhFull.indexOf('(');
if (parenIdx > -1) {
document.getElementById('qZh').textContent = zhFull.substring(0, parenIdx);
document.getElementById('qColloquial').textContent = zhFull.substring(parenIdx);
} else {
document.getElementById('qZh').textContent = zhFull;
document.getElementById('qColloquial').textContent = '';
}
document.getElementById('qAvatar').textContent = q.avatar;
document.getElementById('qName').textContent = q.name;
document.getElementById('qTitle').textContent = q.title;
document.getElementById('qInsight').textContent = q.insight;
document.getElementById('progBar').style.width = `${((cw+1)/quotes.length)*100}%`;
document.getElementById('progText').textContent = `${cw+1} / ${quotes.length} weeks`;
document.getElementById('prevBtn').disabled = cw===0;
document.getElementById('nextBtn').disabled = cw===quotes.length-1;
const card = document.getElementById('quoteCard');
card.style.animation='none';
setTimeout(()=>card.style.animation='cardIn 0.6s ease forwards',10);
renderDots();
}
function renderDots() {
const c = document.getElementById('weekDots'); c.innerHTML='';
quotes.forEach((_,i)=>{
const d=document.createElement('div');
d.className='dot'+(i===cw?' active':visited.has(i)?' visited':'');
d.title=`Week ${i+1}`;
d.onclick=()=>{cw=i;visited.add(i);renderQuote();saveState();};
c.appendChild(d);
});
}
function changeWeek(d){ cw=Math.max(0,Math.min(quotes.length - 1,cw+d)); visited.add(cw); renderQuote(); saveState(); }
function goNow(){ cw=getCurrentWeek(); visited.add(cw); renderQuote(); saveState(); }
// ── ACCORDION ──
function toggleSection(idx) {
const s = document.getElementById('s'+idx);
s.classList.toggle('open');
}
// ── INIT ──
loadState();
// ══ PANEL 3 DATA ══
const lessons=[
{
theme:"第一课 · 本金是子弹",
en:"本金不只是财富,是你在市场里的弹药。",
zh:"股市是滚动的火炉。炒股是火中取栗。5%进去,栗子在火堆中间,烫伤严重;等到-10%,栗子到了边上,熟透且危险小。",
exp:"刚进股市时追热点,每天看app看股评,勤奋操作。结果亏了不少钱,退出两年。重新进来后,改成等待回调再进场,用安全边际替代追涨。",
theory:"Kelly Criterion:赔率不足时最优仓位趋近于零。Benjamin Graham的安全边际理论:买入价格本身必须包含错误容忍空间。你的'火炉边上'比喻,是对Asymmetric Payoff的精准民间表达。",
tags:["安全边际 · Margin of Safety","非对称收益 · Asymmetric Payoff","凯利公式 · Kelly Criterion"]
},
{
theme:"第二课 · 退出赌场",
en:"在错误的游戏里用错误的方式玩,及时退出不是失败,是理性。",
zh:"机构和私募都是带窥探眼镜的高手。散户在信息不对称的赌场里,用勤奋对抗专业,是错误的竞争策略。",
exp:"发现自己每次操作都在遗憾——没抄底遗憾,没在高点卖出遗憾。偶尔买对了喝一杯庆幸。这种情绪化的操作模式,是亏损的根源。退出两年,重新进来后换了策略。",
theory:"Information Asymmetry(信息不对称):散户和机构的差距不是运气,是结构性的信息和工具差距。Buffett:'Risk comes from not knowing what you are doing.' 退出,是对自己认知边界的清醒判断,是元认知能力的体现。",
tags:["信息不对称 · Information Asymmetry","能力圈 · Circle of Competence","元认知 · Meta-Cognition"]
},
{
theme:"第三课 · 条件单管住人性",
en:"条件单不触发的时间都是垃圾时间。真正有价值的时间是设置条件单的时候。",
zh:"如果手工操作,会更加变形。条件单把'清醒时的决策'和'恐慌时的执行'彻底分离。不看手机是环境设计——用结构替代意志力。",
exp:"2026年3月23日,伊朗战争最激烈,条件单触发买入。心里认为下跌刚开始,几次想终止条件单,最后忍住执行。之后市场反弹,这是整个系统最高光的时刻。",
theory:"Kahneman的System 1 vs System 2:直觉情绪(认为还会跌)vs 理性预设(这是平静时分析的入场区间)。Pre-commitment Device(预承诺机制):平静时做决策,恐慌时自动执行。Thaler行为经济学:改变环境比改变意志力有效10倍。",
tags:["预承诺机制 · Pre-commitment","System 1 vs System 2","行为设计 · Behavior Design"]
},
{
theme:"第四课 · 生活选股法",
en:"Invest in what you know. The best investment ideas come from your daily life.",
zh:"银行卡是中国银行,宽带是中国电信,车子加中国石化,家里是美的电器。服务不错、不会倒闭、能拿分红——这是一套有内在逻辑的筛选框架。",
exp:"没有能力像巴菲特的研究员那样分析公司。用自己生活中反复接触的品牌和服务来做第一轮筛选,再用AI做辅助分析。选蓝筹和分红股,买错了也能拿分红,不大起大落。",
theory:"Peter Lynch的Consumer Intelligence:作为真实用户,你知道服务好不好——这是机构分析师最难获得的一手信息。Dividend as Return Anchor:分红提供现金流兜底,在市场下跌时不需要卖出资产。Quality + Low Volatility Factor:护城河+稳定现金流+低波动,是机构量化因子里最稳健的组合。",
tags:["消费者洞察 · Consumer Intelligence","分红锚 · Dividend Anchor","护城河 · Moat"]
},
{
theme:"第五课 · 入场逻辑要和标的匹配",
en:"买的是'替代品'还是'目标本身',决定了你的风险边界。",
zh:"想买腾讯阿里,港股价格高买不起,买中概互联网ETF替代。但ETF里还有很多不了解的公司,违背了'只买自己了解的标的'的原则。",
exp:"中概互联网ETF买在高位,跌了-20%。仓位3.5万,每跌10%补一次,还有一次补仓机会。不割,等待。相信腾讯是类似Google的优秀公司,周期问题,不是永久性损毁。",
theory:"Quality Trap vs Value Trap:优秀公司不等于好的投资,买入价格和公司质量之间的差距需要时间弥合。入场逻辑必须和实际持有标的完全匹配——用生活逻辑选了腾讯阿里,但买了混合包,是这笔最贵的教训。Position Sizing as Risk Management:仓位上限是硬约束,替代止损线控制最大暴露。",
tags:["标的匹配 · Position-Logic Match","质量陷阱 · Quality Trap","仓位即风控 · Position Sizing"]
},
{
theme:"第六课 · 采摘节与再平衡",
en:"Portfolio rebalancing is not an event. It is a discipline.",
zh:"每半年一次采摘节:拿出纯利的10%奖励自己,同时检查中国/海外/防御三板块是否偏离三分之一的配置目标,必要时再平衡。",
exp:"采摘节触发有两种方式:时间触发(每半年固定执行)和价格触发(某仓位盈利超过阈值主动止盈)。优先价格触发——不因为'时间还没到'而错过高点止盈的机会。",
theory:"Portfolio Rebalancing(再平衡):桥水全天候策略的核心之一,防止某个板块因为涨太多而偏离配置目标。Life-Cycle Investing(生命周期投资):临近退休防御仓位提高,是用时间维度管理资产配置。采摘节是你的民间版本——有书面记录、有触发条件、有决策节点。",
tags:["再平衡 · Rebalancing","生命周期投资 · Life-Cycle","采摘节 · Harvest Festival"]
},
{
theme:"第七课 · 持仓要做减法",
en:"Beyond 20 positions, additional diversification adds no risk reduction but adds management complexity.",
zh:"30个持仓,超过15个是在消耗注意力而不是贡献风险收益比。为了分散而分散(如东南亚ETF),不是为了收益而配置。",
exp:"持仓从国内+海外+防御加起来30个。东南亚ETF当时为了分散,现在看起不到分散作用,定位卫星仓但没有实际贡献。等采摘节决策——如果今天重新建仓还会买吗?答案是否的,就是退出候选。",
theory:"研究结论:超过15~20个标的后,分散风险的边际效益接近零,但管理成本线性上升。Buffett:'Diversification is protection against ignorance.' 你已经知道自己在做什么,过度分散是在稀释你的认知优势,而不是在降低风险。",
tags:["集中原则 · Concentration","边际分散 · Marginal Diversification","组合减法 · Portfolio Pruning"]
},
{
theme:"第八课 · 从技术入场到多因子入场",
en:"The more factors that align, the higher the probability and the better the payoff.",
zh:"从单纯箱体均线(价格因子),升级到PE分位+溢价率+分红率+均线(多因子)。多因子同时满足才入场,触发频率下降,但每次触发的胜率和赔率更高。",
exp:"之前用箱体均线设条件单,只看价格位置。现在不同类型的标的用不同理论:ETF看PE分位数,LOF看溢价率,蓝筹看分红率。子弹打出去的频率降低,但现金仓更充裕,等到的机会赔率更高。",
theory:"Multi-Factor Entry(多因子入场):从Technical Entry升级,同时考虑价格因子、估值因子、结构性因子、收益因子。凯利公式支持这个方向:多因子同时满足,胜率和赔率同步提升,最优仓位也相应增大。这是系统从Beta策略向Alpha策略进化的关键一步。",
tags:["多因子 · Multi-Factor","技术升级 · System Evolution","Alpha策略 · Alpha Strategy"]
},
{
theme:"第九课 · 克服人性的三个工具",
en:"The best weapon against human nature is a system that works even when you are afraid.",
zh:"①条件单:把决策和执行分离,清醒时决策,恐慌时自动执行。②不看手机:用环境设计替代意志力,消除情绪触发信号。③投资日志:让理性有据可查,让System 2在最激烈时刻依然能站稳。",
exp:"3月23日的条件单、每天上午不看手机收盘再看、每笔交易有书面理由——三个工具合在一起,构成了行为护城河。复盘时把焦点从结果移到决策质量:'当时的理由在那一刻是正确的吗?'",
theory:"Kahneman Pre-commitment Device + Thaler行为设计 + Graham书面记录原则。这三个工具的共同本质:用外部结构替代内部意志力。意志力是有限的会被消耗;结构是持续的不依赖状态。你的'行为护城河',比任何选股技巧都更值钱。",
tags:["行为护城河 · Behavioral Moat","预承诺 · Pre-commitment","环境设计 · Environment Design"]
},
{
theme:"第十课 · 投资是终身事业",
en:"The stock market is the greatest wealth-building machine ever invented for those who have patience.",
zh:"退休后继续投资,只是策略越来越防守。年轻时进攻仓位大;临近退休防御仓提到五成;钱生钱的逻辑不变。",
exp:"工作已到天花板,高体力高智力的工作未来不适合。需要学会钱生钱。把投资定义为终身事业,不是阶段性博弈。越来越保守,ETF+宽基+红利300+蓝筹,逐步替代个股和进攻型仓位。",
theory:"Life-Cycle Investing:年轻时Beta大,临近退休Alpha小、Beta小、Yield大。Dividend Investing升值:之前看不上5%分红,现在理解它的三个功能——现金流兜底、盈利纪律约束、复利再投入锚。Buffett:'The stock market is designed to transfer money from the active to the patient.' 你把自己从活跃者变成了耐心者。",
tags:["生命周期 · Life-Cycle","终身投资者 · Lifelong Investor","防御升级 · Defense First"]
},
{
theme:"第十一课 · 宽基替代选股——最有把握的标的",
en:"中证500和纳指100有波段、有灵活性,可以反复做。代表了股市里最好的那些股票,省得去研究。",
zh:"宽基指数就像菜市场的综合菜摊,不用一棵一棵挑菜,一篮子就把多样品种都买齐了。中证500弹性大像皮筋,扯得开弹得回,适合来回波段;纳指100像老字号招牌,长期拿着也稳。两个搭一起,个股的研究时间全省了,子弹打进去也安心。",
exp:"工薪阶层没有时间和能力研究个股,选择用宽基指数替代选股能力。中证500弹性大适合波段,纳指100兼顾波段和长期,两者成为子弹优先打入的核心标的。在大回调时会持续加仓,是组合里最有把握的两个。",
theory:"Smart Beta + Rules-Based Active Management。用系统化规则在高弹性指数上做有纪律的波段,是散户和专业投资者少有的共同语言。重要修正:中证500和纳指100的风险可控,是因为你的系统在控制风险,不是标的本身风险小——是框架让它们安全,不是它们天生安全。",
tags:["Smart Beta","宽基替代选股","Beta优化策略"]
},
{
theme:"第十二课 · 永续循环——卖出不是结束,是下一次建仓的准备",
en:"不可能永远不买回来。只是买回来的时候会有些门槛。大熊市回补门槛提升到-20%,牛市-10%立刻回补。如果对所有宽基都不想买了,那就停止证券投资。",
zh:"止盈清仓不是和这个标的永别,是暂时分手等更好的重逢机会。大熊市跌得深,等它跌到惨不忍睹再进场捡便宜;牛市浅调一下就接回来,不耽误下一趟车。要是所有宽基都看不上眼了,那才是真的离开股市——不是因为亏怕了,也不是因为年纪大了。",
exp:"中证500四档止盈(+10%/+20%/+30%/+40%)全部触发后清仓,留100股纪念作为观察哨。清仓后根据市场状态动态调整回补门槛:牛市浅调整快回补,熊市深调整再进场。退出整个市场的终极条件是对所有宽基失去信心,而不是亏了或老了。",
theory:"Full Position Lifecycle(完整仓位生命周期):建仓→持有→分批减仓→清仓→等待→重新建仓,无限循环。Dynamic Parameter Adjustment(动态参数调整):根据市场Regime调整回补参数,桥水全天候策略有同样机制。留100股是'观察哨'设计,保持对标的的感知,不失去跟踪能力。",
tags:["仓位生命周期","动态参数调整","永续循环交易"]
},
{
theme:"第十三课 · 两年沉默与正确的起点问题",
en:"我问的是:十年后赔钱的概率接近零,用什么方法。不是问怎么赚最多。",
zh:"别人炒股都在想怎么翻倍怎么暴富,你不一样,你上来先问怎么不亏钱。这就像学游泳先进浅水区,而不是直接跳进深水区呛水。先保证不淹死,再学怎么游得快。十年后回头看,不亏钱的方法,就是最赚钱的方法。",
exp:"第一阶段亏损后两年完全封闭,不看任何证券信息。重新进场的触发是工作到了天花板,收入下降,需要钱生钱。重新进场前先用AI对话学习框架,再用5万元小仓位验证:3个月不亏一分钱才算毕业。",
theory:"Loss Minimization as Primary Objective:从'怎么不亏'出发,而不是'怎么赚多',自然导向ETF、分散、条件单、仓位上限。Cooling-Off Period:重大亏损后需要18~24个月恢复客观判断能力,强制离场不是逃避,是心理修复。重要修正:赔钱概率=0理论上不存在,你管理的是损失幅度,不是损失概率。10年定投宽基历史数据显示不亏概率约95%,不是100%。",
tags:["Loss Minimization","冷静期","MVP验证","起点问题决定系统质量"]
},
{
theme:"第十四课 · 软件思维迁移——系统化是最深的护城河",
en:"没有哪个技术是No.1,C#也有优势,慢慢迭代会更好。认知以内的东西弄好,不要切来切去。",
zh:"做软件的人搞投资有个天然优势——知道什么叫版本迭代。今天做的策略不好用,下个版本改,一版一版磨,不要因为别人用的什么框架好就整个推倒重来。守住自己懂的那一亩三分地,别今天追光模块明天追电力设备,追来追去哪个都不熟,哪个都亏钱。",
exp:"软件从业背景带来的系统化、模块化、版本迭代、边界条件思维,高度契合投资系统设计。不追光模块、电力设备等热点板块,因为是认知以外的。目标是每年8%合格,不追求最高收益。计划未来用Trae开发投资管理系统,但判断现在还没准备好,投资理论需要先成熟。",
theory:"Benchmark-Relative Target:不追求最高收益,追求稳定超过通胀、接近市场均值的可持续收益。对应中国智慧'财不入急门'。Circle of Competence:认知以内才操作,认知以外坚决不碰。重要批判:软件迭代思维用在投资上有Overfitting(过拟合)风险——根据最近结果修改系统参数,系统会越来越适应过去,越来越不适应未来。迭代触发条件应该是逻辑改变,不是结果不满意。",
tags:["认知迁移","Benchmark-Relative Target","Circle of Competence","Overfitting警告"]
},
{
theme:"第十五课 · 系统的三个核心需求",
en:"覆盖我的操作、条件单触发参数验证、资金控制和去向。如果软件和券商账户资金有出入,系统就大打折扣了。",
zh:"想做一套软件管自己的投资,核心就三件事:操作要能记下来、条件单的参数要能验证对不对、钱去了哪里要能和券商对得上。要是软件显示的钱和券商账户里的钱对不上,那这软件就废了——你都不知道自己到底赚了还是亏了。",
exp:"构想中的个人投资管理系统需要覆盖三层:记录层(所有操作类型标准化)、信号层(PE/分红率/溢价率等参数验证)、资金层(与国信证券账户对齐)。判断1年内不开发,因为操作习惯还在验证中,理论还没成熟。",
theory:"交易系统三层架构:Trade Logging(记录层)、Signal Generation & Backtesting(信号层)、Portfolio Accounting & Reconciliation(资金层)。关键建议:需求一先做MVP,只支持最高频三种操作;需求二先用手工日志积累样本再谈回测,没有足够样本回测无意义;需求三放弃实时同步,改为日终手动对账,以券商为Single Source of Truth。最重要的缺失:加入第四需求——决策质量追踪,把系统从流水账升级为认知迭代工具。",
tags:["MVP First","Single Source of Truth","决策质量追踪","系统设计三层架构"]
},
{
theme:"第十六课 · 赢得不干净——干火药不足是系统性问题",
en:"纳指科技ETF完全走完条件单流程。就是干火药没有准备好,导致回补的时候降低了金额。抓住了机会,但子弹不足,机会被缩小了。",
zh:"纳指科技这笔操作,方向对了、条件单触发了、执行完整了,最后确实赚了钱。但是回头一看,回补的时候账户里现金不够,只能少买点。明明判断对了,却因为子弹不够,赚到的钱打了个折扣——赢了,但赢得不痛快。",
exp:"纳指科技那笔操作,条件单触发、方向正确、执行完整,结果盈利。但回补时现金仓不足,只能降低回补金额。明明判断对了,却因为资源约束导致收益缩水。这笔是整个系统里'赢了但赢得不干净'的代表性案例。",
theory:"Capacity Constraint(容量约束):判断正确但资源不足,是一种不出现在账面上的机会成本损失。现金仓不足的三种原因和对应解法:①子弹打在优先级更低的目标上(资本配置失误,解法是更严格的充分条件检查);②仓位上限设太满没给回补留空间(系统设计问题,解法是单独预留回补资金);③月度子弹节奏和市场机会节奏不匹配(现金流节奏问题,解法是提前预存未来两个月子弹)。",
tags:["Capacity Constraint","机会成本损失","现金仓三种不足模式","干火药管理"]
},
{
theme:"第十七课 · 六层仓位金字塔——风险分层是组合的骨架",
en:"大盘宽基10万、主题宽基8万、进取成长5万、优质进攻3.5万、弹性进攻2.5万、卫星博弈1万。",
zh:"仓位像盖楼打地基,越稳的层给的钱越多。大盘宽基是地基,10万打底稳稳当当;卫星博弈是楼顶的花园,1万够用就行,塌了也不影响整栋楼。每一层的亏损即使全亏完,也伤不到下面几层——这就是分层最大的价值,不是赚多少,是亏得起。",
exp:"2026年6月采摘节重新界定仓位分层,从大盘宽基到卫星博弈,金额从10万递减到1万,形成六级风险金字塔。通讯ETF定位在优质进攻层(3.5万),不是随手试错,是有真实信念支撑的标的。越稳的给越多钱,越进攻的给越少钱,仓位大小和风险特征完全反向对应。",
theory:"Risk Pyramid(风险金字塔)——标准机构组合管理框架,底层是低风险高流动性资产,越往上风险越高、仓位越小。这个设计的价值不只是控制风险,而是让每一层的亏损即使最大化,也不会动摇下面几层的稳定性。六层架构比三层更精细,说明你对自己的持仓特征已经有了清晰的分类能力。",
tags:["Risk Pyramid","仓位分层","风险金字塔","六级架构"]
},
{
theme:"第十八课 · 锚定偏差——卖飞了是危险的买入动机",
en:"当时买通讯ETF就是看好,条件单操作后一直向上,没有回调,没有买入机会。",
zh:"卖飞了的标的老想追回来,有点像初恋分手后老惦记着复合——到底是真的喜欢这个人,还是不甘心当初分开了?买回来之前先问自己一句:如果从来没有持有过它,今天第一次看到,你会买吗?答案是会,再想怎么买;答案是不确定,说明追回来的冲动里有不甘心在作祟。",
exp:"通讯ETF设了条件单但一直涨,没有触发买入。半年后在采摘节考虑是否重新伏击。追回的动机里,有多少是基于逻辑,有多少是基于'卖便宜了'的遗憾,需要分清楚。采摘节之前必须先过一道过滤:如果从来没有持有过它,今天第一次看到,你会买吗?答案是会,再继续分析;答案是不确定,说明追回来的冲动里有锚定的成分。",
theory:"Anchoring Bias(锚定偏差)——Kahneman研究:人类决策天然会被第一个接触到的数字(锚点)锚定。卖出价格成为锚点后,'追回来'的冲动看起来像逻辑,实际上是情绪。补充风险:光模块板块在AI算力爆发背景下可能进入新估值区间,原来的伏击价格可能永远触发不了。这时需要判断:是坚持等回调,还是接受新定价基准上移伏击价格?两个选择都可以,但背后的逻辑必须明确,不能是'再等等看'。",
tags:["Anchoring Bias","锚定偏差","卖飞追回陷阱","估值基准重置"]
},
{
theme:"第十九课 · 系统的终点是直觉专家——规则内化为本能",
en:"系统最高境界是成熟在胸,手到擒来。到了哪一步就走哪一步操作。失败怎么走,成功怎么走,大盘跌怎么走,大盘涨怎么走。",
zh:"刚开始开车的时候,挂挡要看、油门要找、后视镜要瞄,每步都要想。开了十年之后,上车松手刹踩油门就走,全部是肌肉记忆。投资系统也是这个道理——今天还要对着笔记查条件单,十年后这些规则就长在脑子里了,看到什么行情,手自动就操作了,不需要再翻本子。",
exp:"现在的系统需要刻意思考才能执行:查条件单、看仓位、对照框架、写日志。目标是10年后这些动作变成本能,不需要每次从头推演,规则已经编码进直觉。达到这个境界的条件,不是时间的积累,而是系统化训练的积累——日志、条件单、采摘节复盘,是这个训练的基础设施。",
theory:"Intuitive Expertise(直觉专家)——心理学家Klein研究:真正的专家直觉不是凭感觉,而是从系统化训练中提炼出来的模式识别能力。象棋大师看棋盘不需要逐步计算,是因为见过几十万个棋局,模式已经内化。投资的直觉专家同理——见过足够多的市场情景,规则已经内化,执行变成本能。重要前提:直觉专家的直觉来自系统化训练,不是随机经验。10年的随机经验只是10年的重复;10年的系统化记录和复盘,才是10年的真实成长。你的日志正是把随机经验转化为系统化训练的工具。",
tags:["Intuitive Expertise","直觉专家","系统化训练","模式内化"]
},
{
theme:"第二十课 · 风险收缩要和通胀挂钩——过度防御是慢性亏损",
en:"最大的不同应该是风险收缩。经历的东西多了,看到的东西多了,越来越稳健了。",
zh:"风险收缩就像冬天加衣服,加多少要看外面多少度,不能还没入冬就穿羽绒服。越来越稳是对的,但不能为了稳把收益率压到连通胀都跑不赢——看起来每天都在赚钱,实际上购买力一年比一年低。加衣服的速度要跟着气温走,不是跟着感觉走。",
exp:"每一次重新进入股市,风险意识都比上一次更强——从热点个股到宽基ETF,从频繁操作到条件单等待,从无仓位上限到六层金字塔。未来随着临近退休,防御仓位会进一步提高,进攻仓位继续收缩。这个方向是正确的,但节奏需要和实际需求挂钩,不能盲目加速。",
theory:"Inflation Risk(通胀风险)——不像市场下跌那样显眼,但对退休资产的长期侵蚀是真实的。中国历史通胀均值约2%~3%,实际需要名义收益率5%~6%才能保住购买力。如果风险收缩太快,全部转向防御资产,收益率可能跌到4%以下,看起来在赚钱,实际上购买力在下降。建议设动态收缩标准:每五年评估一次,根据当时的通胀率、退休时间表、现金流需求,决定防御仓位提高多少。不是线性收缩,是阶梯式的、有触发条件的收缩。Life-Cycle Investing核心原则:防御化的节奏要匹配你的负债端(退休后需要多少现金流),而不是主观上'觉得应该更稳了'。",
tags:["Inflation Risk","通胀侵蚀","Life-Cycle Investing","阶梯式收缩"]
}
];
// ══ PANEL 3 LOCAL STATE ══
const P3_KEY = 'wallstreet-wisdom-p3-state';
let cl = 0;
const p3visited = new Set([0]);
function loadP3State() {
try {
const raw = localStorage.getItem(P3_KEY);
if (raw) {
const state = JSON.parse(raw);
if (state && typeof state.lesson === 'number') {
cl = Math.max(0, Math.min(lessons.length - 1, state.lesson));
if (Array.isArray(state.visited)) state.visited.forEach(v => p3visited.add(v));
return;
}
}
} catch {}
cl = 0;
p3visited.add(0);
}
function saveP3State() {
try { localStorage.setItem(P3_KEY, JSON.stringify({ lesson: cl, visited: Array.from(p3visited) })); } catch {}
}
// ══ PANEL 3 LOGIC ══
function renderLesson() {
const l = lessons[cl];
document.getElementById('p3num').textContent = String(cl + 1).padStart(2, '0');
document.getElementById('p3theme').textContent = l.theme;
document.getElementById('p3en').textContent = '"' + l.en + '"';
document.getElementById('p3zh').textContent = l.zh;
document.getElementById('p3exp').textContent = l.exp;
document.getElementById('p3theory').textContent = l.theory;
document.getElementById('p3prog').style.width = ((cl + 1) / lessons.length * 100) + '%';
document.getElementById('p3progtext').textContent = (cl + 1) + ' / ' + lessons.length + ' 条';
document.getElementById('p3prev').disabled = cl === 0;
document.getElementById('p3next').disabled = cl === lessons.length - 1;
const tags = document.getElementById('p3tags');
tags.innerHTML = '';
l.tags.forEach(t => {
const span = document.createElement('span');
span.className = 'p2-law-tag';
span.textContent = t;
tags.appendChild(span);
});
const card = document.getElementById('p3card');
card.style.animation = 'none';
setTimeout(() => card.style.animation = 'cardIn 0.65s ease forwards', 10);
renderP3Dots();
saveP3State();
}
function renderP3Dots() {
const c = document.getElementById('p3dots');
c.innerHTML = '';
lessons.forEach((_, i) => {
const d = document.createElement('div');
d.className = 'dot' + (i === cl ? ' active' : p3visited.has(i) ? ' visited' : '');
d.title = '第' + (i + 1) + '条';
d.onclick = () => { cl = i; p3visited.add(i); renderLesson(); };
c.appendChild(d);
});
}
function changeLesson(d, mode) {
if (mode === 'first') { cl = 0; }
else { cl = Math.max(0, Math.min(lessons.length - 1, cl + d)); }
p3visited.add(cl);
renderLesson();
}
// ══ PANEL 3 INIT ══
loadP3State();
renderLesson();
</script>
<!-- ══ PANEL 4 CSS ══ -->
<style>
/* ── Panel 4: 火炉边的闲聊 — 电子书 ── */
.p4-wrap {
max-width: 800px;
margin: 0 auto;
padding: 40px 48px 100px;
position: relative;
}
/* 电子书头部 */
.p4-header {
text-align: center;
margin-bottom: 48px;
padding-bottom: 32px;
border-bottom: 0.5px solid rgba(201,168,76,0.15);
}
.p4-book-title {
font-family: 'Playfair Display', 'Noto Serif SC', serif;
font-size: 32px;
color: var(--gold-light);
letter-spacing: 0.08em;
margin-bottom: 8px;
}
.p4-book-subtitle {
font-family: 'Courier Prime', monospace;
font-size: 11px;
letter-spacing: 0.3em;
color: var(--text-dim);
opacity: 0.5;
}
.p4-book-desc {
font-size: 14px;
color: var(--text-dim);
margin-top: 12px;
line-height: 1.6;
}
/* 目录按钮 */
.p4-toc-bar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
padding: 12px 0;
border-bottom: 0.5px solid rgba(201,168,76,0.08);
}
.p4-toc-btn {
background: transparent;
border: 0.5px solid var(--gold-dim);
color: var(--gold-light);
font-family: 'Noto Serif SC', serif;
font-size: 13px;
padding: 6px 16px;
cursor: pointer;
border-radius: 2px;
transition: background 0.2s;
}
.p4-toc-btn:hover { background: var(--gold-dim); }
.p4-ch-progress {
font-family: 'Courier Prime', monospace;
font-size: 12px;
color: var(--text-dim);
letter-spacing: 0.1em;
}
/* 电子书正文 */
.p4-chapter {
display: none;
animation: p4FadeIn 0.5s ease;
}
.p4-chapter.active { display: block; }
@keyframes p4FadeIn {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.p4-ch-marker {
font-family: 'Playfair Display', serif;
font-size: 48px;
color: var(--gold);
opacity: 0.3;
line-height: 1;
margin-bottom: -8px;
}
.p4-ch-title {
font-family: 'Noto Serif SC', serif;
font-size: 24px;
color: var(--gold-light);
font-weight: 600;
margin-bottom: 28px;
line-height: 1.4;
}
.p4-paragraph {
font-size: 17px;
line-height: 1.9;
color: var(--text);
margin-bottom: 18px;
text-indent: 2em;
letter-spacing: 0.02em;
cursor: pointer;
border-radius: 2px;
padding: 2px 4px;
transition: background 0.2s, color 0.2s;
position: relative;
}
.p4-paragraph:hover {
background: rgba(201,168,76,0.04);
}
.p4-paragraph.tts-highlight {
background: rgba(201,168,76,0.12);
color: #f5f0e0;
}
.p4-paragraph.tts-highlight::before {
content: '▌';
position: absolute;
left: -8px;
color: var(--gold);
font-size: 14px;
}
/* 告诫后来者 特殊样式 */
.p4-paragraph.caution {
border-left: 2px solid var(--gold-dim);
padding-left: 16px;
margin-top: 24px;
color: var(--gold-light);
font-style: italic;
text-indent: 0;
}
.p4-paragraph.caution::before {
content: '※ ';
color: var(--gold);
}
/* ── 目录抽屉 ── */
.p4-toc-overlay {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,0.6);
z-index: 100;
}
.p4-toc-overlay.open { display: block; }
.p4-toc-drawer {
position: fixed;
bottom: 0; left: 0; right: 0;
max-height: 70vh;
background: var(--dark2);
border-top: 0.5px solid rgba(201,168,76,0.2);
z-index: 101;
transform: translateY(100%);
transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
overflow-y: auto;
border-radius: 12px 12px 0 0;
padding: 20px 24px 32px;
}
.p4-toc-drawer.open { transform: translateY(0); }
.p4-toc-drawer-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 0.5px solid rgba(201,168,76,0.1);
}
.p4-toc-drawer-title {
font-family: 'Noto Serif SC', serif;
font-size: 16px;
color: var(--gold-light);
}
.p4-toc-close {
background: none;
border: none;
color: var(--text-dim);
font-size: 20px;
cursor: pointer;
padding: 4px 8px;
}
.p4-toc-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
cursor: pointer;
border-radius: 4px;
transition: background 0.15s;
margin-bottom: 2px;
}
.p4-toc-item:hover { background: var(--gold-dim); }
.p4-toc-item.active { background: var(--gold-dim); }
.p4-toc-item.active .p4-toc-title { color: var(--gold-light); }
.p4-toc-marker {
font-family: 'Noto Serif SC', serif;
font-size: 14px;
color: var(--gold);
opacity: 0.7;
min-width: 24px;
text-align: center;
}
.p4-toc-title {
font-size: 14px;
color: var(--text);
line-height: 1.4;
}
/* ── TTS 朗读控制 ── */
.p4-tts-loading {
display: inline-block;
width: 14px; height: 14px;
border: 2px solid var(--gold-dim);
border-top-color: var(--gold);
border-radius: 50%;
animation: p4ttsSpin 0.6s linear infinite;
vertical-align: middle;
margin-left: 4px;
}
@keyframes p4ttsSpin { to { transform: rotate(360deg); } }
.p4-tts-play-btn {
position: fixed;
bottom: 16px; right: 16px;
width: 48px; height: 48px;
border-radius: 50%;
background: rgba(201,168,76,0.15);
border: 0.5px solid var(--gold-dim);
color: var(--gold-light);
font-size: 20px;
cursor: pointer;
z-index: 98;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.2s, transform 0.2s;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.p4-tts-play-btn:hover { background: rgba(201,168,76,0.25); transform: scale(1.05); }
.p4-tts-play-btn.playing { background: rgba(201,168,76,0.3); border-color: var(--gold); }
/* ── 语音控制栏 ── */
.p4-voice-bar {
display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
margin: 20px 0 30px; padding: 12px 16px;
background: rgba(255,255,255,0.03);
border: 0.5px solid rgba(201,168,76,0.12);
border-radius: 12px;
justify-content: center;
}
.p4-voice-bar .gen-btn {
background: rgba(201,168,76,0.15);
border: 0.5px solid var(--gold-dim);
color: var(--gold-light);
padding: 6px 16px;
border-radius: 20px;
cursor: pointer;
font-size: 13px;
white-space: nowrap;
transition: background 0.2s;
}
.p4-voice-bar .gen-btn:hover { background: rgba(201,168,76,0.25); }
.p4-voice-bar .gen-btn.generating { opacity: 0.6; pointer-events: none; }
.p4-voice-bar .play-btn {
background: transparent;
border: 0.5px solid var(--gold-dim);
color: var(--gold-light);
width: 34px; height: 34px;
border-radius: 50%;
cursor: pointer;
font-size: 14px;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background 0.2s;
flex-shrink: 0;
}
.p4-voice-bar .play-btn:hover { background: rgba(201,168,76,0.15); }
.p4-voice-bar .play-btn:disabled { opacity: 0.3; cursor: not-allowed; }
.p4-voice-bar .play-btn.playing { background: rgba(201,168,76,0.2); }
.p4-voice-bar .seek-bar {
flex: 1; min-width: 80px; max-width: 200px;
height: 3px;
-webkit-appearance: none; appearance: none;
background: rgba(255,255,255,0.1);
border-radius: 2px;
outline: none;
cursor: pointer;
}
.p4-voice-bar .seek-bar::-webkit-slider-thumb {
-webkit-appearance: none;
width: 12px; height: 12px;
border-radius: 50%;
background: var(--gold);
cursor: pointer;
}
.p4-voice-bar .seek-bar:disabled { opacity: 0.3; cursor: not-allowed; }
.p4-voice-bar .seek-bar::-webkit-slider-thumb:disabled { display: none; }
.p4-voice-bar .time-label {
font-size: 11px;
color: var(--text-faint);
font-family: 'Courier Prime', monospace;
white-space: nowrap;
min-width: 80px;
text-align: center;
}
.p4-voice-bar .speed-btn {
background: transparent;
border: 0.5px solid var(--gold-dim);
color: var(--text-dim);
padding: 2px 8px;
border-radius: 10px;
cursor: pointer;
font-size: 11px;
white-space: nowrap;
transition: all 0.2s;
}
.p4-voice-bar .speed-btn:hover { border-color: var(--gold); color: var(--gold-light); }
.p4-voice-bar .speed-btn.active { background: rgba(201,168,76,0.2); color: var(--gold); border-color: var(--gold); }
.p4-voice-bar .speed-btn:disabled { opacity: 0.3; cursor: not-allowed; }
/* ── TTS 生成模态 ── */
.p4-modal-overlay {
position: fixed; inset: 0;
background: rgba(0,0,0,0.7);
z-index: 999;
display: none;
align-items: center;
justify-content: center;
padding: 20px;
}
.p4-modal-overlay.open { display: flex; }
.p4-modal {
background: #1a1a1a;
border: 0.5px solid rgba(201,168,76,0.2);
border-radius: 16px;
padding: 24px;
width: 100%; max-width: 480px;
max-height: 80vh;
display: flex;
flex-direction: column;
}
.p4-modal h3 {
font-family: 'Noto Serif SC', serif;
font-size: 18px;
color: var(--gold-light);
margin: 0 0 16px;
}
.p4-modal .voice-select {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
.p4-modal .voice-select label {
font-size: 13px;
color: var(--text-dim);
white-space: nowrap;
}
.p4-modal .voice-select select {
flex: 1;
background: #222;
border: 0.5px solid rgba(201,168,76,0.2);
color: var(--gold-light);
padding: 6px 10px;
border-radius: 8px;
font-size: 13px;
outline: none;
}
.p4-modal .voice-select select option { background: #222; color: var(--gold-light); }
.p4-modal .start-btn {
background: rgba(201,168,76,0.2);
border: 0.5px solid var(--gold-dim);
color: var(--gold);
padding: 10px 20px;
border-radius: 10px;
cursor: pointer;
font-size: 14px;
width: 100%;
margin-bottom: 16px;
transition: background 0.2s;
}
.p4-modal .start-btn:hover { background: rgba(201,168,76,0.3); }
.p4-modal .start-btn:disabled { opacity: 0.4; cursor: not-allowed; }
.p4-modal .log-area {
background: #111;
border-radius: 10px;
padding: 12px;
height: 200px;
overflow-y: auto;
font-family: 'Courier Prime', monospace;
font-size: 12px;
line-height: 1.6;
color: var(--text-dim);
}
.p4-modal .log-area .log-info { color: var(--text-dim); }
.p4-modal .log-area .log-success { color: #4caf50; }
.p4-modal .log-area .log-error { color: #f44336; }
.p4-modal .log-area .log-done { color: var(--gold); }
.p4-modal .auto-close-hint {
text-align: center;
font-size: 12px;
color: var(--text-faint);
margin-top: 12px;
}
.p4-nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 32px;
padding-top: 20px;
border-top: 0.5px solid rgba(201,168,76,0.08);
}
.p4-nav-btn {
background: transparent;
border: 0.5px solid var(--gold-dim);
color: var(--gold-light);
font-family: 'Noto Serif SC', serif;
font-size: 13px;
padding: 8px 20px;
cursor: pointer;
border-radius: 2px;
transition: background 0.2s;
}
.p4-nav-btn:hover { background: var(--gold-dim); }
.p4-nav-btn:disabled { opacity: 0.3; cursor: default; background: transparent; }
.p4-nav-center {
font-size: 12px;
color: var(--text-dim);
font-family: 'Courier Prime', monospace;
}
/* ── 响应式 ── */
@media (max-width: 768px) {
.p4-wrap { padding: 20px 16px 100px; }
.p4-book-title { font-size: 24px; }
.p4-ch-title { font-size: 20px; }
.p4-paragraph { font-size: 15px; line-height: 1.8; }
.p4-ch-marker { font-size: 36px; }
.p4-tts-bar { padding: 8px 12px; gap: 8px; }
.p4-tts-btn { width: 36px; height: 36px; font-size: 16px; }
.p4-tts-speed input[type="range"] { width: 48px; }
.p4-toc-drawer { padding: 16px; }
}
@media (min-width: 1024px) {
.p4-wrap { padding: 48px 64px 120px; }
.p4-paragraph { font-size: 18px; }
}
/* 顶部导航横滑 */
.top-nav { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.top-nav::-webkit-scrollbar { display: none; }
.tab-btn { flex-shrink: 0; }
</style>
<!-- ══ PANEL 4: 火炉边的闲聊 ══ -->
<div class="panel" id="panel3">
<div class="p4-wrap">
<div class="p4-header">
<div class="p4-book-title">火炉边的闲聊</div>
<div class="p4-book-subtitle">FIRESIDE CHATS · A RETROSPECTIVE</div>
<div class="p4-book-desc">关于投资、教训和重新开始的故事集。每一章都来自真实的经历,写在深夜的台灯下。不是教科书,是炉火边的一席话。</div>
</div>
<div class="p4-toc-bar">
<button class="p4-toc-btn" onclick="p4ToggleToc()">☰ 目录</button>
<span class="p4-ch-progress" id="p4prog">1 / 16</span>
</div>
<!-- 章节容器 -->
<div id="p4chapter-container"></div>
<!-- 章节导航 -->
<div class="p4-nav">
<button class="p4-nav-btn" id="p4prev" onclick="p4Go(-1)">← 上一章</button>
<span class="p4-nav-center" id="p4navcenter">1 / 16</span>
<button class="p4-nav-btn" id="p4next" onclick="p4Go(1)">下一章 →</button>
</div>
</div>
</div>
<!-- 目录抽屉 -->
<div class="p4-toc-overlay" id="p4tocOverlay" onclick="p4CloseToc()"></div>
<div class="p4-toc-drawer" id="p4tocDrawer">
<div class="p4-toc-drawer-header">
<span class="p4-toc-drawer-title">目录</span>
<button class="p4-toc-close" onclick="p4CloseToc()">✕</button>
</div>
<div id="p4tocList">
<div class="p4-toc-item" data-ch="0"><span class="p4-toc-marker">①</span><span class="p4-toc-title">火中取栗</span></div>
<div class="p4-toc-item" data-ch="1"><span class="p4-toc-marker">②</span><span class="p4-toc-title">离场,也是一种判断</span></div>
<div class="p4-toc-item" data-ch="2"><span class="p4-toc-marker">③</span><span class="p4-toc-title">条件单:把清醒的自己锁进系统</span></div>
<div class="p4-toc-item" data-ch="3"><span class="p4-toc-marker">④</span><span class="p4-toc-title">生活,是最好的研究报告</span></div>
<div class="p4-toc-item" data-ch="4"><span class="p4-toc-marker">⑤</span><span class="p4-toc-title">入场的逻辑,必须和你持有的标的完全匹配</span></div>
<div class="p4-toc-item" data-ch="5"><span class="p4-toc-marker">⑥</span><span class="p4-toc-title">采摘节:给系统设置一个呼吸的节点</span></div>
<div class="p4-toc-item" data-ch="6"><span class="p4-toc-marker">⑦</span><span class="p4-toc-title">精简,是一种勇气</span></div>
<div class="p4-toc-item" data-ch="7"><span class="p4-toc-marker">⑧</span><span class="p4-toc-title">从价格到价值——条件单的进化</span></div>
<div class="p4-toc-item" data-ch="8"><span class="p4-toc-marker">⑨</span><span class="p4-toc-title">克服人性的三件武器</span></div>
<div class="p4-toc-item" data-ch="9"><span class="p4-toc-marker">⑩</span><span class="p4-toc-title">投资,是一门终身的手艺</span></div>
<div class="p4-toc-item" data-ch="10"><span class="p4-toc-marker">⑪</span><span class="p4-toc-title">最有把握的一注</span></div>
<div class="p4-toc-item" data-ch="11"><span class="p4-toc-marker">⑫</span><span class="p4-toc-title">卖出,是下一次买入的开始</span></div>
<div class="p4-toc-item" data-ch="12"><span class="p4-toc-marker">⑬</span><span class="p4-toc-title">两年的沉默,和一个更好的问题</span></div>
<div class="p4-toc-item" data-ch="13"><span class="p4-toc-marker">⑭</span><span class="p4-toc-title">软件工程师的投资系统</span></div>
<div class="p4-toc-item" data-ch="14"><span class="p4-toc-marker">⑮</span><span class="p4-toc-title">系统的骨架</span></div>
<div class="p4-toc-item" data-ch="15"><span class="p4-toc-marker">⑯</span><span class="p4-toc-title">赢得不干净的那一次</span></div>
</div>
</div>
<!-- TTS 生成按钮 + 播放控制 -->
<div class="p4-voice-bar" id="p4voiceBar">
<button class="gen-btn" id="p4genBtn" onclick="p4OpenGenModal()">🎙️ 生成语音</button>
<button class="play-btn" id="p4playBtn" onclick="p4PlayToggle()" disabled>▶</button>
<button class="play-btn" onclick="p4PlayStop()" disabled>■</button>
<input type="range" class="seek-bar" id="p4seekBar" value="0" max="100" disabled oninput="p4Seek(this.value)">
<span class="time-label" id="p4timeLabel">00:00 / 00:00</span>
<button class="speed-btn" id="p4speedBtn" onclick="p4CycleSpeed()" disabled>1.0x</button>
<audio id="p4chapterAudio" style="display:none"></audio>
</div>
<!-- TTS 生成模态 -->
<div class="p4-modal-overlay" id="p4modalOverlay">
<div class="p4-modal">
<h3>🎙️ 生成语音</h3>
<div class="voice-select">
<label>主播声音</label>
<select id="p4voiceSelect">
<option value="Zhixuan">知璇(自然女声)</option>
<option value="Xiaoyun">小云(标准女声)</option>
<option value="Xiaogang">小刚(标准男声)</option>
<option value="Zhiying">之莹(自然男声)</option>
</select>
</div>
<button class="start-btn" id="p4startGen" onclick="p4StartGenerate()">开始生成</button>
<div class="log-area" id="p4logArea"></div>
<div class="auto-close-hint" id="p4autoHint"></div>
</div>
</div>
<script>
const p4chapters = [
{
title: "火中取栗",
marker: "①",
paras: [
"有一种人,每天早晨打开手机的第一件事,是看股价。他们盯着跳动的数字,心跳跟着涨跌,情绪跟着红绿走。他们勤奋、认真、消息灵通,是朋友圈里最努力的\"投资者\"。",
"我曾经是其中之一。",
"那段时间,我把股市理解成一门需要勤奋钻研的学问。每天研究行业报告,追着热点走,相信只要足够努力,就能在市场里占到便宜。结果是:亏了不少钱,退出了两年。",
"退出之后,我想明白了一件事。",
"股市本质上是一个滚动的火炉。无数机构、私募、散户,每天在里面抢夺筹码。你进去,就是火中取栗。问题不是该不该取,而是什么时候取、在哪里取、用什么姿势取。",
"5%的时候进场,栗子还在火堆中间,烫伤是大概率事件。等到市场跌了10%、15%,栗子滚到了火堆边上,熟透了,危险也小了很多。这不是运气,这是位置的选择。",
"但大多数人做不到这一点。因为等待是反人性的。火堆越旺,越是觉得栗子在增多;跌下来的时候,又觉得火要熄了,不敢伸手。",
"本金,是你伸进火堆的那只手。它不只是财富,是你在市场里唯一的弹药。弹药打光了,你就从猎人变成了旁观者。无论接下来的机会多好,都只能眼睁睁看着。",
"所以,本金的第一要义不是增值,而是保存。保存它,才能等到火堆边上那颗最熟的栗子。",
"告诫后来者: 进场的时机,比进场的勇气更重要。勇气可以随时有,时机不会随时来。"
]
},
{
title: "离场,也是一种判断",
marker: "②",
paras: [
"市场从不缺少诱惑。它每天都在告诉你,这里有机会,那里有风口,再不上车就晚了。",
"许多人就是这样留下来的——不是因为想清楚了,而是因为舍不得走。",
"我选择了离开。整整两年,我刻意回避一切与股市有关的信息。看到大盘点位的新闻,目光直接跳过。朋友谈起某只股票涨了多少,我像没听见一样转移话题。旁人看来,这像是一种逃避。但在我内心,这是我做过的最清醒的决定之一。",
"离开的原因很简单:我意识到自己在一场错误的游戏里,用错误的方式参与。",
"机构投资者有研究团队、有数据系统、有风控模型。私募基金有信息网络、有资金优势、有专业交易员。而我,有的只是一部手机、一些碎片化的新闻,和过剩的热情。在这场信息极度不对称的战场上,我的勤奋不是优势,而是一种代价高昂的错觉。",
"两年后,我重新进来。但这一次,我带来的不是热情,而是问题:如果未来十年,我赔钱的概率可以无限接近于零,需要什么条件?",
"这个问题改变了一切。",
"从\"怎么赚更多\"变成\"怎么不赔钱\",看起来只是措辞的差异,实际上是整个投资逻辑的根本性转变。前者让你追涨,后者让你等待;前者让你集中赌注,后者让你控制暴露;前者依赖运气,后者依赖系统。",
"需要补充的是:赔钱概率接近零,在理论上并不存在。历史数据告诉我们,坚持十年定投宽基指数,不亏损的概率约在95%左右——这已经是普通投资者能够期待的最高确定性。真正的目标,不是消灭风险,而是把永久性损失的概率压到极低。这两件事看起来相似,内核完全不同。",
"离场,是为了更清醒地回来。这不是失败的承认,而是认知的升级。",
"告诫后来者: 知道自己不该在场,比知道该买什么更难,也更重要。市场永远在,机会永远有。但你的本金,只有一份。",
"---"
]
},
{
title: "条件单:把清醒的自己锁进系统",
marker: "③",
paras: [
"2026年3月23日,我记得很清楚。",
"那天全球市场大跌,伊朗局势最为紧张的时刻,我的手机上推送着密集的新闻。每一条都在告诉你:现在不是入场的时候。分析师在喊撤退,社交媒体在讨论最坏的情景,整个市场弥漫着一种说不清楚的恐惧。",
"我的条件单,在那天触发了。",
"说实话,我当时几次拿起手机,想要终止那笔买入。心里有一个声音在反复说:下跌才刚开始,现在买入不过是在山腰上接飞刀。等等,再等等。",
"但我最终没有动它。",
"不是因为我比别人更勇敢,而是因为那笔买入的决策,并不是在那一天做出的。它是我在几周前,在某个平静的晚上,坐在书桌前,认真分析之后写进系统的。那个时候,我没有恐惧,没有噪音,只有逻辑。",
"这就是条件单的本质:把清醒时的判断,锁定为恐慌时的执行。",
"人类的大脑在压力状态下,决策质量会显著下降。神经科学的研究早已证明这一点。当市场暴跌,当新闻铺天盖地,当周围的人都在讨论最坏的可能,你的杏仁核——那个负责情绪反应的原始脑区——会劫持你的理性判断。这不是性格软弱,这是进化的默认设置。",
"条件单,是对这个默认设置的主动对抗。它把决策的时间点和执行的时间点彻底分开。你不再需要在最恐慌的时刻做最重要的决定,因为那个决定,你早就做完了。",
"与此同时,我还有另一个习惯:上午不看手机,收盘后才看一眼。不是因为我不在乎,而是因为我明白一件事——条件单不触发的时间,都是垃圾时间。 真正有价值的时间,是你坐下来设置条件单、思考逻辑、写下理由的那些时刻。盯盘不是努力,是焦虑的另一个名字。",
"当然,这套系统并非无懈可击。同年稍晚,因为需要转移资金,我被迫提前修改了标普的止盈条件单,两笔价格相近,差价几乎消失。那笔操作看起来在框架内,实际上已经偏离了系统的初衷。事后复盘,我把它单独标注,用中划线保留原来的设计,在旁边写下了修改的原因和教训。",
"日志的价值,就在这里。它不是流水账,它是你和过去那个自己的对话。",
"告诫后来者: 在市场最平静的时候做决策,在市场最恐慌的时候执行决策。这两件事之间,需要一道门。条件单,就是那道门。",
"---"
]
},
{
title: "生活,是最好的研究报告",
marker: "④",
paras: [
"我没有彭博终端,没有研究团队,也没有专业的财务建模能力。我有的,只是自己的日常生活。",
"在我重新进入市场之后,第一个问题是:买什么?",
"答案出乎意料地简单。",
"我的银行卡是中国银行的,宽带是中国电信的,车子经常去中国石化加油,家里的空调、冰箱、洗衣机,大多是美的出品。这些品牌进入我的生活不是因为我刻意选择,而是因为它们足够好,好到成为了生活的一部分。",
"这就是我的选股逻辑——用脚投票,而不是用模型投票。",
"彼得·林奇把这种方法叫做Consumer Intelligence,消费者洞察。他的观点是:作为一个真实的用户,你对一家公司服务质量的判断,比坐在写字楼里读财报的分析师更真实、更直接。机构投资者看的是数字,而你感受的是体验。",
"当然,这套方法有它的局限。",
"消费者洞察能够告诉你一家公司今天是否依然受人信赖,却无法告诉你它明天的股价在哪里。中国石化是好公司,但新能源汽车的快速崛起正在改变加油站的使用频率,这是一个消费者视角很难量化的结构性压力。美的电器在家里用着顺手,但家电行业的价格战正在压缩利润空间,这需要更深入的研究来判断。",
"我选择的方式是:生活筛选作为第一道门,把不了解、不接触的行业全部排除;之后借助AI工具做辅助分析,了解公司的基本面和行业趋势;最后,选择分红稳定的蓝筹股作为持仓的安全垫。就算判断略有偏差,分红收益至少提供了一层缓冲。",
"但有一个教训必须诚实地说:好故事不等于好投资。",
"消费ETF有促进内需的逻辑,医疗ETF有人口老龄化的逻辑,中概互联网有中国最顶尖科技公司的逻辑。每一个故事听起来都无懈可击,每一个理由都足以说服自己。然而这些标的,最终都在我的账户里躺着亏损。",
"行为金融学把这种现象叫做Narrative Fallacy,叙事谬误。人类天生擅长把事情包装成一个逻辑自洽的故事,越好听的故事,越容易掩盖背后的概率和时机问题。一个逻辑成立,不等于市场会在你预期的时间内为它定价。",
"生活是最好的研究起点,但它不是终点。",
"告诫后来者: 你身边的品牌,是你的第一份研究报告。但在买入之前,请追问自己一个问题:这个逻辑,市场需要多久才会定价?如果答案是\"不知道\",请把仓位相应地缩小。",
"---"
]
},
{
title: "入场的逻辑,必须和你持有的标的完全匹配",
marker: "⑤",
paras: [
"有一类失误,比判断错误更难察觉,因为它发生在入场之前,藏在一个听起来合理的逻辑里。",
"我想买腾讯,但腾讯的港股价格让我望而却步,单股几百港元,对普通投资者而言不够灵活。于是我退而求其次,买了中概互联网ETF——理由是,这只ETF的前两大持仓分别是腾讯和阿里,合计占比超过50%。",
"看起来是一个聪明的替代方案。",
"但这个逻辑有一个根本性的裂缝:我买的是\"替代品\",不是\"目标本身\"。",
"中概互联网ETF里确实有腾讯和阿里,但它同时还持有数十家我从未深入研究的公司。我的入场理由是基于两家公司的判断,但我实际承担的,是整个ETF的风险暴露。这两件事之间的错位,在账面亏损出现之前,几乎是隐形的。",
"仓位最终跌了将近20%。我没有割肉,因为底层逻辑依然成立:腾讯是中国互联网的基础设施级公司,周期性的压力不等于永久性的价值损毁。但那个痛,是真实的。",
"这个教训,后来成了我每次入场前必须通过的一道检查:",
"我的买入理由,和我实际购买的标的,是否完全匹配?",
"如果你的逻辑是看好腾讯,请直接持有腾讯,或者找到一个腾讯占比足够高且其他持仓你同样认可的工具。如果你接受了一个混合包,就意味着你同时接受了包里你不了解的部分。这不是分散,这是在自己不知情的情况下承担了额外的风险。",
"有时候,\"退而求其次\"的背后,是对入场逻辑的妥协。而妥协的代价,往往在最不方便的时候以最直白的方式呈现。",
"告诫后来者: 买入之前,请把你的理由写下来,再对照你实际持有的标的,逐一确认两者是否一致。逻辑和标的之间任何一处错位,都是未来亏损的伏笔。",
"---"
]
},
{
title: "采摘节:给系统设置一个呼吸的节点",
marker: "⑥",
paras: [
"大多数投资者,要么太频繁地动,要么完全不动。",
"前者在每一次市场波动里寻找信号,把每一天都当作决策日,消耗大量精力,却往往得不偿失。后者则把\"长期持有\"变成了惰性的借口,任由持仓在时间里漂移,从未认真审视组合是否还符合当初的逻辑。",
"我给自己设计了一个节点,叫采摘节。",
"每半年一次,通常在6月底和12月底。这一天,我会坐下来,做三件事:第一,兑现一部分盈利,把纯利的10%作为奖励提出来,落袋为安;第二,检查中国、海外、防御三个板块的仓位比例,看是否偏离了原定的配置目标,必要时进行再平衡;第三,逐一审查所有未触发的条件单,问自己:当初设定这张单的逻辑,今天还成立吗?",
"这个设计的核心,是给系统一个有节奏的自我更新机制。",
"桥水基金的全天候策略,也把定期再平衡作为核心操作之一。不是因为他们能预测未来,而是因为他们知道:随着市场的涨跌,组合会自然地偏离初始的风险配置。如果不定期修正,今天的稳健组合,明天可能已经变成了一个隐性的高风险头寸。",
"采摘节的另一个价值,是对\"未触发条件单\"的复盘。",
"人们通常只复盘执行过的操作。但那些设了很久却从未触发的条件单,同样携带着信息。一张等待了六个月却没有触发的伏击单,有两种可能:一是原来的逻辑依然成立,市场只是还没有给你那个价格;二是底层逻辑已经发生了变化,那个价格可能永远不会再来。这两种情况需要不同的应对,而区分它们的唯一方式,是在采摘节的时候认真地重新审视。",
"采摘节的触发,我优先遵循价格条件而非时间节点。如果某个仓位在半年到来之前就已经实现了足够的盈利,我会提前执行采摘;但如果市场平淡,时间到了也不会为了动而动。节律是工具,不是目的。",
"告诫后来者: 投资组合需要呼吸。给它设置一个有节奏的检查节点,不是为了频繁操作,而是为了确保每一个持仓,在每一个时间点,都还有它存在的理由。",
"---"
]
},
{
title: "精简,是一种勇气",
marker: "⑦",
paras: [
"有一种膨胀,发生得悄无声息。",
"刚进场的时候,你只有几个标的,逻辑清晰,目标明确。但市场每天都在产生新的主题,新的逻辑,新的机会。东南亚经济崛起,于是加了一只东南亚ETF;半导体周期向上,于是研究了一阵创新药;通讯基础设施紧缺,于是关注了通讯ETF。",
"每一次加入,都有一个说得通的理由。",
"一年之后,回头看,账户里已经有了三十个标的。",
"三十个。",
"有些仓位只有几千块,小到连一次像样的止盈都意义有限,却在每次市场波动时都需要一点注意力。有些标的买入的理由已经模糊,当初写在日志里的那句话,今天再读,竟然有些陌生。有些卫星仓的弹性极小,分散作用微乎其微,存在的意义更多是一种心理上的宽慰。",
"这不是投资组合,这是一座想法的博物馆。",
"研究表明,超过十五到二十个持仓之后,每一个新增标的带来的分散效益接近于零,但管理成本却在线性增加。更深层的问题是:当持仓过多,你对每一个标的的了解深度必然下降。而了解深度的下降,意味着在关键时刻——市场急跌、条件单密集触发、需要快速判断——你的决策质量会系统性地打折扣。",
"我在采摘节的一项重要工作,是做减法。",
"筛选的标准只有一条:如果今天重新建仓,我还会买这个吗?答案是否定的,就列入退出候选名单。不必急于一次清空,但每次采摘节,都要让这份名单变短一点。",
"东南亚ETF最终会被清掉。它当初是为了分散而分散,不是为了信念而持有。这样的标的,在组合里的存在,是一种资本效率的慢性损耗。",
"精简,不是认输,而是把有限的子弹,集中在真正值得等待的目标上。",
"告诫后来者: 持仓的数量,是你真实了解程度的上限。超过这个上限,你不是在分散风险,你是在稀释认知。",
"---"
]
},
{
title: "从价格到价值——条件单的进化",
marker: "⑧",
paras: [
"有一种入场方式,简单直接:看着K线图,在你认为支撑位的价格挂一张买单,等它跌下来。",
"这是箱体操作的基本逻辑。价格在某个区间内震荡,上轨卖出,下轨买入,中间赚取价差。它是有效的,在特定市场环境下尤其有效。但它有一个根本性的局限:它只告诉你价格在哪里,不告诉你价值在哪里。",
"同一个价格,在不同的估值背景下,意义完全不同。一只ETF跌到了你设定的箱体下沿,可能是因为整体市场恐慌性下跌,底层资产的价值没有变化,这是真实的买入机会;也可能是因为这个板块的基本面发生了结构性的恶化,价格下跌只是价值重估的开始,这时候越跌越买是在走向深渊。",
"单纯的价格信号,无法区分这两种情况。",
"于是,我开始把条件单的触发逻辑,从单一的价格维度,扩展到多个维度的综合判断。",
"不同类型的标的,用不同的触发因子:宽基ETF参考PE分位数,当估值回落到历史均值以下某个水平时才考虑入场;LOF基金优先看溢价率,溢价率超过某个阈值时坚决不买,无论价格看起来多么诱人;分红型蓝筹股关注股息率,当股息率上升到某个历史高位时,往往意味着价格已经跌入了安全区间。",
"这不是增加复杂度,而是给每一笔资金的出发,设置一个更完整的出发理由。",
"代价是:触发的频率下降了。条件单更难被满足,等待的时间变长了。但每一次触发,背后的逻辑更扎实,胜率更高,赔率也更好。",
"凯利公式的核心洞见在这里得到了印证:优势不明显时,最优仓位趋近于零。 触发频率下降不是损失,是系统在自动过滤掉那些赔率不足的机会。",
"等待变长,现金仓相应地保持充裕。充裕的现金仓,是你在真正的机会出现时,不需要犹豫的底气。",
"告诫后来者: 价格告诉你位置,估值告诉你意义。在买入之前,请确认你的理由里,不只有前者。",
"---"
]
},
{
title: "克服人性的三件武器",
marker: "⑨",
paras: [
"有人问过Buffett,他的投资方法这么简单,为什么没有人能够复制?他回答:因为没有人愿意慢慢变富。",
"这句话的背后,藏着一个所有投资者迟早都要面对的真相:投资最大的敌人,不在市场里,在镜子里。",
"我有三件武器,用来应对这个敌人。",
"第一件,是条件单。",
"它把我从决策链里移除。我在平静的夜晚做出的判断,会在市场最狂热或最恐慌的时候,不受我情绪的干扰,机械地执行。2026年3月的那次触发,是这件武器最有力的证明。那天我几次想要终止,最终没有。因为信任系统,比信任当下的自己,代价更低。",
"第二件,是投资日志。",
"每一笔操作,都有书面的理由。理由写错了,不删除,用中划线划掉,在旁边写下修正。这个习惯看起来繁琐,实际上构建了一条审计轨迹。它让我在复盘时,能看到自己判断的原貌,而不是经过记忆美化之后的版本。",
"诺贝尔经济学奖得主Kahneman的研究表明:人类在没有系统性反馈的情况下,无法从经验中真正学习。日志,就是那个反馈机制。没有它,十年的经验只是一年经验的十次重复。",
"第三件,是不看手机。",
"上午不看,下午不看,只在收盘后看一眼。这不是自律,而是环境设计。行为经济学的研究早已证明,改变环境比改变意志力有效得多。当手机不在视野里,触发情绪决策的信号源就消失了。",
"这三件武器,有一个共同的本质:用外部结构替代内部意志力。意志力是有限资源,会被消耗,会在压力下失效。结构是持续的,不依赖状态。",
"但这里有一处坦诚的反思需要交代:系统再好,也会有被绕过的时刻。我曾经因为账户转移的压力,提前修改了一笔止盈条件单,结果卖出过早,错过了后续的涨幅。那笔操作在形式上走完了流程,但本质上是让外部压力替代了系统逻辑。",
"教训写进了日志,中划线之下,是当时的决定;中划线之上,是之后的反思。",
"告诫后来者: 你最大的敌人,不是市场的不确定性,而是你自己在不确定时刻的可预测反应。建立一套强过你的情绪的外部结构,比训练你的意志力,更可靠,也更持久。",
"---"
]
},
{
title: "投资,是一门终身的手艺",
marker: "⑩",
paras: [
"我重新进入市场的那一天,给自己设了一个毕业考试:用五万元,三个月内不亏一分钱。",
"不是赚多少,只是不亏。",
"这个门槛,今天看来几乎朴素得可笑。但当时的我,经历过一次完整的失败,花了两年时间重建认知,深刻明白自己在面对什么。那五万元不是赌注,是一张入场的资格证明。",
"三个月过去了,没有亏损。",
"这不是因为市场配合,而是因为那段时间,我只做了一件事:等。等到条件单触发,等到安全边际出现,等到逻辑和价格同时到位。不触发,就不动。",
"后来我逐渐明白,这个习惯,才是整个系统的核心。",
"投资不是一场可以在某个特定年龄\"毕业\"的学习,它更像是一门终身的手艺。年轻时,体力好、时间多,可以做更多的研究,承担更高的波动;年龄渐长,智识积累,阅历丰富,可以做更精准的判断;临近退休,现金流需求上升,防御仓位提高,策略转向稳健。这不是退步,这是随时间演化的理性选择。",
"有一句中国话,叫\"财不入急门\"。华尔街把同样的意思表述得更技术:Benchmark-Relative Target,基准相对目标——不追求最高收益,追求稳定超过通胀、接近市场均值的可持续回报。每年8%,复利二十年,是一个平凡但坚实的答案。",
"但这里有一个认知需要补充:风险收缩要有节奏,不能盲目加速。通胀是退休资产的隐形侵蚀者。把所有资金转向防御,账面上看起来在赚钱,购买力却在悄悄缩水。风险收缩,必须和你真实的现金流需求、通胀率、以及离退休的时间表,动态地挂钩。",
"我现在持有宽基ETF、蓝筹股、海外指数,以及少量的进攻型仓位。每半年复盘一次,每一笔操作有书面记录,每一个决定有可以被追溯的逻辑。",
"这套系统,今天还不完美,还在迭代。",
"但它是我的。它经历过亏损,经历过等待,经历过触发条件单时的恐惧,也经历过采摘节时的满足。每一处中划线背后,都是一次真实的失误和真实的修正。",
"这种真实,是任何一本教科书都无法给予的。",
"告诫后来者: 市场会一直在。你的系统,才是真正需要经营的资产。慢慢建它,认真维护它,让它比你的情绪更可靠,比你的记忆更诚实。"
]
},
{
title: "最有把握的一注",
marker: "⑪",
paras: [
"投资者通常把\"最喜欢\"和\"最有把握\"混为一谈。",
"最喜欢的,往往是涨得最多的,是让你赚过钱的,是在某个顺风的午后给你带来过愉悦感的标的。但最有把握的,是另一回事。它是那个你愿意在它大跌30%的时候,不仅不逃跑,反而继续买入的标的。这两件事,有时候重合,更多时候并不重合。",
"我最有把握的,是中证500和纳指100。",
"原因不复杂。这两个指数,代表的是各自市场里质量最优秀的那一批公司的平均。你不需要判断某一家公司的CEO是否足够聪明,不需要预测某个行业明年的政策走向,不需要在财报季屏住呼吸等数字。你只需要相信一件更简单的事:这些经济体会继续运转,里面最好的公司会继续创造价值,而这些价值,终将反映在股价上。",
"对于一个没有专职研究团队的工薪阶层投资者来说,这是最诚实的选择——把选股这件事外包给市场本身,而不是假装自己有能力比市场做得更好。",
"中证500比沪深300有更大的弹性,波段更明显,适合分批建仓、分批止盈的操作节奏。纳指100则兼顾了弹性和长期性——AI时代的核心受益者,大多汇聚于此。",
"但有一处误解需要澄清。",
"我说这两个标的\"风险可控\",说的是相对于个股而言。个股有归零的风险,指数没有。但如果把中证500和标普500放在一起比较,中证500的年化波动率实际上更高。它的风险可控,是因为我的系统在控制它——仓位上限、分档建仓、条件单触发——是框架在管理风险,不是标的本身天生安全。",
"离开系统,任何标的都可以变得危险。",
"告诫后来者: 选择一个你愿意在最坏时刻依然持有的标的,然后为这个选择建立一套系统。标的选对了,系统做好了,时间会替你做剩下的工作。",
"---"
]
},
{
title: "卖出,是下一次买入的开始",
marker: "⑫",
paras: [
"大多数人把卖出理解为结束。",
"仓位清空了,这段关系就结束了。或者永远持有,或者某天割肉离场,鲜少有人认真设计过:卖出之后,接下来怎么走。",
"我的系统里,卖出从来不是结束,而是循环的一个节点。",
"中证500的止盈计划是四档阶梯:+10%减仓30%,+20%再减30%,+30%减20%,+40%清仓。最后留100股,不卖。不是因为舍不得,而是因为这100股是一个观察哨——它让我在清仓之后,依然保持对这个标的的跟踪,不会因为清了仓就失去感知。",
"清仓之后,系统自动进入等待模式。",
"回补的触发条件,会根据市场状态动态调整。牛市里,市场调整浅,-10%可能就是阶段性的低点,此时设-10%的回补条件单,是合理的;熊市里,调整往往更深更久,门槛相应提高到-20%甚至更低,否则子弹会在下跌途中被提前消耗,无力应对真正的底部。",
"这种动态参数的调整,华尔街叫Regime-Based Parameter Setting,市场状态驱动的参数设定。桥水基金的全天候策略里,同样内置了这样的机制——不同的市场环境,适用不同的规则参数。",
"有一个问题值得认真回答:什么情况下,你会永远不再持有一个标的?",
"我的答案是:如果对所有宽基指数都失去了信念,那就彻底退出市场。不是因为亏钱,不是因为年龄,而是因为相信整个经济体会继续运转的前提不再成立了。",
"这个门槛极高,意味着我大概率会在市场里待一辈子。只是仓位的结构会变,进攻的比例会收缩,防御的比例会提升,但参与本身不会停止。",
"告诫后来者: 在设计买入计划的时候,同时设计卖出之后的回补计划。卖出是周期的节点,不是关系的终点。完整的循环,才是可以持续运转的系统。",
"---"
]
},
{
title: "两年的沉默,和一个更好的问题",
marker: "⑬",
paras: [
"有些人离开市场,是因为不甘心,打算养精蓄锐,找到时机卷土重来,把输掉的钱连本带利赚回来。",
"这种出发点,从一开始就错了。",
"我离开,是因为终于想清楚了一件事:我不适合那种玩法。 勤奋追热点,信息不对称,情绪化操作——这不是我能够持续胜出的赛道。既然赢不了,就不要在那个赌场里消耗自己。",
"两年的时间,我没有看任何证券资讯。安心工作,安心生活,任由账面亏损的记忆慢慢沉淀。",
"重新进来的契机,是工作遭遇了天花板。软件行业,收入已见顶,体力密集型的工作终究会在某个年龄失去优势。我需要找到一种不依赖体力和脑力的收入来源——这就是钱生钱的本质需求,朴素,真实,带着些许中年人的无奈。",
"这一次,我带来了一个不同的问题。",
"不再问\"怎么赚更多\",而是问:如果未来十年,我的亏损概率接近于零,需要什么条件?",
"这个问题的转变,让整个逻辑体系改变了方向。从\"怎么赚多\"出发,你会追涨、集中赌注、依赖预测;从\"怎么不亏\"出发,你会分散、控制仓位、依赖系统。前者是进攻优先,后者是防守优先。对于一个没有信息优势、没有时间优势的普通投资者来说,后者是更现实、也更可持续的路径。",
"需要诚实地补充一句:亏损概率为零,在理论上并不存在。历史数据显示,坚持十年定投宽基指数,不亏损的概率约为95%,不是100%。你真正管理的,是永久性损失的概率,而不是短期账面波动的概率。这两件事,必须分清楚。",
"还有一个隐患,在重新进来的那一刻就已经埋下了:触发我入场的,是工作压力,而不是系统准备好了。",
"当你\"需要\"市场给你回报的时候,你对风险的容忍度其实在下降,但对收益的渴望却在上升。这两种力量方向相反,在市场压力下极容易失控。我后来用仓位上限、月度子弹和条件单系统,在很大程度上对冲了这个风险。但它始终是一个需要警惕的底层心理张力。",
"告诫后来者: 带着正确的问题进场,比带着充足的资金进场更重要。问题决定方法,方法决定结果。问对了,时间会站在你这边。",
"---"
]
},
{
title: "软件工程师的投资系统",
marker: "⑭",
paras: [
"有时候,一个人最深的优势,藏在他认为最平常的地方。",
"我是软件行业出身,在这个行业里工作了很多年。写代码、做系统设计、跑版本迭代——这些工作训练出来的思维方式,某一天我突然发现,和投资系统的设计逻辑高度契合。",
"系统化思维,让我习惯把复杂的问题拆解成模块,让每个模块有清晰的边界和输入输出。投资组合,自然地被我分成了板块、仓位层级、触发条件——每一部分独立运作,又彼此关联。",
"模块化设计,让我不把所有决策放在同一个框架里处理。宽基ETF用PE分位数判断,LOF用溢价率判断,蓝筹股用股息率判断。不同工具,不同标准,不强行统一。",
"版本迭代,让我接受系统是不完美的、会进化的。从第一阶段的网格操作,到引入中期选举统计框架,再到多因子触发条件——每一次迭代,都有明确的触发原因,不是因为结果不好就改,而是因为逻辑升级了才改。",
"边界条件思维,让我给每个系统设置了硬约束:仓位上限不可逾越,永久Dry Powder不可动用,采摘节之外不修改条件单。边界的价值,是在你最冲动的时刻,替你说\"不\"。",
"但这里有一个需要认真对待的警告。",
"软件迭代有一个天然的陷阱,叫做Overfitting,过拟合。为了让系统更好地匹配历史数据,不断调整参数,最终训练出一个对过去极其精确、对未来毫无预测力的模型。",
"投资系统的迭代,面临同样的风险。每一次根据最近结果修改参数——把-15%改成-10%,因为上次太深了没触发;把+10%改成+8%,因为上次卖早了——这种调整,看起来像是在优化,实际上是在让系统越来越适应过去,越来越不适应未来。",
"迭代的正确触发条件,应该是逻辑改变,而不是结果不满意。这两者之间的区别,是系统保持生命力的关键所在。",
"告诫后来者: 你在其他领域培养的思维方式,也许正是你投资系统最需要的基础。迁移它,但要小心不要把它的缺陷一并迁移过来。",
"---"
]
},
{
title: "系统的骨架",
marker: "⑮",
paras: [
"每个人都说自己有系统。大多数时候,那只是一些零散的习惯和几条模糊的原则,在市场平稳的时候显得有条不紊,在真正的压力下一触即溃。",
"真正的系统,需要骨架。",
"我设想中的骨架,由三层组成。",
"第一层,是记录层。",
"所有操作,都必须有书面的理由。买了什么,为什么买,当时的逻辑是什么,预期的触发价格是多少,仓位上限是多少。这不是为了给别人看,而是为了给未来的自己看——当市场剧烈波动,当你想要打破规则,打开日志,找到那条理由,问自己:这个理由今天还成立吗?",
"记录的格式不重要,习惯的坚持才重要。中划线保留原始记录,不删除,不覆盖。每一处修改旁边,写下修改的原因。这是审计轨迹,也是认知进步的物证。",
"第二层,是信号层。",
"什么时候该出手,什么时候该等待,需要有明确的判断标准,而不是感觉和直觉。PE分位数、溢价率、股息率、均线位置——不同类型的标的,用不同的因子作为入场信号。多个因子同时满足,才触发买入。这个设计的代价是触发频率下降,好处是每一次触发的质量更高。",
"信号层最终需要用历史数据来验证有效性。但在数据积累足够之前,先用手工日志记录每一次触发的参数组合和结果,这是量化回测的前置条件,而不是可以跳过的步骤。",
"第三层,是资金层。",
"所有操作,最终都要落回账户里的真实数字。理论上的仓位比例,和实际账户里的资金分布,必须保持一致。两者之间任何持续的偏差,都意味着系统在某个地方失去了对现实的追踪。",
"以券商账户为单一数据源,系统只做记录和分析,不做独立核算。每天收盘后手动录入当日变动,定期对账。这不是最优雅的方案,但它可执行,误差可控。",
"还有一个经常被忽视的第四层,也许是最重要的一层:决策质量追踪。",
"记录操作,只是流水账。真正的认知迭代,来自于对决策质量的持续追问:这个判断在做出的那一刻,逻辑是否成立?结果和预期之间的偏差,是因为市场随机性,还是因为判断本身有缺陷?好结果不一定来自好决策,坏结果也不一定来自坏决策。区分这两件事,才是日志真正的价值所在。",
"告诫后来者: 系统的骨架越清晰,它在压力下越不容易变形。建造骨架,比挑选标的,更值得花时间。",
"---"
]
},
{
title: "赢得不干净的那一次",
marker: "⑯",
paras: [
"有一类失误,最难被察觉,因为它不出现在亏损里,而出现在盈利里。",
"那笔纳指科技ETF的操作,我完整地走完了条件单流程。买入触发了,方向是对的,执行是对的,最终是盈利的。",
"但我知道,那次赢得不干净。",
"回补的时候,现金仓不够了。不得不把回补的金额缩减。机会真实地存在,判断也是正确的,但资源的约束让结果打了折扣。账面上是盈利,但那个盈利,比它本可以达到的数字,少了一截。",
"这种损失,不出现在任何账单上。但它是真实的,叫做机会成本。",
"现金仓不足,有三种不同的原因,解法也各不相同。",
"第一种,是子弹打在了优先级更低的目标上。把资金配置给了赔率普通的机会,等赔率极高的机会来临时,弹药已经告罄。这是资本配置的失误,解法是在每次动用资金之前,认真问自己:这是当前所有机会里赔率最高的那一个吗?",
"第二种,是仓位上限设得太满,没有为回补留下空间。解法是在设计伏击计划的时候,把回补资金单独预留,不纳入初始建仓的可用资金池。",
"第三种,是月度子弹的节奏和市场机会的节奏不匹配。这个月的资金还没到账,机会已经来了。解法是提前把未来两个月的子弹存入账户,不依赖当月的现金流。",
"那次教训之后,我在之后的每一套伏击计划里,都明确预留了10%的永久Dry Powder,不挂任何条件单,专门为那些完全预料不到的情景保留。这不是保守,这是对自己认知边界的诚实承认——总有你没有想到的事情会发生,总要留一颗子弹,应对那个时刻。",
"盈利是结果,干净是过程。结果好,不代表过程没有问题。把过程里的问题找出来,是下一次赢得更干净的唯一方式。",
"告诫后来者: 在每一次盈利之后,也要认真复盘。问自己:这次赢得干净吗?如果不干净,原因是什么?好结果会掩盖坏过程,而坏过程,终有一天会在没有好结果的时候,完整地呈现出来。"
]
}
];
let p4ch = 0;
function p4RenderChapter(idx) {
const ch = p4chapters[idx];
if (!ch) return;
p4ch = idx;
const container = document.getElementById('p4chapter-container');
const parasHtml = ch.paras.map((p, pi) => {
const isCaution = p.includes('告诫后来者');
const cls = isCaution ? 'p4-paragraph caution' : 'p4-paragraph';
return '<div class="' + cls + '" data-pi="' + pi + '">' + escHtml(p) + '</div>';
}).join('\n');
container.innerHTML = '<div class="p4-chapter active">'
+ '<div class="p4-ch-marker">' + ch.marker + '</div>'
+ '<div class="p4-ch-title">' + escHtml(ch.title) + '</div>'
+ parasHtml
+ '</div>';
document.getElementById('p4prog').textContent = (idx + 1) + ' / ' + p4chapters.length;
document.getElementById('p4navcenter').textContent = (idx + 1) + ' / ' + p4chapters.length;
document.getElementById('p4prev').disabled = idx === 0;
document.getElementById('p4next').disabled = idx === p4chapters.length - 1;
document.querySelectorAll('.p4-toc-item').forEach((el, i) => {
el.classList.toggle('active', i === idx);
});
// 切换章节时检查语音文件
p4CheckAudio(idx);
container.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function p4Go(d) {
const next = Math.max(0, Math.min(p4chapters.length - 1, p4ch + d));
if (next !== p4ch) p4RenderChapter(next);
}
function p4ToggleToc() {
document.getElementById('p4tocOverlay').classList.toggle('open');
document.getElementById('p4tocDrawer').classList.toggle('open');
}
function p4CloseToc() {
document.getElementById('p4tocOverlay').classList.remove('open');
document.getElementById('p4tocDrawer').classList.remove('open');
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.p4-toc-item').forEach(el => {
el.addEventListener('click', () => {
const idx = parseInt(el.dataset.ch);
p4CloseToc();
p4RenderChapter(idx);
});
});
p4RenderChapter(0);
});
// ── 语音生成与播放 ──
let p4AudioSrc = ''; // 当前章节音频 URL
let p4AudioDur = 0; // 当前章节音频时长(秒)
let p4IsPlaying = false;
let p4Speed = 1.0;
let p4GenRunning = false;
let p4seeking = false;
// 切换章节时检查音频文件是否存在
function p4CheckAudio(chIdx) {
fetch('/api/markets/tts-check?ch=' + chIdx)
.then(r => r.json())
.then(data => {
const playBtn = document.getElementById('p4playBtn');
const stopBtn = document.querySelector('.p4-voice-bar .play-btn[onclick*="Stop"]');
const seek = document.getElementById('p4seekBar');
const speed = document.getElementById('p4speedBtn');
const label = document.getElementById('p4timeLabel');
if (data.exists) {
p4AudioSrc = data.url + '?t=' + Date.now();
p4AudioDur = data.duration || 0;
playBtn.disabled = false;
if (stopBtn) stopBtn.disabled = false;
seek.disabled = false;
speed.disabled = false;
label.textContent = '00:00 / ' + p4FmtTime(p4AudioDur);
seek.value = 0;
// 加载音频
const audio = document.getElementById('p4chapterAudio');
audio.src = p4AudioSrc;
audio.load();
} else {
p4AudioSrc = '';
p4AudioDur = 0;
p4PlayStop(); // 如果有播放则停止
playBtn.disabled = true;
if (stopBtn) stopBtn.disabled = true;
seek.disabled = true;
speed.disabled = true;
label.textContent = '00:00 / 00:00';
seek.value = 0;
}
})
.catch(() => {});
}
function p4FmtTime(s) {
if (!s || s <= 0) return '00:00';
const m = Math.floor(s / 60);
const sec = Math.floor(s % 60);
return String(m).padStart(2, '0') + ':' + String(sec).padStart(2, '0');
}
// 打开生成模态
function p4OpenGenModal() {
if (p4GenRunning) return;
document.getElementById('p4logArea').innerHTML = '';
document.getElementById('p4autoHint').textContent = '';
document.getElementById('p4startGen').disabled = false;
document.getElementById('p4modalOverlay').classList.add('open');
}
// 关闭生成模态
function p4CloseGenModal() {
document.getElementById('p4modalOverlay').classList.remove('open');
}
// 点击遮罩关闭
document.addEventListener('click', function(e) {
if (e.target.id === 'p4modalOverlay') p4CloseGenModal();
});
// 开始生成
function p4StartGenerate() {
if (p4GenRunning) return;
p4GenRunning = true;
const btn = document.getElementById('p4startGen');
btn.disabled = true;
btn.textContent = '生成中...';
const logArea = document.getElementById('p4logArea');
logArea.innerHTML = '';
document.getElementById('p4autoHint').textContent = '';
const voice = document.getElementById('p4voiceSelect').value;
const chIdx = p4ch;
const ch = p4chapters[chIdx];
const meta = (ch ? ch.marker + ' ' + ch.title : '');
function addLog(msg, type) {
const div = document.createElement('div');
div.className = 'log-' + type;
div.textContent = msg;
logArea.appendChild(div);
logArea.scrollTop = logArea.scrollHeight;
}
addLog('[系统] 正在准备请求数据...', 'info');
const text = ch.paras.filter(p => p !== '---').join('\n');
addLog('[系统] 文本长度:' + text.length + ' 字', 'info');
addLog('[系统] 主播声音:' + voice, 'info');
addLog('[系统] 章节:' + meta, 'info');
addLog('[系统] 请求方式:POST JSON(非SSE)', 'info');
addLog('[网络] 正在发送 POST 请求到 /api/markets/tts-generate ...', 'info');
const startTime = Date.now();
fetch('/api/markets/tts-generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text, voice, ch: String(chIdx), meta })
})
.then(res => {
addLog('[网络] 收到响应:HTTP ' + res.status + ' ' + res.statusText, 'info');
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
addLog('[网络] 响应耗时:' + elapsed + 's', 'info');
if (!res.ok) throw new Error('HTTP ' + res.status + ': ' + res.statusText);
return res.json();
})
.then(data => {
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
addLog('[数据] 总耗时:' + elapsed + 's', 'info');
addLog('[数据] ok=' + data.ok + ', logs数=' + (data.logs ? data.logs.length : 0), 'info');
if (data.logs && data.logs.length > 0) {
// 逐条显示日志(带延迟,视觉效果)
let i = 0;
const showNext = () => {
if (i >= data.logs.length) {
// 全部显示完
finish(data);
return;
}
const l = data.logs[i];
addLog(l.msg, l.type === 'error' ? 'error' : l.type === 'success' ? 'success' : 'info');
i++;
// 如果是最后几条或者耗时较长,延迟300ms,否则100ms
const delay = i >= data.logs.length - 2 ? 300 : 100;
setTimeout(showNext, delay);
};
showNext();
} else {
finish(data);
}
})
.catch(err => {
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
addLog('[错误] 请求异常:' + (err.message || err) + '(耗时' + elapsed + 's)', 'error');
addLog('[排查] 1. 检查服务是否运行(端口8976/8977)', 'error');
addLog('[排查] 2. 检查 auth_config.json 认证配置', 'error');
addLog('[排查] 3. 打开浏览器控制台查看网络请求(F12→Network)', 'error');
addLog('[排查] 4. 查看服务端日志 logs/markets.log', 'error');
p4GenRunning = false;
btn.disabled = false;
btn.textContent = '重新生成';
});
function finish(data) {
if (data.ok && data.result) {
addLog('✅ 生成完成!3秒后自动关闭', 'success');
document.getElementById('p4autoHint').textContent = '3秒后自动关闭...';
setTimeout(() => {
p4CloseGenModal();
p4CheckAudio(chIdx);
}, 3000);
} else {
addLog('❌ 生成失败:' + (data.error || '未知错误'), 'error');
}
p4GenRunning = false;
btn.disabled = false;
btn.textContent = '开始生成';
}
}
// ── 播放控制 ──
function p4PlayToggle() {
const audio = document.getElementById('p4chapterAudio');
if (!audio.src) return;
if (audio.paused) {
audio.play().then(() => {
document.getElementById('p4playBtn').textContent = '⏸';
document.getElementById('p4playBtn').classList.add('playing');
}).catch(() => {});
} else {
audio.pause();
document.getElementById('p4playBtn').textContent = '▶';
document.getElementById('p4playBtn').classList.remove('playing');
}
}
function p4PlayStop() {
const audio = document.getElementById('p4chapterAudio');
audio.pause();
audio.currentTime = 0;
document.getElementById('p4playBtn').textContent = '▶';
document.getElementById('p4playBtn').classList.remove('playing');
document.getElementById('p4seekBar').value = 0;
document.getElementById('p4timeLabel').textContent = '00:00 / ' + p4FmtTime(p4AudioDur);
}
function p4Seek(val) {
const audio = document.getElementById('p4chapterAudio');
if (audio.duration) {
const t = (val / 100) * audio.duration;
audio.currentTime = t;
}
}
function p4CycleSpeed() {
const speeds = [1.0, 1.5, 2.0];
let idx = speeds.indexOf(p4Speed);
if (idx < 0 || idx >= speeds.length - 1) idx = 0;
else idx++;
p4Speed = speeds[idx];
document.getElementById('p4speedBtn').textContent = p4Speed.toFixed(1) + 'x';
const audio = document.getElementById('p4chapterAudio');
audio.playbackRate = p4Speed;
}
// 音频事件监听(绑定一次)
document.addEventListener('DOMContentLoaded', function() {
const audio = document.getElementById('p4chapterAudio');
audio.addEventListener('loadedmetadata', function() {
// .mp3 文件加载后获取真实时长,更新显示
if (audio.duration && isFinite(audio.duration)) {
p4AudioDur = audio.duration;
document.getElementById('p4timeLabel').textContent = '00:00 / ' + p4FmtTime(p4AudioDur);
document.getElementById('p4seekBar').max = 100;
}
});
audio.addEventListener('timeupdate', function() {
if (audio.duration && isFinite(audio.duration)) {
const pct = (audio.currentTime / audio.duration) * 100;
document.getElementById('p4seekBar').value = pct;
document.getElementById('p4timeLabel').textContent = p4FmtTime(audio.currentTime) + ' / ' + p4FmtTime(audio.duration);
}
});
audio.addEventListener('ended', function() {
document.getElementById('p4playBtn').textContent = '▶';
document.getElementById('p4playBtn').classList.remove('playing');
});
});
// esc 关闭模态
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') p4CloseGenModal();
});
</script>
</body>
</html>