@37 不要用数量的分散去掩盖认知的贫乏,那只会引入新的未知;不要用资产的低相关去追求平滑的曲线,那只会让平庸抵消卓越。 2026.3.10

@36 投资(交易)是关于数学和哲学的研究。
数学计算风险回报比,哲学搭建投资框架,最终,交易的是你自己的认知。 - 2025.12.1

@35 跌势看压力,涨势看支撑。 - 2025.11.20

@34 定义问题,是一切讨论的基础。没有定义就讨论问题,各说各话没有意义。 - 2025.10.13

@33 投资,是在不确定中寻找确定。交易,是在随机中寻找非随机。- 2025.8.21

@32 你眼中的你不是你,别人眼中的你也不是你,你眼中的别人才是你。- 2025.6.2

@31 金融的核心,是在价值的时间之旅中权衡风险与回报。 @16 - 2025.4.27

@30 知识的目的是行动,而不是知识本身。 - 2025.4.18

@29 笔记的方法:在同一个地方,用一致的标准(consistant style)和完整的句子,记录你的洞见。 - 2025.3.21

@28 重要的不在于你对还是错,而是你对的时候,赚多少;你错的时候,亏多少。 - 2025.3.11

@27 先投资,然后再进行调查研究。– 索罗斯 - 2025.3.4

@26 行为修正是交易最重要的概念。 - 2025.2.12

@25 没有什么独立开发,一人公司才是真实的情况。 - 2025.2.10

@24 写作不是思考的记录,写作就是思考本身。 by 理查德·费曼 - 2025.1.13

@23 判断力:预估个人行为长期后果的能力。 - 2024.12.26

@22 能力圈:只玩自己有优势的游戏。 - 2024.12.12

@21 阅读 (学习) 是终极的元技能,可以用来交换其他任何东西。- 2024.11.28

@20 科学能做出正确的预测,并且可被证伪。- 2024.11.21

@19 不要欺骗自己,你自己才是最容易被欺骗的人。 by 理查德·费曼 - 2024.11.19

@18 悠闲的头脑产生伟大的创意,一定要为思考留出时间。 - 2024.11.14

@17 要建立系统,而不是设置目标。 - 史考特・亚当斯 - 2024.11.12

@16 金融的本质是跨时间的价值交换。 - 2024.10.25

@15 最简单的饮食原则:食物加工程序越深,就应该越少摄入。 by 纳瓦尔 - 2024.10.24

@14 冥想是 思想意识的 间歇性禁食。 by 纳瓦尔 - 2024.10.24

@13 逻辑与思辨能力将成为个人最核心的能力。 - 2024.09.18

@12 赚钱的第一法则:创造价值,并通过交换价值获得回报。 - 2024.09.03

@11 所有诡异问题的背后,都有一个合理的解释。 - 2024.08.22

@10 悟道有两种方式:增加该有的知识,或者去掉不必要的知识。 - 2024.08.01

@9 阅读有三个档次:为了娱乐而读,为了信息而读和为了理解而读。 - 2024.07.30

@8 如果你不能简单地解释,那你理解得还不够透彻。by Albert Einstein - 2024.07.08

@7 做了一半的事没有价值,把事做完。- 2024.07.05

@6 人类是习惯的机器,想要过上不平凡的生活,最简单的方法是养成不平凡的习惯。- 2024.07.04

@5 思维需要发散,领域需要聚焦。- 2024.06.26

@4 并不是每本书都值得读完,最稀缺的是我们的时间和注意力。- 2024.06.26

@3 笔记的数量越多,笔记内容的可发现性越低。- 2024.06.25

@2 工具不是那么重要,底层方法论才是真正重要的东西。- 2024.06.19

@1 我感觉《运气与努力》这篇博客是 2024 年看过的最好的几篇之一,在终生学习,成功与运气等多方面产生了共鸣,我们面对的是一个复杂的世界,能够把握的东西只是极少数。 读《努力与运气》有感 - 2024.06.17

` const blob = new Blob([htmlSource], { type: 'text/html;charset=utf-8' }) const url = URL.createObjectURL(blob) window.open(url, '_blank', 'noopener') setTimeout(() => URL.revokeObjectURL(url), 30000) } const attachMermaidViewerButton = wrap => { let btn = wrap.querySelector('.mermaid-open-btn') if (!btn) { btn = document.createElement('button') btn.type = 'button' btn.className = 'mermaid-open-btn' wrap.appendChild(btn) } btn.innerHTML = '' if (!btn.__mermaidViewerBound) { btn.addEventListener('click', e => { e.preventDefault() e.stopPropagation() const svg = wrap.__mermaidOriginalSvg || wrap.querySelector('svg') if (!svg) return const initViewBox = wrap.__mermaidInitViewBox if (typeof svg === 'string') { openSvgInNewTab({ source: svg, initViewBox }) return } openSvgInNewTab({ source: svg, initViewBox }) }) btn.__mermaidViewerBound = true } } // Zoom around a point (px, py) in the SVG viewport (in viewBox coordinates) const zoomAtPoint = (vb, factor, px, py) => { const w = vb[2] * factor const h = vb[3] * factor const nx = px - (px - vb[0]) * factor const ny = py - (py - vb[1]) * factor return [nx, ny, w, h] } const initMermaidGestures = wrap => { const svg = wrap.querySelector('svg') if (!svg) return // Ensure viewBox exists so gestures always work const initVb = getSvgViewBox(svg) wrap.__mermaidInitViewBox = initVb wrap.__mermaidCurViewBox = initVb.slice() setSvgViewBox(svg, initVb) // Avoid binding multiple times on themeChange/pjax if (wrap.__mermaidGestureBound) return wrap.__mermaidGestureBound = true // Helper: map client (viewport) coordinate -> viewBox coordinate const clientToViewBox = (clientX, clientY) => { const rect = svg.getBoundingClientRect() const vb = wrap.__mermaidCurViewBox || getSvgViewBox(svg) const x = vb[0] + (clientX - rect.left) * (vb[2] / rect.width) const y = vb[1] + (clientY - rect.top) * (vb[3] / rect.height) return { x, y, rect, vb } } const state = { pointers: new Map(), startVb: null, startDist: 0, startCenter: null } const clampVb = vb => { const init = wrap.__mermaidInitViewBox || vb const minW = init[2] * 0.1 const maxW = init[2] * 10 const minH = init[3] * 0.1 const maxH = init[3] * 10 vb[2] = clamp(vb[2], minW, maxW) vb[3] = clamp(vb[3], minH, maxH) return vb } const setCurVb = vb => { vb = clampVb(vb) wrap.__mermaidCurViewBox = vb setSvgViewBox(svg, vb) } const onPointerDown = e => { // Allow only primary button for mouse if (e.pointerType === 'mouse' && e.button !== 0) return svg.setPointerCapture(e.pointerId) state.pointers.set(e.pointerId, { x: e.clientX, y: e.clientY }) if (state.pointers.size === 1) { state.startVb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice() } else if (state.pointers.size === 2) { const pts = [...state.pointers.values()] const dx = pts[0].x - pts[1].x const dy = pts[0].y - pts[1].y state.startDist = Math.hypot(dx, dy) state.startVb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice() state.startCenter = { x: (pts[0].x + pts[1].x) / 2, y: (pts[0].y + pts[1].y) / 2 } } } const onPointerMove = e => { if (!state.pointers.has(e.pointerId)) return state.pointers.set(e.pointerId, { x: e.clientX, y: e.clientY }) // Pan with 1 pointer if (state.pointers.size === 1 && state.startVb) { const p = [...state.pointers.values()][0] const prev = { x: e.clientX - e.movementX, y: e.clientY - e.movementY } // movementX/Y unreliable on touch, compute from stored last position const last = wrap.__mermaidLastSinglePointer || p const dxClient = p.x - last.x const dyClient = p.y - last.y wrap.__mermaidLastSinglePointer = p const { rect } = clientToViewBox(p.x, p.y) const vb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice() const dx = dxClient * (vb[2] / rect.width) const dy = dyClient * (vb[3] / rect.height) setCurVb([vb[0] - dx, vb[1] - dy, vb[2], vb[3]]) return } // Pinch zoom with 2 pointers if (state.pointers.size === 2 && state.startVb && state.startDist > 0) { const pts = [...state.pointers.values()] const dx = pts[0].x - pts[1].x const dy = pts[0].y - pts[1].y const dist = Math.hypot(dx, dy) if (!dist) return const factor = state.startDist / dist // dist bigger => zoom in (viewBox smaller) const cx = (pts[0].x + pts[1].x) / 2 const cy = (pts[0].y + pts[1].y) / 2 const centerClient = { x: cx, y: cy } const pxy = clientToViewBox(centerClient.x, centerClient.y) const cpx = pxy.x const cpy = pxy.y const vb = zoomAtPoint(state.startVb, factor, cpx, cpy) setCurVb(vb) } } const onPointerUpOrCancel = e => { state.pointers.delete(e.pointerId) if (state.pointers.size === 0) { state.startVb = null state.startDist = 0 state.startCenter = null wrap.__mermaidLastSinglePointer = null } else if (state.pointers.size === 1) { // reset single pointer baseline to avoid jump wrap.__mermaidLastSinglePointer = [...state.pointers.values()][0] } } // Wheel zoom (mouse/trackpad) const onWheel = e => { // ctrlKey on mac trackpad pinch; we treat both as zoom e.preventDefault() const delta = e.deltaY const zoomFactor = delta > 0 ? 1.1 : 0.9 const { x, y } = clientToViewBox(e.clientX, e.clientY) const vb = (wrap.__mermaidCurViewBox || getSvgViewBox(svg)).slice() setCurVb(zoomAtPoint(vb, zoomFactor, x, y)) } const onDblClick = () => { const init = wrap.__mermaidInitViewBox if (!init) return wrap.__mermaidCurViewBox = init.slice() setSvgViewBox(svg, init) } svg.addEventListener('pointerdown', onPointerDown) svg.addEventListener('pointermove', onPointerMove) svg.addEventListener('pointerup', onPointerUpOrCancel) svg.addEventListener('pointercancel', onPointerUpOrCancel) svg.addEventListener('wheel', onWheel, { passive: false }) svg.addEventListener('dblclick', onDblClick) } const runMermaid = ele => { window.loadMermaid = true const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'default' ele.forEach((item, index) => { const mermaidSrc = item.firstElementChild // Clear old render (themeChange/pjax will rerun) const oldSvg = item.querySelector('svg') if (oldSvg) oldSvg.remove() item.__mermaidGestureBound = false const config = mermaidSrc.dataset.config ? JSON.parse(mermaidSrc.dataset.config) : {} if (!config.theme) { config.theme = theme } const mermaidThemeConfig = `%%{init: ${JSON.stringify(config)}}%%\n` const mermaidID = `mermaid-${index}` const mermaidDefinition = mermaidThemeConfig + mermaidSrc.textContent const renderFn = mermaid.render(mermaidID, mermaidDefinition) const renderMermaid = svg => { mermaidSrc.insertAdjacentHTML('afterend', svg) if (true) initMermaidGestures(item) item.__mermaidOriginalSvg = svg if (true) attachMermaidViewerButton(item) } // mermaid v9 and v10 compatibility typeof renderFn === 'string' ? renderMermaid(renderFn) : renderFn.then(({ svg }) => renderMermaid(svg)) }) } const codeToMermaid = () => { const codeMermaidEle = document.querySelectorAll('pre > code.mermaid') if (codeMermaidEle.length === 0) return codeMermaidEle.forEach(ele => { const preEle = document.createElement('pre') preEle.className = 'mermaid-src' preEle.hidden = true preEle.textContent = ele.textContent const newEle = document.createElement('div') newEle.className = 'mermaid-wrap' newEle.appendChild(preEle) ele.parentNode.replaceWith(newEle) }) } const loadMermaid = () => { if (false) codeToMermaid() const $mermaid = document.querySelectorAll('#article-container .mermaid-wrap') if ($mermaid.length === 0) return const runMermaidFn = () => runMermaid($mermaid) btf.addGlobalFn('themeChange', runMermaidFn, 'mermaid') window.loadMermaid ? runMermaidFn() : btf.getScript('https://cdn.jsdelivr.net/npm/[email protected]/dist/mermaid.min.js').then(runMermaidFn) } btf.addGlobalFn('encrypt', loadMermaid, 'mermaid') window.pjax ? loadMermaid() : document.addEventListener('DOMContentLoaded', loadMermaid) })()