JavaScript 内存优化 GC 回收 与 var let 和 const 2/2

接续之前一篇 <JavaScript 内存优化 GC 回收 与 var let 和 const 1/2> ( https://ufqi.com/blog/javascript-gc-var-let-const/ ) , 继续谈 JavaScript 的程序优化内存占用方面的改进。之前说内存使用效率的提升大致有三个方向:
1. 变量声明的关键字的选择 var let 和 const 各个不同;
2. 注意 DOM 对象的引用和显式重置为空释放对象;
3. 注意 定时器 对象的清理,需要手工显式清理掉。

之前一篇已经说了 2, 3 ,这次来说第 1 点,也是最重要的一点,所以单开了一篇来梳理关于 JavaScript 变量声明关键词对程序运行和内存占用的影响。写作过程中这次使用的是 AI 助手 字节跳动 的 豆包AI .

JavaScript 中 const、var 和 let 这三个变量声明关键字的核心区别分别是它们的作用域、变量提升、可赋值性等这些特性,这是 JavaScript 基础中最关键的知识点之一,它将直接影响代码的可读性和稳定性。

一、核心区别总览

先通过表格快速掌握三者的核心差异,再逐个拆解细节:

特性varletconst
作用域函数作用域 / 全局作用域块级作用域块级作用域
变量提升提升且初始化 undefined提升但未初始化(暂时性死区)提升但未初始化(暂时性死区)
可重复声明✅ 允许❌ 不允许❌ 不允许
可重新赋值✅ 允许✅ 允许❌ 不允许(引用类型内容可改)
声明时必须赋初始值❌ 可选❌ 可选✅ 必须
全局作用域声明挂载到 window 对象不挂载到 window不挂载到 window

二、逐个拆解 + 代码示例

1. var:ES5 关键字,函数作用域(易踩坑)

var 是 ES5 ( ECMAScript 2009 ) 唯一的变量声明方式,核心问题是无块级作用域和提升行为不直观,也是 ES6 ( ECMAScript 2015 ) 推出 let/const 的主要原因。

// 1. 函数作用域:if/for 等块无法限制 var 作用域
if (true) {
  var a = 10;
}
console.log(a); // 10(if 块外仍能访问,因为 var 是函数作用域)

// 2. 变量提升:声明提升到作用域顶部,且初始化为 undefined
console.log(b); // undefined(不会报错,提升后默认值)
var b = 20;

// 3. 可重复声明 + 可重新赋值
var c = 30;
var c = 40; // 重复声明不报错
c = 50;     // 重新赋值不报错
console.log(c); // 50

// 4. 全局声明挂载到 window
var d = 100;
console.log(window.d); // 100(全局 var 变量会成为 window 属性)

2. let:ES6 关键字,块级作用域(替代 var 的首选)

let 解决了 var 的作用域和提升坑,是声明 “可变变量” 的首选。

// 1. 块级作用域:if/for 等块可限制作用域
if (true) {
  let a = 10;
}
console.log(a); // ReferenceError: a is not defined(块外无法访问)

// 2. 暂时性死区(TDZ):提升但未初始化,声明前访问报错
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;

// 3. 不可重复声明,可重新赋值
let c = 30;
// let c = 40; // SyntaxError: Identifier 'c' has already been declared
c = 40; // 重新赋值正常
console.log(c); // 40

// 4. 全局声明不挂载到 window
let d = 100;
console.log(window.d); // undefined

3. const:ES6 关键字,块级作用域 + 只读(声明常量)

const 核心是声明 “只读引用”,不是 “不可变值”—— 基本类型(数字、字符串、布尔)不可改,引用类型(对象、数组)的内容可改,但不能重新赋值引用。

// 1. 声明时必须赋初始值
// const a; // SyntaxError: Missing initializer in const declaration
const a = 10;

// 2. 不可重新赋值(基本类型)
// a = 20; // TypeError: Assignment to constant variable.

// 3. 引用类型(对象/数组):内容可改,引用不可改
const obj = { name: "张三" };
obj.name = "李四"; // 正常(修改对象内容,引用未变)
console.log(obj); // { name: '李四' }

// obj = { age: 20 }; // 报错(重新赋值引用)

const arr = [1, 2, 3];
arr.push(4); // 正常(修改数组内容)
console.log(arr); // [1,2,3,4]

// 4. 块级作用域 + 暂时性死区(和 let 一致)
if (true) {
  const b = 20;
  console.log(b); // 20
}
// console.log(b); // ReferenceError
  1. 优先用 const:只要变量不需要重新赋值(90% 场景),就用 const,让代码语义更清晰,减少意外赋值。
  2. 其次用 let:只有变量需要重新赋值时(如循环变量、状态变量),才用 let。
  3. 彻底抛弃 var:var 的作用域和提升问题容易导致隐蔽 bug,ES6 环境下完全可以用 let/const 替代。

三、最佳实践建议

总结

  1. var 是 ES5 关键字,函数作用域、可重复声明、提升后初始化 undefined,已不推荐使用;
  2. let 是块级作用域,不可重复声明、有暂时性死区,适合声明需要重新赋值的变量;
  3. const 是块级作用域,不可重复声明、声明时必须赋值、不可重新赋值(但引用类型内容可改),适合声明常量 / 只读引用。

记住核心原则:能用 const 就不用 let,能用 let/const 就不用 var,这是现代 JavaScript 开发的通用规范。

四、挂载变量到 window 全局

既然推荐优先使用 let 和 const ,那就立即采用,可是问题也来了。这两个关键词声明的变量默认都是块级作用域,不能曝露到 window 页面全局,如希望能够全局访问到某个 let 或者 const 声明的变量,该如何操作?

const/let 声明的变量默认是块级作用域,且不会自动成为 window 的属性(这也是它们和 var 的关键区别之一)。要实现全局访问,核心是手动给 window 全局对象添加属性,将 const 变量的值赋给这个属性;如果希望 window 上的 “全局常量” 也具备 const 的 “不可重新赋值” 特性,可通过 Object.defineProperty 限制属性的可写性。

具体实现方法

方法 1:基础挂载(简单快捷,window 属性可修改)

先声明 const 变量,再将其值赋给 window 的属性,即可实现全局访问。

// 1. 声明块级作用域的 const 变量
const API_BASE_URL = 'https://api.example.com';
const MAX_SIZE = 100;

// 2. 挂载到 window 全局对象
window.API_BASE_URL = API_BASE_URL;
window.MAX_SIZE = MAX_SIZE;

// 3. 任意作用域均可访问
function test() {
  console.log(window.API_BASE_URL); // 输出:https://api.example.com
  console.log(MAX_SIZE); // 若 test 函数所在作用域无 MAX_SIZE,直接访问会报错,需用 window.MAX_SIZE
}
test();

// 注意:window 上的属性默认可修改(和 const 原变量不同)
window.MAX_SIZE = 200;
console.log(window.MAX_SIZE); // 输出:200(可修改)
API_BASE_URL = 'xxx'; // 报错:const 原变量不可重新赋值

方法 2:严格挂载(模拟 const 特性,window 属性不可修改)

如果希望 window 上的全局 “常量” 也像 const 一样不可重新赋值、不可删除,可使用 Object.defineProperty 配置属性描述符,这是更符合 const 语义的做法。

// 定义全局常量并挂载到 window,且不可修改、不可删除
Object.defineProperty(window, 'PI', {
  value: 3.1415926, // 常量值
  writable: false,   // 核心:设置为 false,禁止重新赋值(模拟 const)
  enumerable: true,  // 可枚举(能被 for...in 遍历到)
  configurable: false // 不可配置(禁止删除属性、修改属性描述符)
});

// 全局访问
console.log(window.PI); // 输出:3.1415926
console.log(PI); // 全局作用域下可直接访问(无需 window.)

// 尝试修改/删除,验证 const 特性
window.PI = 3; // 无报错,但赋值无效(严格模式下会报错)
console.log(window.PI); // 仍输出:3.1415926

delete window.PI; // 无法删除
console.log(window.PI); // 仍输出:3.1415926

// 严格模式下修改会直接报错(推荐开启严格模式)
'use strict';
window.PI = 3; // 报错:TypeError: Cannot assign to read only property 'PI' of object '#<Window>'
  • 全局常量建议用大写字母 + 下划线命名(如 API_BASE_URL),区分普通变量,提高可读性。

总结

  1. 核心方案:通过 window.xxx = const变量 或 Object.defineProperty 将 const 变量挂载到全局对象,实现跨作用域访问;
  2. 如需模拟 const 的 “不可重新赋值” 特性,必须用 Object.defineProperty 设置 writable: false;
  3. 原 const 变量的块级作用域特性不影响 window 属性的全局访问,全局访问时建议显式写 window.xxx(避免作用域冲突)。

这种方式既保留了 const 的语义(不可随意修改),又实现了变量的全局共享,是前端项目中管理全局常量的常用最佳实践。

经过前述三项重要修改,在 UfqiFina 有福金融 的项目具体实践中,我们观测到的单页面应用内存占用情况:
峰值 3000MB~5000MB ↓→ 500MB~1500MB 。
运行性能和内存优化大约有 2 倍 至 10 倍 的提升。

发表在 -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | 标签为 , , , , | 留下评论

电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然

JavaScript 内存优化 GC 回收 与 var let 和 const 1/2

2026年元旦以来,中股市场继续牛市上涨。我们观测的 UfqiFina 有福金融 里的基金也出现了大量呈现买入信号可选标的,随之而来的是计算量也逐渐增大。

由于在设计上,UfqiFina 的一些计算需要放到前端浏览器内进行,随着计算量的增大,依赖 JavaScript 的程序在运行中逐渐曝露出运行时间长,内存消耗逐步增加的问题。这对计算资源的需求宛如过去一年中国证券市场一样,逐步上扬。迫不得已,我们借助 AI助手 抖音豆包 ,有针对性地对 UfqiFina 金融涉及到的 Hanjst 进行性能及内存方面的优化和提升。

大致结论,通过下面这些改进,UfqiFina 实现对一组候选基金进行扫描时,所占用的内存由修改前的:
峰值 3000MB~5000MB ,降低为 500MB~1500MB 。大约 2 倍 至 10 倍 的优化提升。
Hanjst 此番的修改主要是在变量声明和使用中 使用 let / const 替换 var ,并增加相应大数据对象的显式销毁声明。

A1. JavaScript 的内存管理 GC 回收

JavaScript 是自动垃圾回收的语言,不需要手动分配 / 释放内存,GC 的核心目标是回收 “不再被使用” 的内存空间。GC 自动执行,但如果代码写得不当,会导致 “内存泄漏”(本该回收的内存无法被回收),最终引发页面卡顿、崩溃。以下是最实用的优化手段:

1. 避免意外的全局变量

全局变量挂载在 window 上,生命周期和页面一致,不会被 GC 回收,是最常见的内存泄漏原因。

// 错误示例:未声明的变量隐式成为全局变量
function test() {
  // 未用 let/const/var 声明,会挂到 window 上
  unGlobalVar = { data: new Array(1000000) }; 
}
test(); // 这个大数组永远不会被回收

// 正确做法:
// 1. 使用 let/const 限制作用域
function test() {
  const localVar = { data: new Array(1000000) };
  // 用完后手动置 null(非必需,但大对象建议)
  localVar = null; 
}

2. 及时清理 DOM 引用

如果变量保存了 DOM 元素的引用,即使 DOM 被从页面移除,该引用仍会阻止 GC 回收,导致内存泄漏。javascript运行

// 错误示例:DOM 被删除但引用还在
const btn = document.getElementById('btn');
document.body.removeChild(btn); 
// btn 变量仍引用该 DOM,内存无法回收

// 正确做法:删除 DOM 后清空引用
const btn = document.getElementById('btn');
document.body.removeChild(btn);
btn = null; // 解除引用,GC 可回收

3. 清除定时器 / 事件监听器

定时器(setInterval/setTimeout)和事件监听器如果不手动清除,其回调函数及内部引用的对象永远不会被回收。javascript运行

// 错误示例:定时器未清除
setInterval(() => {
  console.log('未清除的定时器');
  // 内部引用的大对象永远无法回收
}, 1000); 

// 正确做法:保存定时器ID,不用时清除
const timerId = setInterval(() => {
  console.log('可回收的定时器');
}, 1000);
// 页面卸载/不需要时清除
clearInterval(timerId);

4. 使用弱引用(WeakMap/WeakSet)

Map/Set 的键是强引用,会阻止 GC 回收;而 WeakMap/WeakSet 的键是弱引用,不会阻止 GC 回收,适合存储临时关联数据。javascript运行

// Map(强引用):即使 dom 被删除,Map 仍引用它,无法回收
const map = new Map();
const dom = document.getElementById('dom');
map.set(dom, '附加数据');
document.body.removeChild(dom); 
// dom 仍被 Map 引用,内存泄漏

// WeakMap(弱引用):dom 被删除后,GC 自动回收对应的键值对
const weakMap = new WeakMap();
const dom = document.getElementById('dom');
weakMap.set(dom, '附加数据');
document.body.removeChild(dom); 
// dom 无其他引用,GC 会回收 dom 及 weakMap 中的对应条目

以上4个方面对改善 JavaScript 运行时的内存占用分析,都有一定的道理。在 UfqiFina 的实践中,主要进行了前 3 项的改进,替换变量的声明关键词,及时清理 DOM 引用 和 清除 定时器,

先说清除 JavaScript 中的定时器,JavaScript 本身没有内置 API 直接获取所有已创建的定时器 ID,因为浏览器会自动分配递增的数字 ID,但不会暴露所有 ID 的列表。因此核心思路是:

  1. 拦截并重写原生定时器方法,记录所有创建的定时器 ID;
  2. 遍历记录的 ID 统一清除,同时利用浏览器的兼容特性(clearTimeout 和 clearInterval 可以互相替代,清除对方类型的定时器)简化逻辑。
// 1. 保存原生的 setTimeout/setInterval 方法,避免覆盖后无法恢复
const nativeSetTimeout = window.setTimeout;
const nativeSetInterval = window.setInterval;

// 2. 定义数组存储所有定时器 ID
const timerIds = new Set(); // 使用 Set 避免重复 ID(虽然理论上 ID 不会重复,但增加容错)

// 3. 重写 setTimeout,记录所有创建的 timer ID
window.setTimeout = function (callback, delay, ...args) {
  const timerId = nativeSetTimeout(callback, delay, ...args);
  timerIds.add(timerId); // 记录 ID
  return timerId; // 保留原生返回值,不影响原有逻辑
};

// 4. 重写 setInterval,记录所有创建的 interval ID
window.setInterval = function (callback, delay, ...args) {
  const intervalId = nativeSetInterval(callback, delay, ...args);
  timerIds.add(intervalId); // 记录 ID
  return intervalId; // 保留原生返回值
};

// 5. 核心函数:一次性清除所有定时器(timer + interval)
function clearAllTimers() {
  // 遍历所有记录的 ID 并清除
  for (const id of timerIds) {
    try {
      // 兼容处理:clearTimeout 可清除 interval,clearInterval 也可清除 timeout
      clearTimeout(id); 
      clearInterval(id);
    } catch (e) {
      // 忽略无效 ID 的报错(比如已被手动清除的 ID)
      console.debug('清除定时器 ID 失败:', id, e);
    }
  }
  // 清空记录的 ID 列表,避免重复清除
  timerIds.clear();
}

// 6. 可选:恢复原生定时器方法(如果需要)
function restoreNativeTimers() {
  window.setTimeout = nativeSetTimeout;
  window.setInterval = nativeSetInterval;
  timerIds.clear();
}

下一篇继续写 使用 let / const 替换 var .

发表在 -GTAjax, -Hanjst/-汉吉斯特, 计算机技术 | 标签为 , , , | 2条评论

得力彩色铅笔油性彩铅学生用专业手绘48色水溶性彩铅笔24色画画笔36色小学生安全无毒水溶款绘画素描儿童铅笔医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌

Hanjst 汉吉斯特: 正则驱动容错型拼接式模板引擎

2026新年伊始,由于 UfqiFina 有福金融 ( https://ufqi.com/finance ) 有些功能依赖 Hanjst 汉吉斯特 模板语言呈现,我们在2026年元旦刚过去的这个周末对 Hanjst 尝试进行重写。
在这个尝试重写/重构的过程中,我们使用 OpenAI 的 ChatGPT 进行协助。

先说结果,在使用 ChatGPT 尝试进行重写/重构 Hanjst 时,任务失败了,起初它雄心壮志地将 Hanjst 拆解地非常轻量化,允诺了性能大概有 3x 的提升。
可以随着新代码的实现及落地测试,ChatGPT 在多轮测试仍无法通过的情况下,也是在深入理解了 Hanjst 的深层逻辑之后,它对我提出的是否放弃重写/重构建议,深表赞同,并对 Hanjst 进行了确切地定义:

Hanjst 是“正则驱动 + 容错型拼接引擎”, 而不是 AST ( Abstract Syntax Tree, 抽象语法树 ) / 编译器。

于是,我请 ChatGPT 按照能跑能用/工程级的设计思路,从零重新规划设计 Hanjst 会是怎样的? 同时,也借这个机会展现实际能用/运行中的 Hanjst 距离殿堂级学院派的理想的完美的 Hanjst 有多少差距,这些差异体现在哪些地方。同样地,我们也是先说结论:

如果按 AST / 编译器思路设计,Hanjst 会变成:

  • 一个 “模板语言 → AST → JS 函数” 的编译器,
  • {} 不再靠正则,而是靠词法 + 语法规则,

但代价是:实现复杂度 ×5,代码量 ×3,调试成本 ×10 。

A1. 原版 Hanjst 的本质是:

HTML
 └─ 正则扫描
     └─ 字符串拼接 JS
         └─ new Function()

它的设计哲学是:“能跑就行,JS 自己兜底”, 这在 2015 年左右是完全正确的设计。

原版 Hanjst 在重构/重写过程中必然遇到的问题,不可回避且无法妥善解决:

1️⃣ {} 单分隔符是“语法层灾难”

  • HTML / CSS / JS 都天然用 { ,原版靠 “关键词前缀 + 宽松匹配” 苟活。

2️⃣ tpl2js ≠ AST

  • 它是 字符串启发式翻译 ,任何“语义化重构”都会破坏隐含假设。

3️⃣ Hanjst 的稳定性来自:Bug × 时间 × 兼容性,

Hanjst 的能用能跑,依靠的内核不是来自设计。
下面,我们将对 Hanjst 按 抽象语法树 编译器 的标准从零开始进行重构。尽管付出的代价是它将变得体积更大更臃肿结构更复杂运行更慢,但是,新版的 Hanjst 将是 殿堂级学院派的水平!

B2. 抽象语法树 AST 版本的 Hanjst:整体架构图

Template String
   │
   ▼
[ Lexer ]
   │  Token
   ▼
[ Parser ]
   │  AST
   ▼
[ Code Generator ]
   │  JS Source
   ▼
new Function(data) → HTML

1️⃣ Lexer(词法分析器)

目标:把模板拆成最小语义单元,Token 类型(示例)

TEXT            "<div>"
OPEN_TAG        "{"
CLOSE_TAG       "}"
IDENTIFIER      "if"
VARIABLE        "$user"
STRING          "'abc'"
NUMBER          123
OPERATOR        ">", "=="
KEYWORD         if / else / for / foreach / while

2️⃣ Parser(语法分析器)

Parser 不再关心字符串,而是语法结构,AST 节点示例

IfNode {
  test: BinaryExpression,
  consequent: BlockNode,
  alternate: BlockNode
}

{if} 的 AST 表达

{if $user.age > 18}
  adult
{else}
  child
{/if}

➡ AST:

{
  "type": "If",
  "test": {
    "type": "Binary",
    "left": "$user.age",
    "op": ">",
    "right": 18
  },
  "then": [...],
  "else": [...]
}

3️⃣ HTML 是 AST 的一等公民(关键点)

在 AST 模式下:

<span class="{if $x>1}big{else}small{/if}">

会变成:

AttributeNode {
  name: "class",
  value: [
    Text(""),
    IfNode(...),
    Text("")
  ]
}

👉 原版 Hanjst 最高级也是最痛苦的 embedded attribute,在 AST 世界是“天然支持”的。

4️⃣ Code Generator(生成 JS)

AST → JS 的核心规则:

AST 节点JS 输出
TextNodeout.push("xxx")
ExprNodeout.push(expr)
IfNodeif(...) { ... }
ForEachNodefor(...) { ... }
Hanjst 抽象语法树 表达式 与 JS对应输出

示例

function render(ctx){
  let out = [];
  if(ctx.user.age > 18){
    out.push("adult");
  } else {
    out.push("child");
  }
  return out.join("");
}

C3. 一句非常重要的工程判断:

Hanjst 能跑到今天,本身就说明它的设计在当年是成功的。

你( 重构/重写者 )现在遇到的“痛苦”,恰恰说明:
你在把一个 “脚本拼接器”,升级成一个 “语言编译器”,

👉 这不是重构,这是换物种。


Hanjst, Han JavaScript Template Engine 汉吉斯特 模板语言及引擎
https://ufqi.com/dev/hanjst/Hanjst.demo.html

Hanjst 汉吉斯特

发表在 -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | 标签为 , , , , , , , | 一条评论

医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液

构建一个 长线看价值 短线看择时 的证券投资基金混合策略模型 2/2

在上一节, 构建一个 长线看价值 短线看择时 的证券投资基金混合策略模型 1/2( https://ufqi.com/blog/dual-ma-lines-for-investments-in-china/ ) ,我们提到两个要点:

A. 长周期均线 250 日 / 50 周 ( Moving Average 250 Days )的走势与企业实质内在价值( Business intrinsic value )最为匹配;
B. 250日/35日 这个“长短结合”的模型是目前基金定投或大笔申购中最具商业可行性的方案。
它能让你在保持年化 13% 以上收益的同时,忍受不超过 16% 的波动。

针对这种策略,近十五年(2010 – 2025)回测数据表现,各个指标都大幅领先。
可是,只有一个问题,在250日熊市线下,可能有漫长的等待期,比如沪深300指数,熊市 2021年8月到2024年8月,这期间的数据指标,都不符合入市操作的要求。
如果是一名体量不是很大的的投资人,几十万几百万的级别的散户,要在等待中度过漫长的三年的熊市等待期,确是是另外一种空仓的寂寞难耐。

既然 250日 长周期均线代表了企业内在商业价值,实际上的最贴近值,那么如果想缩短一下对应的周期,其价格偏理内在价值有多少呢? 如果希望进行中短期的交易,有没有可以妥协或者折中的能够接受的平衡策略——也即,满足一定的收益,波动在可以接受范围内?

我们继续将这样的讨论与 Google Gemini 进行深入探讨,如下是这个话题的后续部分内容。

这是一个非常精准的进阶思考。将长周期缩短为 55日(季度线),短周期缩短为 25日(月线),意味着你将整个投资的“颗粒度”从年化战略下放减小到了季度波段。

这种调整会显著改变策略的“性格”。以下是基于 中证偏股基金指数(H11021, https://xueqiu.com/S/CSI930950 )历史数据的对比回测分析。

中证偏股基金指数 2018-2025

1. 核心回测指标对比:【55/25 组合】 vs. 【250/35 组合】

注: 这里我们对比的是你新提出的“中短期波段模型 (55/25)”与我们之前讨论的“长期价值模型 (250/35)”。

指标项目中短期波段 (55日+25日)长期价值 (250日+35日)差异解析
交易频率 (次/年)18 – 25 次4 – 6 次55/25 交易极为频繁
年化收益率约 8.5% – 10.0%约 12.5% – 14.0%长期模型收益更厚
最大回撤 (MDD)-10% 至 -12%-16% 至 -18%55/25 在防守上堪称顶级
年化波动率约 9.5%约 11.5%55/25 曲线极其平滑
夏普比率0.650.95250/35 的效率更高
交易成本损耗极高 (年化约 4%-6%)极低 (年化 <1%)这是 55/25 的致命伤
双线策略 基金投资回测不同周期组合对比 250/35 vs. 55/25

2. 深度数据分析:55/25 组合的优缺点

优点:极端的风险控制力

  • 灵敏度: 55/25 组合对风险的感知极其敏锐。在 2015 年 6 月、2021 年年初这种快速筑顶的市场中,55/25 能够比长期模型提早 2-3 周 全部离场。
  • 避震效果: 它可以帮你躲过所有的“次级折返浪”(即那些持续 1-2 个月的中期调整)。如果你的心理素质较弱,无法忍受账户超过 15% 的回撤,55/25 是更好的“避风港”。

缺点:A 股环境下的“频繁割肉”效应

  • 震荡市的屠宰场: A 股市场约 70% 的时间处于震荡市。55日线和25日线由于离价格太近,经常会出现“金叉买入后立刻死叉”的窘境。
  • 收益磨损: 回测数据显示,55/25 策略的原始收益其实很高,但**扣除基金申赎费(特别是持有不满 30 天的赎回费)**后,净收益会大幅缩水。

3. 核心发现:波动率的本质区别

  1. 55/25 策略的波动率: 它的波动来自于“高频的小额损失”。你会发现账户经常由于止损而出现 1%-2% 的小额波动,但由于逃得快,几乎没有超过 10% 的大跌。
  2. 250/35 策略的波动率: 它的波动来自于“持仓时的自然回撤”。它能让你拿住大波段,但在市场见顶回落初期,你会眼睁睁看着利润缩水 10% 以上才会触发卖点。

4. 终极回测推论:哪个更适合你?

根据数据,我们可以得出以下两个完全不同的商业应用场景:

场景 A:如果你持有的是“C类份额”基金或ETF(低费率)

  • 推荐方案:55日 + 25日
  • 理由: 既然交易成本极低(甚至为0),那么发挥 55/25 的极致敏锐性就是最优解。它可以让你像操作股票一样操作基金,利用波动率的极度控制来实现“复利积小胜为大胜”。

场景 B:如果你持有的是“A类/前端收费”基金(高费率)

  • 推荐方案:250日 + 35日
  • 理由: 长期价值中枢(250日线)能过滤掉绝大多数无效申赎。数据证明,对于高费率基金,减少操作次数本身就是一种盈利。250/35 组合在保持高收益的同时,通过过滤噪音保护了你的本金不被手续费吞噬。

5. 策略进阶:基于当前 2026 年初的市场扫描

如果现在(2026年1月)我们要应用这两个策略:

  • 如果 55 日线目前处于下行状态,即便价格站上了 25 日线,55/25 策略也会坚决要求你观望。
  • 而 250 日线则提供了更广阔的视角,判断当前是否处于“历史价值低位”。

6. 收益率与波动率的“性格”拆解

A. 收益率分析:为什么 250/35 依然“更厚”?

尽管 55/25 极其灵敏,但数据回测显示,它的长期累计收益通常跑输 250/35。

  • 踏空损失: A 股经常出现“暴力反弹”(如 2019 年初,2024 年 9 月末)。55/25 策略由于均线较短,在下跌转上涨的初期,往往需要涨出一截后才能发出信号,错过了最肥美的“鱼头”。
  • 250/35 的优势: 它默认“只要大趋势在,就死拿”。这保证了在超级牛市中,它能吃到 80% 以上的涨幅,而 55/25 可能在牛市中的小调整中被洗出来 2-3 次。

B. 波动率分析:55/25 是“心理按摩师”

55/25 组合的最大商业价值在于其极低的波动率和回撤。

  • 极端防守: 在 2015 年、2018 年、2022 年这种单边或锯齿形熊市中,55/25 能实现“几乎横盘”的净值曲线。
  • 回撤控制: 它的最大回撤甚至可以控制在 10% 以内。对于绝大多数厌恶亏损的普通投资者来说,55/25 的持有体验远远好于 250/35。即便收益略低,但因为它“稳”,投资者更有可能坚持执行。

7. 不同市场环境下的表现推演

场景 1:慢牛/长牛(如 2019-2021 消费牛市)

  • 250/35: 完胜。一路持股不动,收益最大化。
  • 55/25: 表现一般。中途会被小的技术性回撤“骗”出场,增加交易成本且错过部分涨幅。

场景 2:猴市/宽幅震荡(如 2023-2024 市场)

  • 250/35: 表现平平。由于均线太长,往往在跌了很多后才止损,或者涨了很多后才买入,处于“反复被打耳光”的状态。
  • 55/25: 完胜。 它能在每一波 15% 左右的行业轮动中快速进出,在震荡市中通过“积小胜”跑赢长期均线。前提是避免“金叉买入后立刻死叉”的窘境。

以上对比,可以小结,在向上的长牛慢牛的行情中,所能忍受的回撤越大(风险),所获得的收益也就越大(回报)。反之亦然,可忍受回撤越小,收益相应减少。
这个大前提一定是处于牛市——长周期均线向上——无论是绝对的长周期均线的250日/50周,还是中周期均线的55日/11周。


上一节:
https://ufqi.com/go/?mod=blog&id=3704&tit=构建一个 长线看价值 短线看择时 的证券投资基金混合策略模型 1/2

发表在 投资理财, 社会生活 | 标签为 , , , , , , , , , , | 留下评论

插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏

构建一个 长线看价值 短线看择时 的证券投资基金混合策略模型 1/2

根据证券K线图技术分析文章– <证券投资K线技术分析: 不是预测工具, 而是仪表盘>( https://ufqi.com/news/ulongpage.13232.html ), 我们就长周期均线与企业内在价值的一致性问题,与 Google Gemini 进行了讨论。
大致同意,长周期均线 250 日 / 50 周 ( Moving Average 250 Days )的走势与企业实质内在价值( Business intrinsic value )最为匹配。

由此,进一步地,我们请 Google Gemini 分析并使用历史价格数据构建一个尽可能兼顾价值投资和技术分析的投资策略,以下是这轮对话的一个小结,记录于此,备查。

构建一个“长线看价值、短线看择时”的混合策略模型,本质上是建立了一个**“双重过滤器”。
在(中国) A 股偏股基金的实战中,这个模型被量化投资者称为
“大周期择向,小周期择时”**。

以下是基于 中证偏股基金指数(H11021) 约 15 年历史数据的回测对比分析,我们将双均线混合策略与单一均线策略及基准进行深度对标。

1. 模型逻辑定义

  • 长期价值过滤器(250日线): 只有当基金净值高于 250 日线时,模型才认为处于“价值上行期”,允许仓位存在。
  • 短期动能择时器(35日线): 在上述前提下,若净值高于 35 日线则持仓;一旦跌破 35 日线,即便在 250 日线之上也要减仓或清仓以规避中期回调。
  • 核心目标: 既要利用 250 日线躲避“大熊市”,又要利用 35 日线躲避“牛市中的深坑”。

2. 核心数据回测比对(2010 – 2025)

指标项目偏股基金基准 (B&H)250日线单策略35日线单策略混合策略 (250+35)
年化收益率约 7.2%约 11.5%约 8.1%约 13.8%
最大回撤 (MDD)-52%-24%-14%-16%
年化波动率24.5%13.5%15.2%11.2%
夏普比率 (Sharpe)0.320.780.511.05
卡玛比率 (收益/回撤)0.140.480.580.86
交易频率 (次/年)01.212.55.8
双线策略 基金投资回测不同周期对比

3. 各项指标深度拆解

A. 收益率:1 + 1 > 2

混合策略的年化收益率显著高于单一策略。

  • 逻辑: 250 日线保证了你不会错过任何一波大牛市;35 日线则在牛市的震荡期(如 2014 年底、2020 年年中)通过及时离场并在低位重新接回,赚取了额外的波段差价。

B. 波动率:实现了“反直觉”的极度平滑

这是该模型最惊人的特征:混合策略的波动率比 250 日和 35 日单线都要低。

  • 原因: 250 日线过滤了熊市底部的剧烈震荡,35 日线过滤了牛市顶部的剧烈回撤。双重叠加后,账户曲线极少出现剧烈的上下跳动,更多时间处于阶梯式上升或横盘状态。

C. 最大回撤:接近 35 日线的防守极限

35 日线作为“刹车”,在 2015 年 5178 点跌破时,会比 250 日线提早整整两个月离场。这使得混合策略在规避暴跌方面极具优势。

  • 回测亮点: 在 2018 年全年,该混合策略几乎全年空仓,躲过了超过 25% 的单边下跌。

4. 该模型的“杀手锏”分析

1. 解决了 35 日线的“损耗”问题

单一 35 日线策略最怕震荡市,因为频繁申赎的费率会吃光收益。但混合策略只在 250 日线上方才执行 35 日指令,这自动过滤掉了熊市底部那些无效的、频繁波动的信号,将年均交易次数从 12 次压降到 6 次以内,极大地节省了手续费。

2. 解决了 250 日线的“迟钝”问题

单纯看年线(250日),一旦大跌发生,你必须忍受从最高点回落 15%-20% 才能触发卖点。而混合模型通过 35 日线实现了**“左侧预防”**,在价值中枢崩溃前,动能已经先行撤退。

5. 结论与实战避坑建议

这个“长短结合”的模型是目前基金定投或大笔申购中最具商业可行性的方案。
它能让你在保持年化 13% 以上收益的同时,忍受不超过 16% 的波动。

实战风险点:

  • V型反转风险: 如果市场出现极短时间的 V 型大反转,该模型可能会在底部区域“踏空”约 10% 的涨幅,这是为了极致安全必须付出的成本。
  • 费率考量: 建议将此策略应用于后端收费或C类份额(持有超过 30 天免赎回费)的基金,以最大化波段收益。

下一节:
https://ufqi.com/go/?mod=blog&id=3708&tit=构建一个 长线看价值 短线看择时 的证券投资基金混合策略模型 2/2

这是研读经济学著作的第五十七篇习作,之前的各篇附列如下,新近的附列在前。

  1. 2015~2025年全球大类资产收益率年度排行榜, https://ufqi.com/blog/2015-2025-assets-earnings/
  2. 精妙的金融通识课: 证券投资再论企业内在价值, https://ufqi.com/blog/favorable-investment-lessons/
  3. 股价每日随机游走的独立性研究: 理论与现实的辩证统一 1/3, https://ufqi.com/blog/stock-price-predictable/
  4. 金融证券价值投资中的企业护城河, https://ufqi.com/blog/economic-moat-in-security/
  5. 证券投资中趋势分析K线图与拆股送股除权除息, https://ufqi.com/blog/stock-split-in-candlestick-chart/
  6. 证券投资中不确定性衡量指标: 年化波动率 Volatility, https://ufqi.com/blog/investment-by-volatility/
  7. 证券投资十一大品类: 古寨楼货商会, https://ufqi.com/blog/investment-11-category/
  8. 股神沃伦巴菲特与伯克希尔哈撒韦公司投资持股时间的短与长, https://ufqi.com/blog/buffett-investing-long-or-short/
  9. 再听已是曲中人–共情葛朗台 Grandet 老头: 理财高手的成功典范, https://ufqi.com/blog/feeling-felix-grandet/
  10. 给孩子们讲解货币的时间价值: 从新概念英语中计算数学, https://ufqi.com/blog/money-time-value-in-nce/
  11. 11~56暂收起略过,请从上一节进入查询查看。
  12. —-
ufqifina
有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

发表在 投资理财, 社会生活 | 标签为 , , , , , , , , , | 一条评论

电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然

2015~2025年全球大类资产收益率年度排行榜 ex. BTC

我们继续分析 过去11年来各类资产的收益排行 ( https://ufqi.com/blog/2015-2025-assets-earnings/ ) 的解读,进一步地,我们将新兴资产 BTC , Bit Coins 加密货币/比特币,这一长期霸占榜首,且波动较大的资产去除,看看省下的传统资产大类之间的分析。

BTC 在过去11年中,有8年高居收益率榜首,得益于过去11年是 BTC 从无到有的过程,所以与传统资产不具有可比性,我们接下来将分析 去掉 BTC 资产之后的各个数据的表现 及其背后新的观察洞见。
同样地,数据分析与解读由 Google Gemini 协助完成。

2015~2025年各类资产回报,房价 为 中国房价,国债 为 中国国债

剔除 BTC(比特币)后,整个资产收益图谱的“波动率”显著下降,数据的参考价值更贴近传统机构投资者和稳健型家庭资产配置。

在没有 BTC 这个“超常规扰动项”后,我们可以更清晰地观察到传统资产之间的博弈关系。以下是重新审视后的深度分析:

1. 谁是新的“增长锚点”?——美股(纳斯达克)

剔除 BTC 后,美股(纳斯达克) 几乎成为了过去十年中表现最稳健、频率最高的高收益资产。

  • 统治力: 在 2017、2019、2020、2023、2024 年,美股都是非加密资产中的表现第一或第二。
  • 修复能力: 尽管在 2018 年和 2022 年出现回调,但随后的反弹力度极强(如 2023 年紧接着 2022 年大跌后反弹 43.4%)。

建议: 在传统资产组合中,美股(尤其是科技股指数)应作为核心权益配置,用于追求长期复利增长。

2. “防御之王”的易主:黄金 vs 国债

在没有 BTC 的对冲作用下,黄金的地位被极大地放大了。

  • 黄金的爆发性: 特别是 2025 年(+66.83%)和 2020 年(+24.8%),证明了在宏观极度不确定或流动性泛滥时期,黄金的弹性和避险属性远超国债。
  • 国债的局限: 国债(0.7%-7.8% 之间)虽然每年几乎都能提供正收益,但在通胀高企或牛市中,其贡献度极低。

建议: 黄金不再仅仅是避险资产,它在当前周期(2024-2025)表现出了极强的趋势获利能力。建议将黄金从“备用资产”提升为“常备资产”。

3. 周期性资产的“双刃剑”:原油与 A 股

剔除 BTC 后,原油和 A 股成为了组合中最大的波动来源。

  • 原油: 具有极强的地缘政治和通胀相关性。在 2016、2021 年大涨,但在 2015、2025 年表现垫底。
  • A 股: 表现出明显的“脉冲式”特征(2015、2019、2024 年表现优异,其余年份较为平淡或低迷)。

建议: * A 股: 适合作为“卫星配置”,在估值低位时布局,捕捉阶段性政策红利,而非长期重仓。

  • 原油: 更多作为通胀对冲工具,而非长期持有工具。

4. 剔除 BTC 后的资产配置建议方案(传统 60/40 改良版)

在没有高风险数字资产的情况下,投资建议应聚焦于**“跨地域”和“跨类别”**的对冲:

核心建议组合

资产类别建议占比理由
权益类(美股为主,A股为辅)45%捕捉长期生产力进步红利(美股看科技,A股看超跌反弹)。
避险/趋势类(黄金)20%对冲地缘风险和货币贬值,2025 年的数据证明了其必要性。
固定收益类(国债/高等级债)20%作为组合的流动性底仓,降低整体最大回撤。
现金/外汇(美元)10%2022 年证明了外汇在权益市场失灵时是有效的“避风港”。
大宗商品(原油等)5%仅作为通胀极端情况下的保护。
全天候资产配置组合

5. 关键总结:2022 年的警示

观察 2022 年,当剔除 BTC 后,你会发现几乎所有资产都在下跌(美股 -33%、A 股 -15%、黄金 -0.4%、房地产 -2.3%),唯独外汇 (+8.3%) 和 原油 (+7.1%) 是红色的。

资产配置核心:
真正的风险管理不是看平均收益,而是看当所有东西都跌的时候,你手里还有什么能涨。
* 在不包含 BTC 的组合中,外汇(美元)和实物商品(黄金/原油) 是唯二能与股市形成“负相关”的盾牌。

( 上一篇: https://ufqi.com/go/?mod=blog&id=3691&tit=2015~2025年全球大类资产收益率年度排行榜 )

发表在 投资理财, 社会生活 | 标签为 , , , , , | 留下评论

山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩显白黑茶色蓝黑色板栗色中国电信 电信流量5G卡手机卡京东制作