<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>我的小米粥分你一半</title>
  
  
  <link href="https://corvo.myseu.cn/atom.xml" rel="self"/>
  
  <link href="https://corvo.myseu.cn/"/>
  <updated>2026-08-22T01:24:19.480Z</updated>
  <id>https://corvo.myseu.cn/</id>
  
  <author>
    <name>corvofeng</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>波动率与长期收益</title>
    <link href="https://corvo.myseu.cn/2026/08/08/2026-08-08-%E6%B3%A2%E5%8A%A8%E7%8E%87%E4%B8%8E%E9%95%BF%E6%9C%9F%E6%94%B6%E7%9B%8A/"/>
    <id>https://corvo.myseu.cn/2026/08/08/2026-08-08-%E6%B3%A2%E5%8A%A8%E7%8E%87%E4%B8%8E%E9%95%BF%E6%9C%9F%E6%94%B6%E7%9B%8A/</id>
    <published>2026-08-08T00:00:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>谈到长期投资时，我们经常看到一条从左下角平滑地延伸到右上角的复利曲线。</p><p>先看看下面这个模拟器：它会在进入页面时自动画出一条资金路径，你也可以拖动参数或反复生成新的随机路径。</p><span id="more"></span><style>  #compound-volatility-simulator {    --cvs-foreground: #172033;    --cvs-muted: #667085;    --cvs-border: #dfe3ea;    --cvs-blue: #2563eb;    box-sizing: border-box;    width: 100%;    margin: 1.5rem 0;    padding: 20px;    border: 1px solid var(--cvs-border);    border-radius: 16px;    background: #fff;    color: var(--cvs-foreground);    box-shadow: 0 10px 30px rgba(23, 32, 51, .07);  }  #compound-volatility-simulator * { box-sizing: border-box; }  #compound-volatility-simulator .cvs-controls {    display: grid;    grid-template-columns: 1fr 1fr auto auto;    gap: 14px;    align-items: end;    padding: 14px;    border: 1px solid var(--cvs-border);    border-radius: 12px;    background: #f8fafc;  }  #compound-volatility-simulator .cvs-label {    display: grid;    gap: 7px;    margin: 0;    color: var(--cvs-foreground);    font-size: 14px;    font-weight: 650;  }  #compound-volatility-simulator .cvs-range { width: 100%; accent-color: var(--cvs-blue); }  #compound-volatility-simulator .cvs-button {    min-height: 44px;    padding: 9px 13px;    border: 1px solid var(--cvs-border);    border-radius: 9px;    background: #fff;    color: var(--cvs-foreground);    cursor: pointer;    font: inherit;    white-space: nowrap;  }  #compound-volatility-simulator .cvs-button:hover { background: #eff4fb; }  #compound-volatility-simulator .cvs-button-primary { border-color: var(--cvs-blue); background: var(--cvs-blue); color: #fff; }  #compound-volatility-simulator .cvs-button-primary:hover { background: #1d4ed8; }  #compound-volatility-simulator .cvs-button:focus-visible,  #compound-volatility-simulator .cvs-range:focus-visible { outline: 3px solid rgba(37, 99, 235, .28); outline-offset: 3px; }  #compound-volatility-simulator .cvs-chart-wrap { position: relative; width: 100%; margin-top: 10px; }  #compound-volatility-simulator .cvs-chart { display: block; width: 100%; height: auto; overflow: visible; }  #compound-volatility-simulator .cvs-small { color: var(--cvs-muted); font-size: 13px; }  #compound-volatility-simulator .cvs-tooltip {    position: absolute;    z-index: 2;    display: none;    max-width: min(320px, 90%);    padding: 7px 9px;    border: 1px solid var(--cvs-border);    border-radius: 8px;    background: rgba(255, 255, 255, .97);    box-shadow: 0 5px 18px rgba(23, 32, 51, .13);    color: var(--cvs-foreground);    font-size: 12px;    line-height: 1.5;    pointer-events: none;  }  #compound-volatility-simulator .cvs-legend { display: flex; flex-wrap: wrap; gap: 8px 16px; align-items: center; margin-top: 8px; }  #compound-volatility-simulator .cvs-legend-item { display: inline-flex; align-items: center; gap: 7px; }  #compound-volatility-simulator .cvs-line { width: 24px; height: 0; border-top: 3px solid var(--cvs-blue); }  #compound-volatility-simulator .cvs-line-expected { border-top: 2px dashed var(--cvs-muted); }  #compound-volatility-simulator .cvs-band-key { width: 24px; height: 10px; border: 1px solid rgba(37, 99, 235, .24); border-radius: 3px; background: rgba(37, 99, 235, .12); }  #compound-volatility-simulator .cvs-status { margin-left: auto; font-variant-numeric: tabular-nums; }  #compound-volatility-simulator .cvs-summary { display: grid; grid-template-columns: repeat(3, 1fr); gap: 9px; margin-top: 14px; }  #compound-volatility-simulator .cvs-summary-item { padding: 10px 12px; border: 1px solid var(--cvs-border); border-radius: 9px; }  #compound-volatility-simulator .cvs-summary-label { display: block; margin-bottom: 3px; color: var(--cvs-muted); font-size: 12px; }  #compound-volatility-simulator .cvs-summary-value { color: var(--cvs-foreground); font-size: 16px; font-weight: 750; font-variant-numeric: tabular-nums; }  .cvs-takeaway {    margin: 1.75rem 0;    padding: 18px 20px;    border-left: 5px solid #2563eb;    border-radius: 4px 12px 12px 4px;    background: #eff6ff;    color: #172033;  }  .cvs-takeaway-title { display: block; margin-bottom: 8px; color: #1d4ed8; font-size: 18px; font-weight: 800; }  .cvs-takeaway p { margin: 0; }  .cvs-article-details {    margin: 14px 0;    padding: 14px 16px;    border: 1px solid #dfe3ea;    border-radius: 10px;    background: #fafbfc;  }  .cvs-article-details summary { color: #172033; cursor: pointer; font-weight: 700; }  .cvs-article-details summary::marker { color: #2563eb; }  .cvs-article-details[open] summary { margin-bottom: 14px; }  .cvs-article-details > :last-child { margin-bottom: 0; }  @media (max-width: 720px) {    #compound-volatility-simulator { padding: 12px; }    #compound-volatility-simulator .cvs-controls { grid-template-columns: 1fr 1fr; }    #compound-volatility-simulator .cvs-summary { grid-template-columns: 1fr; }    #compound-volatility-simulator .cvs-status { width: 100%; margin-left: 0; }  }  @media (max-width: 480px) {    #compound-volatility-simulator .cvs-controls { grid-template-columns: 1fr; }    #compound-volatility-simulator .cvs-button { width: 100%; }  }</style><div id="compound-volatility-simulator">  <div class="cvs-controls" aria-label="模拟参数">    <label class="cvs-label" for="cvs-vol">年化波动率：<span id="cvs-vol-value">12%</span>      <input id="cvs-vol" class="cvs-range" type="range" min="0" max="45" step="1" value="12">    </label>    <label class="cvs-label" for="cvs-return">预期年化收益：<span id="cvs-return-value">12%</span>      <input id="cvs-return" class="cvs-range" type="range" min="2" max="20" step="1" value="12">    </label>    <button id="cvs-random" class="cvs-button cvs-button-primary" type="button">生成新路径</button>    <button id="cvs-play" class="cvs-button" type="button">重播路径</button>  </div>  <div id="cvs-chart-wrap" class="cvs-chart-wrap">    <svg id="cvs-chart" class="cvs-chart" viewBox="0 0 760 430" role="img" aria-labelledby="cvs-title cvs-desc">      <title id="cvs-title">随机波动下的指数复利路径</title>      <desc id="cvs-desc">虚线表示平滑复利预期，浅蓝色带表示模型在每个时间点的百分之十至百分之九十分位区间，蓝色实线表示一次随机生成的资金路径。</desc>      <defs><clipPath id="cvs-clip"><rect x="58" y="24" width="674" height="342"></rect></clipPath></defs>      <g id="cvs-grid"></g>      <g clip-path="url(#cvs-clip)">        <path id="cvs-band" fill="#2563eb" fill-opacity="0.12"></path>        <line id="cvs-divider" stroke="#dfe3ea" stroke-width="1" stroke-dasharray="4 5"></line>        <path id="cvs-expected" fill="none" stroke="#667085" stroke-width="2" stroke-dasharray="6 5"></path>        <path id="cvs-actual" fill="none" stroke="#2563eb" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>      </g>      <g id="cvs-axes"></g>      <g id="cvs-labels"></g>    </svg>    <div id="cvs-tooltip" class="cvs-tooltip"></div>  </div>  <div class="cvs-legend cvs-small" aria-label="图例">    <span class="cvs-legend-item"><span class="cvs-line" aria-hidden="true"></span>本次随机路径</span>    <span class="cvs-legend-item"><span class="cvs-line cvs-line-expected" aria-hidden="true"></span>平滑复利预期</span>    <span class="cvs-legend-item"><span class="cvs-band-key" aria-hidden="true"></span>模型 10%–90% 分位区间</span>    <span id="cvs-status" class="cvs-status" aria-live="polite">当前：—</span>  </div>  <div class="cvs-summary" aria-label="20年模拟结果摘要">    <div class="cvs-summary-item"><span class="cvs-summary-label">本次路径终值</span><span id="cvs-actual-final" class="cvs-summary-value">—</span></div>    <div class="cvs-summary-item"><span class="cvs-summary-label">平滑复利预期</span><span id="cvs-expected-final" class="cvs-summary-value">—</span></div>    <div class="cvs-summary-item"><span class="cvs-summary-label">模型 80% 分位区间</span><span id="cvs-band-final" class="cvs-summary-value">—</span></div>  </div></div><script>(function () {  "use strict";  var root = document.getElementById("compound-volatility-simulator");  if (!root || root.dataset.ready === "true") return;  root.dataset.ready = "true";  var svg = root.querySelector("#cvs-chart");  var volInput = root.querySelector("#cvs-vol");  var returnInput = root.querySelector("#cvs-return");  var volValue = root.querySelector("#cvs-vol-value");  var returnValue = root.querySelector("#cvs-return-value");  var actualPath = root.querySelector("#cvs-actual");  var expectedPath = root.querySelector("#cvs-expected");  var bandPath = root.querySelector("#cvs-band");  var divider = root.querySelector("#cvs-divider");  var status = root.querySelector("#cvs-status");  var playButton = root.querySelector("#cvs-play");  var randomButton = root.querySelector("#cvs-random");  var gridGroup = root.querySelector("#cvs-grid");  var axesGroup = root.querySelector("#cvs-axes");  var labelsGroup = root.querySelector("#cvs-labels");  var tooltip = root.querySelector("#cvs-tooltip");  var actualFinal = root.querySelector("#cvs-actual-final");  var expectedFinal = root.querySelector("#cvs-expected-final");  var bandFinal = root.querySelector("#cvs-band-final");  var NS = "http://www.w3.org/2000/svg";  var plot = { left: 58, top: 24, width: 674, height: 342 };  var points = 181;  var years = 20;  var seed = Math.floor(Math.random() * 2147483646) + 1;  var data = [];  var animationId = null;  var z90 = 1.2815515655446004;  function el(name, attrs, text) {    var node = document.createElementNS(NS, name);    Object.keys(attrs || {}).forEach(function (key) { node.setAttribute(key, attrs[key]); });    if (text !== undefined) node.textContent = text;    return node;  }  function rngFactory(initialSeed) {    var state = initialSeed % 2147483647;    return function () { state = state * 16807 % 2147483647; return (state - 1) / 2147483646; };  }  function normal(random) {    var u = Math.max(random(), 1e-12);    return Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * random());  }  function generate() {    var sigma = Number(volInput.value) / 100;    var mu = Number(returnInput.value) / 100;    var random = rngFactory(seed);    var dt = years / (points - 1);    var value = 1;    data = [];    for (var i = 0; i < points; i += 1) {      var t = i * dt;      if (i > 0) value *= Math.exp((mu - 0.5 * sigma * sigma) * dt + sigma * Math.sqrt(dt) * normal(random));      var expected = Math.exp(mu * t);      var median = Math.exp((mu - 0.5 * sigma * sigma) * t);      var width = z90 * sigma * Math.sqrt(t);      data.push({ t: t, actual: value, expected: expected, upper: median * Math.exp(width), lower: median * Math.exp(-width) });    }  }  function pathFor(items, field, x, y) {    return items.map(function (d, i) { return (i ? "L" : "M") + x(d.t).toFixed(2) + "," + y(d[field]).toFixed(2); }).join(" ");  }  function draw(count) {    var visible = data.slice(0, Math.max(1, count));    var maxY = Math.max.apply(null, data.map(function (d) { return Math.max(d.actual, d.upper); })) * 1.08;    var minY = Math.min.apply(null, data.map(function (d) { return Math.min(d.actual, d.lower); })) * 0.92;    var x = function (t) { return plot.left + (t / years) * plot.width; };    var y = function (v) { return plot.top + plot.height - ((v - minY) / (maxY - minY)) * plot.height; };    expectedPath.setAttribute("d", pathFor(data, "expected", x, y));    actualPath.setAttribute("d", pathFor(visible, "actual", x, y));    var upper = data.map(function (d, i) { return (i ? "L" : "M") + x(d.t).toFixed(2) + "," + y(d.upper).toFixed(2); }).join(" ");    var lower = data.slice().reverse().map(function (d) { return "L" + x(d.t).toFixed(2) + "," + y(d.lower).toFixed(2); }).join(" ");    bandPath.setAttribute("d", upper + " " + lower + " Z");    divider.setAttribute("x1", x(8)); divider.setAttribute("x2", x(8));    divider.setAttribute("y1", plot.top); divider.setAttribute("y2", plot.top + plot.height);    gridGroup.textContent = ""; axesGroup.textContent = ""; labelsGroup.textContent = "";    [0, 5, 10, 15, 20].forEach(function (tick) {      var px = x(tick);      gridGroup.appendChild(el("line", { x1: px, x2: px, y1: plot.top, y2: plot.top + plot.height, stroke: "#dfe3ea", "stroke-width": 1 }));      axesGroup.appendChild(el("text", { x: px, y: 392, fill: "#667085", "text-anchor": "middle", class: "cvs-small" }, tick + "年"));    });    for (var j = 0; j <= 4; j += 1) {      var val = minY + (maxY - minY) * j / 4;      var py = y(val);      gridGroup.appendChild(el("line", { x1: plot.left, x2: plot.left + plot.width, y1: py, y2: py, stroke: "#dfe3ea", "stroke-width": 1 }));      axesGroup.appendChild(el("text", { x: 48, y: py + 4, fill: "#667085", "text-anchor": "end", class: "cvs-small" }, val.toFixed(val < 10 ? 1 : 0) + "×"));    }    axesGroup.appendChild(el("line", { x1: plot.left, x2: plot.left, y1: plot.top, y2: plot.top + plot.height, stroke: "#172033", "stroke-width": 1 }));    axesGroup.appendChild(el("line", { x1: plot.left, x2: plot.left + plot.width, y1: plot.top + plot.height, y2: plot.top + plot.height, stroke: "#172033", "stroke-width": 1 }));    labelsGroup.appendChild(el("text", { x: x(4), y: 46, fill: "#172033", "text-anchor": "middle", class: "cvs-small" }, "低基数：金额变化较慢"));    labelsGroup.appendChild(el("text", { x: x(14), y: 46, fill: "#172033", "text-anchor": "middle", class: "cvs-small" }, "高基数：同样收益率，金额变化更快"));    var last = visible[visible.length - 1];    var final = data[data.length - 1];    status.textContent = "当前：" + last.actual.toFixed(2) + "×";    actualFinal.textContent = final.actual.toFixed(2) + "×";    expectedFinal.textContent = final.expected.toFixed(2) + "×";    bandFinal.textContent = final.lower.toFixed(2) + "× – " + final.upper.toFixed(2) + "×";  }  function animatePath() {    if (animationId !== null) cancelAnimationFrame(animationId);    generate();    if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) { draw(points); return; }    var start = performance.now();    function frame(now) {      var progress = Math.min(1, (now - start) / 2400);      draw(Math.max(2, Math.floor(1 + progress * (points - 1))));      if (progress < 1) animationId = requestAnimationFrame(frame); else animationId = null;    }    animationId = requestAnimationFrame(frame);  }  function updateParameters() {    if (animationId !== null) {      cancelAnimationFrame(animationId);      animationId = null;    }    volValue.textContent = volInput.value + "%";    returnValue.textContent = returnInput.value + "%";    generate(); draw(points);  }  function chartPoint(event) {    var rect = svg.getBoundingClientRect();    var px = (event.clientX - rect.left) * 760 / rect.width;    var index = Math.max(0, Math.min(points - 1, Math.round(((px - plot.left) / plot.width) * (points - 1))));    return { index: index, left: (plot.left + data[index].t / years * plot.width) * rect.width / 760 };  }  svg.addEventListener("pointermove", function (event) {    var p = chartPoint(event); var d = data[p.index];    tooltip.textContent = d.t.toFixed(1) + "年 · 本次 " + d.actual.toFixed(2) + "× · 预期 " + d.expected.toFixed(2) + "× · 80%区间 " + d.lower.toFixed(2) + "×–" + d.upper.toFixed(2) + "×";    tooltip.style.display = "block";    tooltip.style.left = Math.max(0, Math.min(p.left, root.clientWidth - tooltip.offsetWidth - 12)) + "px";    tooltip.style.top = "18px";  });  svg.addEventListener("pointerleave", function () { tooltip.style.display = "none"; });  volInput.addEventListener("input", updateParameters);  returnInput.addEventListener("input", updateParameters);  randomButton.addEventListener("click", function () { seed = Math.floor(Math.random() * 2147483646) + 1; animatePath(); });  playButton.addEventListener("click", animatePath);  animatePath();}());</script><div class="cvs-takeaway" role="note" aria-label="核心结论">  <strong class="cvs-takeaway-title">核心结论：投资回报率与波动率呈现强相关</strong>  <p>在相同预期收益下，波动越大，长期复合回报越容易受到拖累。我们无法控制未来的涨跌，但可以尽量选择风险特征适合自己的标的，并通过仓位、分散配置与杠杆管理，把整个投资组合的波动率控制在自己能够承受的范围内。</p></div><!--配图说明 1：控制组合，而不是预测未来建议位置：核心结论卡片之后画面主题：同一位投资者面对不可预测的市场风浪，但可以控制自己的投资组合。构图：横向画面。远处是无法预测方向的海浪和天气，近处是一艘结构清晰的船；船上的压舱物、船帆大小和货物分布分别隐喻资产配置、仓位与杠杆。人物不试图控制海浪，而是在调整船自身的结构。画面重点放在“外部不可控，内部可管理”的对比。视觉风格：现代财经杂志的极简编辑插画，扁平矢量风格，深海军蓝、钴蓝、灰白为主色，少量柔和金色作为强调，克制、专业、有留白。避免：不要出现股票代码、具体收益数字、赌场元素、夸张金币、火箭、K 线暴涨或任何品牌标志；图片中不要生成文字。建议比例：16:9替代文本：投资者无法控制市场风浪，但可以通过资产配置、仓位和杠杆管理控制自己的投资组合。--><details class="cvs-article-details"><summary>为什么平滑的复利曲线会造成错觉</summary><p>假设本金是 1，年化收益率是 10%，20 年后就会变成：</p><p>$$e^{0.1 \times 20} \approx 7.39$$</p><p>这个计算没有错，但它很容易让人产生一种错觉：资金会沿着这条曲线稳定增长，只是前期慢一些、后期快一些。</p><p>现实中的资金曲线并不是这样。即使长期预期收益率不变，每一年仍然会经历上涨和下跌。最终结果不仅取决于收益率，也取决于波动出现的顺序，以及你是否能一直留在市场中。</p></details><details class="cvs-article-details"><summary>如何使用和阅读这个模拟器</summary><p>默认参数是 12% 的预期年化收益与 12% 的年化波动率。可以先保持预期年化收益不变，只调整年化波动率：</p><ol><li>把波动率降到 0%，资金路径会与平滑复利曲线重合。</li><li>把波动率调回 12%，反复点击“生成新路径”，观察相同参数如何产生不同结果。</li><li>把波动率提高到 35%，观察路径、终值和浅蓝色区域怎样变化。</li></ol><p>图中有三种元素：</p><ul><li><strong>蓝色实线</strong>：本次随机生成的一条资金路径。</li><li><strong>灰色虚线</strong>：完全忽略波动时的平滑复利预期。</li><li><strong>浅蓝色区域</strong>：模型在每个时间点的 10%～90% 分位区间。</li></ul><p>蓝色实线不是历史回测，也不是对未来的预测。每次点击“生成新路径”，都相当于让相同的市场假设重新经历一次不同的随机过程。</p></details><details class="cvs-article-details"><summary>浅蓝色区域、数学模型与分位区间</summary><p>模拟器假设资金变化符合一个简化的几何布朗运动模型：</p><p>$$S_t &#x3D; S_0 \exp\left((\mu - \frac{1}{2}\sigma^2)t + \sigma W_t\right)$$</p><p>其中：</p><ul><li>$S_t$ 是经过 $t$ 年后的资金；</li><li>$\mu$ 是预期收益率；</li><li>$\sigma$ 是年化波动率；</li><li>$W_t$ 表示随时间累积的随机扰动。</li></ul><p>浅蓝色区域取这个模型在每个时间点的第 10 百分位数到第 90 百分位数。换句话说，如果在相同参数下重复生成大量结果，那么在某一个指定年份，约有 80% 的结果会落在色带内。</p><p>这里有两个容易误解的地方。</p><p>第一，<strong>它不是保证范围</strong>。一条实际路径完全可能越过色带，它也不是止损线、最大亏损边界或收益承诺。</p><p>第二，“每个时间点约有 80% 的结果落在其中”，不等于“整条路径有 80% 的概率始终留在其中”。前者描述某一个时间截面的分布，后者描述整段过程，是两个不同的问题。</p><p><strong>为什么越往后，色带越宽</strong></p><p>随机波动随时间累积的尺度与 $\sqrt{t}$ 有关。时间越长，可能出现的路径差异就越大。</p><p>但图中的色带看起来扩张得比 $\sqrt{t}$ 更快，因为波动并不是作用在固定金额上，而是作用在不断变化的资金基数上。同样是 10% 的涨跌：</p><ul><li>本金为 1 时，金额变化是 0.1；</li><li>本金为 5 时，金额变化是 0.5；</li><li>本金为 10 时，金额变化是 1。</li></ul><p>因此，色带变宽并不代表市场在未来一定会变得更加危险。它表达的是：<strong>时间让不确定性不断累积，而复利又把这种不确定性作用在更大的资金基数上。</strong></p><!--配图说明 2：时间如何放大波动范围建议位置：“为什么越往后，色带越宽”段落之后画面主题：相同幅度的波动作用在不断增长的资金基数上，最终形成越来越宽的结果区间。构图：从左向右延伸的时间轴，起点是一条很窄的蓝色路径，随后逐渐分叉成多条上下波动的路径，并形成向右扩张的半透明扇形区域；中央保留一条平滑但不突出的参考曲线。画面表达路径差异随时间和资金基数共同扩大，不需要精确坐标或数字。视觉风格：与全文一致的极简财经信息插画，深海军蓝与钴蓝路径、浅蓝半透明区间、暖灰背景，兼具数据感和编辑插画质感。避免：不要直接复制文章中的交互图表，不要出现密集坐标、公式、文字标签、红绿 K 线或荧光色。建议比例：16:9替代文本：资金路径随时间逐渐分散，展示波动在更大资金基数上造成的结果差异。--></details><details class="cvs-article-details"><summary>为什么平均收益相同，终值仍然可能不同</summary><p>波动还有一个不太直观的影响：算术平均收益率相同，并不保证复合增长结果相同。</p><p>假设第一年上涨 50%，第二年下跌 50%。两年的算术平均收益率是 0%，但资金会从 1 变成：</p><p>$$1 \times 1.5 \times 0.5 &#x3D; 0.75$$</p><p>最终亏损了 25%。原因很简单：下跌 50% 之后，需要上涨 100% 才能回到原点。</p><p>在模拟器使用的模型中，这个效应体现在 $-\frac{1}{2}\sigma^2$ 这一项里。波动率越高，典型路径的复合增长速度与平滑预期之间的差距通常越大。这常被称为“波动拖累”。</p><p>这并不是说所有波动都应该被消除。承担风险往往正是获得收益的来源。真正需要理解的是，收益率和波动率不能分开看，只讨论“平均每年赚多少”是不完整的。</p><!--配图说明 3：平均收益相同，不代表终值相同建议位置：“为什么平均收益相同，终值仍然可能不同”折叠内容末尾画面主题：两条拥有相同平均收益假设的资金路径，因为波动程度不同而到达不同终点。构图：左右或上下并列的两条路线。第一条平稳、连续地向前上方延伸，终点保留较完整的资金方块；第二条大幅上下起伏，虽然整体方向相似，但终点的资金方块明显更小。通过路径形态和终点体积表达波动拖累，不使用具体百分比。视觉风格：简洁的几何编辑插画，统一使用蓝灰色系；稳定路径用钴蓝，剧烈路径用较深蓝灰，终点用柔和金色小面积强调。避免：不要表现成“低风险必赚、高风险必亏”，不要使用人物欢呼或沮丧、赌场筹码、钞票雨、文字和公式。建议比例：16:9替代文本：平均收益假设相同的平稳路径与高波动路径，最终保留了不同规模的资金。--></details><details class="cvs-article-details"><summary>这个模型没有考虑哪些现实因素</summary><p>为了让关系容易观察，这个模拟器做了很多简化：</p><ul><li>收益率和波动率在 20 年中保持不变；</li><li>每个时间段的随机变化相互独立；</li><li>市场没有交易成本、税费和流动性问题；</li><li>没有加入极端跳跃、波动率聚集和长期制度变化；</li><li>没有考虑定投、取现、再平衡和个人现金流。</li></ul><p>真实市场显然不满足这些条件。因此，这个工具适合解释机制，不适合用来预测某项资产 20 年后的具体价格。</p></details><p><strong>1. 想象中的曲线</strong></p><p>在想象中，资金会沿着一条平滑的复利曲线稳定向上。只要给定年化收益率和时间，终点似乎就已经确定，中间没有意外，也不需要承受回撤。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161245819.png" alt="1786161245819.png"></p><!-- 配图插入位置：想象中的平滑复利曲线 --><p><strong>2. 真实市场</strong></p><p>真实市场不会沿直线前进。即使长期预期收益相同，资金也会在一次次上涨和下跌中曲折前行；波动的大小与出现顺序，会让最终结果产生很大差异。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161256466.png" alt="1786161256466.png"></p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161315773.png" alt="1786161315773.png"></p><!-- 配图插入位置：真实市场中不断波动的资金曲线 --><p><strong>3. 亏钱以后，游戏可能就结束了</strong></p><p>大幅亏损带来的不只是账面数字下降。使用杠杆时，亏损可能触发追加保证金甚至爆仓；即使没有杠杆，也可能因为现金流或心理压力被迫卖出。一旦离开市场，后面的反弹就与你无关了。</p><!-- 配图插入位置：亏损触发爆仓，投资者被迫离开市场 --><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161284623.png" alt="1786161284623.png"></p><h2 id="真正能控制的是自己的组合"><a href="#真正能控制的是自己的组合" class="headerlink" title="真正能控制的是自己的组合"></a>真正能控制的是自己的组合</h2><p>平滑复利曲线最容易被忽略的，不是数学误差，而是人的处境。</p><p>一条策略即使长期期望为正，中间也可能经历很深的回撤。如果仓位、杠杆或现金流安排让人无法承受这些波动，那么理论上的长期收益就和自己没有关系。资金会在到达曲线右侧之前，先被迫离开市场。</p><p>这也是我在<a href="/2026/01/01/2026-01-01-%E6%8A%95%E8%B5%84%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E5%88%AB%E4%BA%8F%E9%92%B1/">《投资最重要的是别亏钱》</a>中想说明的事情：“别亏钱”并不是要求每一笔交易都盈利，而是尽量避免一次难以恢复的大幅亏损摧毁本金，让复利引擎失去继续运转的基础。</p><p>所以长期投资不能只问：</p><blockquote><p>如果一切顺利，20 年后能赚多少？</p></blockquote><p>还应该问：</p><blockquote><p>在不顺利的路径上，我能否继续持有？</p></blockquote><p>我们无法决定市场下一年给出什么回报，也无法完全消除风险。真正可以主动管理的是：购买什么标的、每个标的配置多少仓位、是否使用杠杆，以及不同资产放在一起后会形成怎样的整体波动。</p><p>控制波动率，不是单纯追求“波动越低越好”，而是让风险与自己的承受能力相匹配。单个标的看起来不错，不等于它适合以很高的仓位进入组合；预期收益很高，也不能替代对回撤和相关性的判断。</p><h2 id="高波动工具：管理，而非投机"><a href="#高波动工具：管理，而非投机" class="headerlink" title="高波动工具：管理，而非投机"></a>高波动工具：管理，而非投机</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161355737.png" alt="1786161355737.png"></p><p>期货和期权常被视为高波动、高杠杆的工具，但应尽量避免用它们单纯押注价格方向。更合适的定位，是用它们规范已有的持仓：明确组合承担了什么风险、把敞口限制在什么范围，以及最坏情况下愿意损失多少。期货可以高效地对冲指数、商品、利率或汇率风险；买入期权可以用一笔确定的权利金，为组合建立有边界或非对称的保护。</p><p>它们的价值不一定体现在这笔交易本身赚了多少钱，而在于整个组合遭遇不利行情时少损失了多少。使用之前应该先问：它在抵消哪一部分既有敞口？规模和期限是否匹配？如果无法清楚回答，那么这笔交易很可能不是在规范持仓，而是在给组合增加新的投机风险。杠杆、保证金、时间价值与基差也可能反过来放大风险。</p><p>黄金也是类似的例子。单独看，黄金本身同样会波动，也不会在所有市场环境中都与其他资产负相关；但当它与股票、债券等资产的驱动因素不完全相同时，适当配置可能降低组合的集中度、波动率与尾部风险。此时，评价黄金的标准不应只是它有没有跑赢股票，而应看它是否改善了整个组合的风险结构。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161392368.png" alt="1786161392368.png"></p><p>一笔对冲仓位单独亏损，并不代表它没有价值：如果主要资产上涨，保险成本本来就可能成为组合为了稳定性付出的代价。反过来，如果只盯着期货、期权或黄金自身的盈亏，很容易把风险管理工具重新变成方向投机工具。</p><p>因此，相比直接押注价格方向，把这些工具用于平衡整体仓位，虽然不保证获得更高的绝对收益，却可能通过减少大幅回撤和被迫卖出，让长期复合收益与风险调整后收益明显更好。<strong>它们最有价值的“收益”，往往是让组合的其他部分更稳定地留在场内。</strong></p><!--配图说明 4：高波动工具用于持仓管理建议位置：“高波动工具：管理，而非投机”段落之后画面主题：期货、期权和黄金不是孤立的投机筹码，而是围绕核心持仓工作的风险管理部件。构图：中央是由股票与债券构成的稳固核心组合，外围有三个功能明确但不带文字的视觉部件：一面可调节的盾牌象征期权保护，一组方向相反且相互抵消的连接杆象征期货对冲，一块金色压舱物象征黄金分散风险。所有部件共同让整体结构在外部冲击下保持平衡。重点呈现“组合协作”，不要突出任何单一资产。视觉风格：高质感现代财经编辑插画，模块化几何构图，深海军蓝、钴蓝、暖灰和低饱和金色，清晰、理性、克制，与前述配图保持一致。避免：不要画成交易软件界面，不要使用真实期货或期权合约文字，不要出现金条堆、老虎机、骰子、火焰、火箭、夸张盈利符号、品牌标志或水印；图片中不要生成文字。建议比例：16:9替代文本：期权、期货和黄金围绕核心持仓发挥保护、对冲与分散作用，使整个投资组合保持平衡。--><p><img src="https://rawforcorvofeng.cn/blog/2026/08/08/1786161420505.png" alt="1786161420505.png"></p><p><strong>预期收益决定我们为什么出发，组合波动率决定我们能否留在路径上。未来无法控制，但仓位可以管理。</strong></p><blockquote><p>本文与模拟器仅用于解释复利和随机波动的关系，不构成任何投资建议。</p></blockquote>]]></content>
    
    
    <summary type="html">相同的预期收益率，为什么会产生完全不同的资金路径？用一个可以交互的模拟器，理解复利、波动率与长期结果之间的关系。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="数学" scheme="https://corvo.myseu.cn/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="复利" scheme="https://corvo.myseu.cn/tags/%E5%A4%8D%E5%88%A9/"/>
    
    <category term="风险" scheme="https://corvo.myseu.cn/tags/%E9%A3%8E%E9%99%A9/"/>
    
  </entry>
  
  <entry>
    <title>位置：你无法站在世界之外</title>
    <link href="https://corvo.myseu.cn/2026/08/01/2026-08-01-%E4%BD%8D%E7%BD%AE/"/>
    <id>https://corvo.myseu.cn/2026/08/01/2026-08-01-%E4%BD%8D%E7%BD%AE/</id>
    <published>2026-08-01T00:00:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>请注意, 本文绝不是劝人炒股的, 你不能在科技最高点的时候进入市场, 然后说我占据了有利位置, 这样的亏钱是没有人会同情你的.</p></blockquote><p>假设你认为股市风险太高，于是什么也不买，把钱全部留在账户里。</p><p>你会觉得自己没有参与市场。但从相对购买力来看，你其实做了一个很明确的选择：<strong>持有现金，放弃股票的潜在收益。</strong></p><p>股票上涨时，现金数字没变，但相对购买力下降了；股票下跌时，现金也没变，但你获得了更强的购买力。这并不等同于金融意义上的“做空”，却说明了一件事：</p><blockquote><p><strong>不下注，也是一种下注。</strong></p></blockquote><p>不买房、不换工作、不学一门新技术，都不是“什么也没做”，而是继续持有当前状态。可世界不会因为你没有点击“确认”就停止变化。城市、行业、公司和其他人都在继续移动。</p><p>我们无法选择是否参与世界，只能选择以什么位置参与。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785638781109.png" alt="1785638781109.png"></p><!--插图 01｜文章首图：你无法站在世界之外建议文件名：position-in-the-world.png建议位置：放在本注释之后，作为文章首图。画面：一个人站在由城市、公司、市场和人群构成的巨大流动系统中；脚下是“现金”“股票”“职业”“城市”等不同落脚点。画面里没有旁观席，无论人物站在哪里，都有信息、资源与风险的流线经过。风格：抽象经济学编辑插画，米白底色，深蓝与炭黑为主色，暗金色标记机会；简洁、克制、有隐喻感，16:9 横图，图内不放文字。Alt 文本：一个人站在信息、资源和风险不断流动的系统中引用示例：![一个人站在信息、资源和风险不断流动的系统中](position-in-the-world.png)--><span id="more"></span><h2 id="一、Position：你站在哪里，什么就会流向你"><a href="#一、Position：你站在哪里，什么就会流向你" class="headerlink" title="一、Position：你站在哪里，什么就会流向你"></a>一、Position：你站在哪里，什么就会流向你</h2><p>我很喜欢英文单词 <strong>position</strong>。它既表示一个人在空间、组织或关系中的“位置”，也表示金融市场里的“头寸”。</p><p>这或许不只是语言上的巧合。所谓头寸，本质上就是选择站在市场的哪一边：持有股票是一种位置，持有现金是一种位置，承担债务或完全空仓也各自是一种位置。</p><p>离开金融市场，这个概念依然成立。</p><ul><li>你住在哪座城市，是地理位置；</li><li>你靠近核心业务还是边缘业务，是组织位置；</li><li>你是平台、供应商、客户还是资本方，是产业位置；</li><li>你被认为是执行者、协调者还是专家，是心智位置。</li></ul><p>位置不只是一个静态的地点，它更像你在某个系统中的<strong>暴露方式</strong>。它决定你更容易看见什么，什么资源会流向你，又有什么风险会先击中你。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785638814857.png" alt="1785638814857.png"></p><!--插图 02｜位置改变信息与机会的流向建议文件名：position-and-flow.png建议位置：放在本注释之后，用来说明“位置是在系统中的暴露方式”。画面：俯视一个抽象网络，三个人分别站在网络中心、边缘和两个系统的交界处。中心人物接收更多信息，也面对更多风险；边缘人物信息较少且延迟；交界处的人物能够连接两个不同群体。用不同颜色的细线表示信息、资源、机会和风险。风格：简洁信息图结合编辑插画，米白底色，深蓝、炭黑和少量暗金色，16:9 横图，图内不放文字。Alt 文本：站在系统不同位置的人接收到不同的信息、机会和风险引用示例：![站在系统不同位置的人接收到不同的信息、机会和风险](position-and-flow.png)--><h3 id="地理位置：时间会悄悄改变人生"><a href="#地理位置：时间会悄悄改变人生" class="headerlink" title="地理位置：时间会悄悄改变人生"></a>地理位置：时间会悄悄改变人生</h3><p>同样一份收入，在不同城市代表不同的生活质量；即使在同一座城市，住在公司附近和每天通勤两小时，也会通向不同的生活。</p><p>两小时放在一天里并不显眼，一年却是几百个小时。这些时间足以完成一项系统学习、做出一个项目，或维持更好的身体和关系。好的地理位置不会直接交付成功，却会像复利一样，每天少量地改变你的时间、精力和机会。</p><h3 id="组织位置：同一家公司，不同的现实"><a href="#组织位置：同一家公司，不同的现实" class="headerlink" title="组织位置：同一家公司，不同的现实"></a>组织位置：同一家公司，不同的现实</h3><p>老板看到的是现金流、组织结构和生存概率；管理者看到的是资源分配和结果交付；普通员工看到的是任务、绩效和回报；客户只关心产品是否好用。</p><p>他们面对同一家公司，却生活在不同的现实里。所以很多争论未必只是谁对谁错，也可能是信息、利益和所承担的风险不同。</p><blockquote><p>在评价一种行为之前，先看它是从什么位置产生的。</p></blockquote><h3 id="心智位置：机会会找上“被认为合适的人”"><a href="#心智位置：机会会找上“被认为合适的人”" class="headerlink" title="心智位置：机会会找上“被认为合适的人”"></a>心智位置：机会会找上“被认为合适的人”</h3><p>位置还存在于别人的认知里。一个人如果被认为擅长解决某类问题，类似的问题就会更多地来到他面前。他因此获得更多练习、信息和资源，又进一步坐实这个印象。</p><p>但定位也意味着取舍。你可以有很多能力，别人能清晰记住的却通常只有少数几个标签。当你选择成为“解决复杂基础设施问题的人”，就更容易获得这类机会，也可能错过与这个定位无关的机会。</p><p>建立定位和建立头寸很像：都在获得某种收益暴露的同时，接受相应的机会成本。</p><h2 id="二、好位置会形成自我强化的循环"><a href="#二、好位置会形成自我强化的循环" class="headerlink" title="二、好位置会形成自我强化的循环"></a>二、好位置会形成自我强化的循环</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669496029.png" alt="1785669496029.png"></p><p>人与人的差距并不全来自能力，也来自所处位置。</p><p>住在产业集中的城市，更容易接触相关公司和人才；进入优秀的团队，更容易学到高标准的做事方法；靠近核心业务，更容易理解组织真正关心什么。</p><p>这些好处单独看都很小，持续足够久，却会组成一个正向循环：</p><blockquote><p><strong>好的位置带来更多信息和机会，机会形成能力，能力又帮你获得更好的位置。</strong></p></blockquote><!--插图 03｜位置的自我强化循环建议文件名：position-feedback-loop.png建议位置：放在本注释之后，跟在正向循环的核心句后面。画面：一条向上盘旋的螺旋路径，依次经过“更好的位置→更多信息与机会→更好的判断与能力→更多资源与信任→更好的位置”。用图形和场景表达每个节点，不在图内使用文字；螺旋每回到相似位置时都比上一圈更高。风格：克制的经济学信息插画，米白底色，深蓝螺旋，暗金色节点，16:9 横图，干净留白。Alt 文本：好的位置通过信息、能力和资源形成不断向上的循环引用示例：![好的位置通过信息、能力和资源形成不断向上的循环](position-feedback-loop.png)--><p>这就是好位置的累积效应。它也解释了为什么有些表面上的“能力差距”，最初可能只是位置差距。</p><p>这不是否定努力。恰恰相反，它提醒我们：努力不应只用来提高自己在当前位置上的表现，也应该用来识别和靠近更好的位置。</p><h3 id="不存在脱离个人的“最佳位置”"><a href="#不存在脱离个人的“最佳位置”" class="headerlink" title="不存在脱离个人的“最佳位置”"></a>不存在脱离个人的“最佳位置”</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669555890.png" alt="1785669555890.png"></p><p>北京、上海、东京、纽约或一座小城市，无法抽象地排出最好和最差。管理者、专家、创业者和自由职业者，也没有绝对高下。</p><p>一个位置是否好，要看它能否让你发挥已有能力、积累新能力，是否能带来高质量的信息和机会，以及它的风险是否在你能承受的范围内。</p><p>因此，比“哪里最好”更有用的问题是：</p><blockquote><p><strong>哪里更适合我，我又该怎样逐渐靠近它？</strong></p></blockquote><h2 id="三、好的位置，应该让你还能移动"><a href="#三、好的位置，应该让你还能移动" class="headerlink" title="三、好的位置，应该让你还能移动"></a>三、好的位置，应该让你还能移动</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669655363.png" alt="1785669655363.png"></p><p>我们很难提前知道哪个位置一定最好。所以评价一个位置，不能只看它当下能带来多少收益，还要看它保留了多少未来的选择权。</p><p>一个高收入却极度封闭的岗位，未必比一个暂时收入较低、却能积累通用能力的岗位更好。一项看似稳定的资产，如果占用了所有资金，也会让你在新机会出现时无法行动。</p><p>好的位置往往具有几个特点：</p><ul><li>下行损失在可承受范围内；</li><li>能持续获得新的信息和反馈；</li><li>能积累可迁移的能力和信任；</li><li>未来仍有多个选择；</li><li>即使判断错误，也不会被永久困住。</li></ul><p>选择权不保证成功，但它能保留你在未来继续行动的能力。与其准确预测十年后的世界，不如把自己放在一个能适应多种未来的位置上。</p><p>位置也不是一次选定，就要永远保持不变。城市、行业和公司在变，个人的年龄、财富、能力和目标也在变。过去很有价值的位置，未来可能逐渐变得普通；曾经有效的路径，也可能因为环境变化而失效。</p><p>有时调整位置意味着换一座城市、一个行业或一家公司；更多时候，它只是搬到离公司更近的地方，从边缘业务转向核心业务，主动认识几个不同领域的人，或者把一部分时间投入新技能。</p><p>很多长期差距，正是由这些微小的位置调整累积而成。</p><h2 id="四、重新理解“什么都不做”"><a href="#四、重新理解“什么都不做”" class="headerlink" title="四、重新理解“什么都不做”"></a>四、重新理解“什么都不做”</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669716996.png" alt="1785669716996.png"></p><p>等待本身也可以是一种主动的 position。</p><p>当市场没有合理机会时，持有现金可以保留选择权；当职业方向尚不明确时，小规模探索可能比仓促投入更合适。保持当前位置，也可以是一种经过思考的选择。</p><p>同样是空仓，一种是因为恐惧，不知道自己在等什么；另一种是因为当前赔率不合理，主动保留行动能力。同样是留在原来的工作，一种源于惯性，另一种则是清楚地知道当前岗位仍能提供自己需要的积累。</p><p>表面行为完全相同，背后的认知和未来路径却不同。</p><p>所以，真正的问题不是“我有没有行动”，而是：</p><blockquote><p><strong>我是否清楚，自己为什么站在这里？</strong></p></blockquote><h2 id="五、假如世界上真的有神"><a href="#五、假如世界上真的有神" class="headerlink" title="五、假如世界上真的有神"></a>五、假如世界上真的有神</h2><p>最后，我想把“位置”推向一个更抽象的地方。</p><p>假如世界上真的有神，他能看见每个人，也能听见每个人的愿望，那么一个问题随之而来：</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669756639.png" alt="1785669756639.png"></p><blockquote><p><strong>他为什么满足你的愿望，而不是别人的？</strong></p></blockquote><p>有人希望房价上涨，也有人等着房价下跌；有人希望得到一个职位，另一个人也在竞争同一个位置；比赛的两边，都有人在为胜利祈祷。人的愿望不仅数量巨大，彼此还常常矛盾。</p><p>如果所有愿望都能同时实现，世界反而无法运转。所以即使神真的存在，他大概也不会像一台接收请求的机器，逐一兑现每个人的每一个愿望。<strong>愿望本身，并不足以构成结果。</strong></p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785680924532.png" alt="1785680924532.png"></p><p>一个从未购买彩票的人，很难中得彩票；一个从未投递简历的人，很难等到理想工作主动降临；没有进入市场的人，也无法获得市场上涨的收益。</p><p>这不是说努力一定有回报，也不是说站到某个位置就必然得到结果。它只是说：</p><blockquote><p><strong>如果你距离一个结果无限遥远，即使机会出现，也很难落到你身上。</strong></p></blockquote><p>因此，人的责任或许不是反复要求神改变整个世界，而是先让自己移动到一个更接近结果的位置。想遇见某种人，就要进入更可能遇见他们的环境；想获得某种机会，就要让自己出现在机会能够识别你的地方；想让一次偶然改变自己，至少要站在偶然可能经过的路径上。</p><h3 id="幸运，是机会经过时你恰好在场"><a href="#幸运，是机会经过时你恰好在场" class="headerlink" title="幸运，是机会经过时你恰好在场"></a>幸运，是机会经过时你恰好在场</h3><p>所谓幸运，或许并不是结果毫无原因地从天而降。它更像是当某个低概率事件发生时，你恰好站在它能够经过的位置。</p><p>机会出现了，而你能够看见；有人需要某种能力，而你恰好已经拥有；市场出现了错误定价，而你恰好有资金、有知识，也保留着行动的勇气。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669830621.png" alt="1785669830621.png"></p><p>从外部看，这些事情像命运的眷顾。但在幸运发生以前，一个人往往已经做过很多次位置上的移动：他选择了一座城市，进入了一个行业，认识了一些人，积累了某种能力，保留了一部分资源，也承担了恰当的风险。</p><blockquote><p><strong>这些选择不能制造神迹，却为神迹留下了落点。</strong></p></blockquote><!--插图 04｜走到奇迹可能发生的地方建议文件名：waiting-at-the-open-door.png建议位置：放在本注释之后，作为本节也是全文的情绪性收束图。画面：黑暗中有一条漫长、曲折但清晰的路，一个人已经走到路的尽头。前方一扇门刚刚打开，暖金色的光洒在人物和脚下的道路上；人物不是原地祈祷，而是已经走完了大部分路程，恰好在门打开时站在门前。风格：富有隐喻感的编辑插画，深蓝和炭黑环境，米白色留白，暖金色门光作为唯一高亮，16:9 横图，克制而不宗教化，图内不放文字。Alt 文本：一个人走过漫长道路，在一扇刚刚打开的门前迎接光亮引用示例：![一个人走过漫长道路，在一扇刚刚打开的门前迎接光亮](waiting-at-the-open-door.png)--><p>如果希望机会找到自己，就要降低机会找到自己的难度；如果希望愿望实现，就要把愿望转化成一连串现实中的位置变化。</p><p>愿望不是一张要求世界兑现的订单，它更像一个方向：提醒你该向哪里移动，该接近什么人，积累什么能力，承担什么风险，又要保留什么选择权。</p><p>你无法保证愿望一定实现，却可以不断缩短自己与结果之间的距离。当距离足够近，一次偶然、一个陌生人的帮助，甚至一次无法解释的幸运，都可能成为最后的推力。</p><p>那一刻，我们可以称它为概率，可以称它为命运，也可以称它为神的回应。但在它发生以前，你必须先拥有一个能够承接结果的位置。</p><h2 id="结语：不追求每一次都正确"><a href="#结语：不追求每一次都正确" class="headerlink" title="结语：不追求每一次都正确"></a>结语：不追求每一次都正确</h2><p>世界大概永远都不确定。我们无法保证每一次判断都正确，但可以不断理解和调整自己的位置：</p><ul><li>靠近更适合自己的位置；</li><li>留意什么信息、资源、机会和风险正在流向自己；</li><li>用小的移动验证方向，而不是坐等完美答案；</li><li>无论何时，都为下一次移动保留选择权。</li></ul><p>投资者不需要每一笔交易都赚钱，创业者不需要每一个产品都成功，一个人的职业选择也不需要每一步都是理论上的最优解。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/08/02/1785669920991.png" alt="1785669920991.png"></p><p>真正值得反复问自己的，是这三个问题：</p><blockquote><p><strong>我现在站在哪里？</strong><br><strong>这个位置正在让我得到什么，又失去什么？</strong><br><strong>它还能让我走向哪里？</strong></p></blockquote><p>神是否存在，我们或许永远无法证明。但真正有意义的信念，不是坐在原地等待世界满足自己，而是在无法确定结果时，仍然一步一步向它靠近。</p><blockquote><p><strong>也许神并不负责把愿望直接交到你手中。</strong><br><strong>他只是偶尔打开一扇门，而你需要提前走到门前。</strong></p></blockquote>]]></content>
    
    
    <summary type="html">我们无法选择是否参与世界，只能选择以什么位置参与。你站在哪里，决定了什么信息、资源、机会和风险会流向你。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="决策" scheme="https://corvo.myseu.cn/tags/%E5%86%B3%E7%AD%96/"/>
    
    <category term="思维方式" scheme="https://corvo.myseu.cn/tags/%E6%80%9D%E7%BB%B4%E6%96%B9%E5%BC%8F/"/>
    
    <category term="位置" scheme="https://corvo.myseu.cn/tags/%E4%BD%8D%E7%BD%AE/"/>
    
  </entry>
  
  <entry>
    <title>国债逆回购自动下单：券商功能还是自己用 QMT？</title>
    <link href="https://corvo.myseu.cn/2026/07/16/2026-07-15-%E5%9B%BD%E5%80%BA%E9%80%86%E5%9B%9E%E8%B4%AD%E8%87%AA%E5%8A%A8%E4%B8%8B%E5%8D%95/"/>
    <id>https://corvo.myseu.cn/2026/07/16/2026-07-15-%E5%9B%BD%E5%80%BA%E9%80%86%E5%9B%9E%E8%B4%AD%E8%87%AA%E5%8A%A8%E4%B8%8B%E5%8D%95/</id>
    <published>2026-07-16T20:30:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>先说结论：如果只是偶尔做国债逆回购，券商自带的自动下单功能很省心，值得用服务费换便利；但如果每天都用较大闲置资金做一天期逆回购，额外服务费会变成一笔持续的交易摩擦。</p><p>我看到的两个券商自动下单页面，费率分别是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">自动方案 A：0.003%，每 10 万元收费 3 元</span><br><span class="line">自动方案 B：0.0035%，每 10 万元收费 3.5 元</span><br></pre></td></tr></table></figure><p>而一天期国债逆回购常见的手动佣金示例是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">手动下单：0.001%，每 10 万元收费 1 元</span><br></pre></td></tr></table></figure><p>如果每年按 240 个交易日估算，每天用 10 万元做一天期逆回购：</p><table><thead><tr><th>方式</th><th align="right">每次费用</th><th align="right">年费用</th></tr></thead><tbody><tr><td>手动下单</td><td align="right">1 元</td><td align="right">240 元</td></tr><tr><td>自动方案 A</td><td align="right">3 元</td><td align="right">720 元</td></tr><tr><td>自动方案 B</td><td align="right">3.5 元</td><td align="right">840 元</td></tr></tbody></table><p>也就是说，每 10 万元一年可能多付 <strong>480 到 600 元</strong>。如果资金是 100 万元，就对应 <strong>4,800 到 6,000 元</strong>。</p><p>这就是我没有直接打开券商自动下单，而是考虑用 QMT 和 Python 自己做一套自动化的主要原因。</p><p>本文只是记录我的计算和实现思路，不构成投资建议。不同券商、账户和逆回购期限的佣金可能不同，请以开户券商的最新收费说明和实际交割单为准。</p><hr><h2 id="券商自动下单贵在哪里？"><a href="#券商自动下单贵在哪里？" class="headerlink" title="券商自动下单贵在哪里？"></a>券商自动下单贵在哪里？</h2><p>券商自动下单解决的是“每天记得操作”的问题。它通常会在指定时间检查账户可用资金，扣除用户设置的预留金额，然后把剩余资金用于国债逆回购。部分功能还会判断收益是否覆盖手续费，或者自动撤销未成交委托。</p><p>这类功能最大的优点是省心：不用写代码，不用维护 QMT，不用担心程序断线。</p><p>但问题也在这里：它把“省心”做成了一项额外收费服务。</p><p>下面两张是我看到的券商页面截图。因为原图是很长的手机截图，这里只展示关键费率区域；点击图片可以查看完整截图。</p><div class="repo-screenshot-grid">  <figure class="repo-screenshot-card repo-screenshot-card--blue">    <a href="https://rawforcorvofeng.cn/blog/2026/07/17/1784292662087.png" target="_blank" rel="noopener">      <img src="https://rawforcorvofeng.cn/blog/2026/07/17/1784292662087.png" alt="券商余额理财自动下单收费说明，显示自动下单费率 0.003%，每 10 万元收取 3 元">    </a>    <figcaption>      <strong>方案 A：0.003%</strong>      <span>每 10 万元收取 3 元，页面说明已包含原手动下单佣金率。</span>    </figcaption>  </figure>  <figure class="repo-screenshot-card repo-screenshot-card--red">    <a href="https://rawforcorvofeng.cn/blog/2026/07/17/1784292673672.png" target="_blank" rel="noopener">      <img src="https://rawforcorvofeng.cn/blog/2026/07/17/1784292673672.png" alt="券商设置自动下单页面风险提示，显示单笔收费 0.0035%，含手续费 0.001% 和功能服务费 0.0025%">    </a>    <figcaption>      <strong>方案 B：0.0035%</strong>      <span>每 10 万元收取 3.5 元，其中包含手续费 0.001% 和功能服务费 0.0025%。</span>    </figcaption>  </figure></div><p>单次多 2 元或 2.5 元，看起来不大。但一天期逆回购如果每天都做，频率会把小费用放大。</p><table><thead><tr><th>自动频率</th><th align="right">年交易次数示例</th><th align="right">方案 A 额外费用 &#x2F; 10 万元</th><th align="right">方案 B 额外费用 &#x2F; 10 万元</th></tr></thead><tbody><tr><td>每半年一次</td><td align="right">2 次</td><td align="right">4 元</td><td align="right">5 元</td></tr><tr><td>每月一次</td><td align="right">12 次</td><td align="right">24 元</td><td align="right">30 元</td></tr><tr><td>每周一次</td><td align="right">52 次</td><td align="right">104 元</td><td align="right">130 元</td></tr><tr><td>每个交易日一次</td><td align="right">240 次</td><td align="right">480 元</td><td align="right">600 元</td></tr></tbody></table><p>所以关键不是“券商自动功能能不能用”，而是你的使用频率和资金规模是否值得为它付费。</p><hr><h2 id="低利率环境下，手续费会更显眼"><a href="#低利率环境下，手续费会更显眼" class="headerlink" title="低利率环境下，手续费会更显眼"></a>低利率环境下，手续费会更显眼</h2><p>假设用 10 万元做一天期逆回购，成交年化利率是 1.5%。按 365 天口径粗略计算：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">毛收益 = 100000 × 1.5% ÷ 365 ≈ 4.11 元</span><br></pre></td></tr></table></figure><p>扣除费用后：</p><table><thead><tr><th>下单方式</th><th align="right">毛收益</th><th align="right">手续费</th><th align="right">净收益</th></tr></thead><tbody><tr><td>手动下单</td><td align="right">4.11 元</td><td align="right">1 元</td><td align="right">3.11 元</td></tr><tr><td>自动方案 A</td><td align="right">4.11 元</td><td align="right">3 元</td><td align="right">1.11 元</td></tr><tr><td>自动方案 B</td><td align="right">4.11 元</td><td align="right">3.5 元</td><td align="right">0.61 元</td></tr></tbody></table><p>这就是我在意这件事的原因。</p><p>自动下单当然不是永远不划算。比如节假日前，一天期品种可能获得多个实际计息日，这时手续费占比会下降。但在大量普通交易日，尤其是利率偏低时，自动服务费会吃掉相当一部分净收益。</p><hr><h2 id="什么时候用券商功能，什么时候自己做？"><a href="#什么时候用券商功能，什么时候自己做？" class="headerlink" title="什么时候用券商功能，什么时候自己做？"></a>什么时候用券商功能，什么时候自己做？</h2><p>我的判断很简单：</p><table><thead><tr><th>场景</th><th>更适合</th></tr></thead><tbody><tr><td>低频操作，资金规模不大，只想省心</td><td>券商自动下单</td></tr><tr><td>不熟悉 Python，不愿维护 Windows &#x2F; QMT</td><td>券商自动下单</td></tr><tr><td>每天都有较大闲置资金</td><td>QMT 自建程序</td></tr><tr><td>已经有 QMT、Python、日志和通知系统</td><td>QMT 自建程序</td></tr><tr><td>想比较沪深利率、动态设置门槛、接入自定义通知</td><td>QMT 自建程序</td></tr></tbody></table><p>换句话说，券商功能卖的是便利；自建程序买的是控制权。</p><p>如果一个人平时不写程序，也没有长期运行的交易终端，为了每 10 万元每年省几百元去搭系统，可能并不划算。但如果已经有 QMT 和自动化环境，逆回购自动下单只是把已有能力再接上一段。</p><p>对我来说，它不只是省服务费，更重要的是让账户资金管理变得可观测、可追溯、可控制。</p><hr><h2 id="我的-QMT-实现思路"><a href="#我的-QMT-实现思路" class="headerlink" title="我的 QMT 实现思路"></a>我的 QMT 实现思路</h2><p>完整代码我放在这个 Gist 里，建议直接用 AI 帮你读一遍：</p><p><a href="https://gist.github.com/corvofeng/5870cf0357600293e7ebee9d2237b182">https://gist.github.com/corvofeng/5870cf0357600293e7ebee9d2237b182</a></p><p>程序核心目标只有一个：每天固定时间检查账户，如果条件合适，就把闲置资金拿去做一天期逆回购；如果条件不合适，就记录原因并跳过。</p><p>大致流程是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">启动策略</span><br><span class="line">  ├─ 订阅沪深一天期逆回购行情</span><br><span class="line">  ├─ 绑定账户</span><br><span class="line">  └─ 注册每日定时任务</span><br><span class="line"></span><br><span class="line">定时触发</span><br><span class="line">  ├─ 检查是否为交易日和允许时间</span><br><span class="line">  ├─ 检查当天是否已经执行</span><br><span class="line">  ├─ 查询可用资金</span><br><span class="line">  ├─ 扣除预留现金和安全缓冲</span><br><span class="line">  ├─ 比较沪深逆回购利率</span><br><span class="line">  ├─ 判断是否高于最低利率门槛</span><br><span class="line">  └─ 提交委托或跳过</span><br><span class="line"></span><br><span class="line">委托后</span><br><span class="line">  ├─ 记录委托状态</span><br><span class="line">  ├─ 记录成交结果</span><br><span class="line">  ├─ 处理失败原因</span><br><span class="line">  └─ 发送通知</span><br></pre></td></tr></table></figure><p>这里真正重要的不是“会调用下单接口”，而是这些保护：</p><ul><li>不要把账户可用资金全部扫进去，要预留现金和安全缓冲；</li><li>下单金额要向下取整到合规交易单位；</li><li>先用最小金额实盘验证委托数量、买卖方向、价格字段和手续费；</li><li>用当日唯一备注、当日委托查询和内存状态一起防止重复下单；</li><li>区分“已触发”“已提交”“已成交”“已失败”，不要把提交请求当成成交结果；</li><li>接入通知，让资金不足、利率过低、委托失败、部分成交等情况都能被看见；</li><li>默认开启模拟模式，稳定后再逐步提高最大交易金额。</li></ul><p>自动交易最怕的不是程序不会下单，而是程序太会下单。现金管理工具应该追求可靠，而不是聪明。</p><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>券商自动逆回购功能并不是不好。它的本质是：用户用额外服务费，换取无需开发、无需维护、无需每天记得操作。</p><p>低频使用时，这个交换很合理。每 10 万元一年可能只多花几元到几十元。</p><p>但如果每天都做一天期逆回购，额外费用会持续发生。按 240 个交易日估算，每 10 万元一年可能比手动多付 480 到 600 元；100 万元则可能多付 4,800 到 6,000 元。</p><p>所以我的选择是：如果本来没有自动化环境，就用券商功能省心；如果已经有 QMT、Python 和通知系统，就自己做，把这笔交易摩擦降下来。</p><p>国债逆回购本身只是一个很小的功能，但它背后是同一个问题：交易收益不只来自判断，也来自减少不必要的摩擦。能省下来的服务费、能记录下来的执行链路、能提前拦住的异常，最后都会变成系统的一部分。</p><hr><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol><li><p>迅投 QMT 内置 Python 知识库，<code>ContextInfo.run_time()</code> 定时器及 Python API 说明：<br><a href="https://docs.thinktrader.net/vip/QMT/">https://docs.thinktrader.net/vip/QMT/</a></p></li><li><p>迅投系统函数文档，<code>ContextInfo.run_time()</code>：<br><a href="https://dict.thinktrader.net/innerApi/system_function.html">https://dict.thinktrader.net/innerApi/system_function.html</a></p></li><li><p>迅投 QMT 官方网站：<br><a href="https://www.thinktrader.net/">https://www.thinktrader.net/</a></p></li><li><p>平安证券投资者教育页面，国债逆回购手续费示例：一天期每 10 万元收取 1 元：<br><a href="https://m.stock.pingan.com/omm/mobile/zixun/m.html?adid=1000000000007387&id=1000016796&infid=1000016797">https://m.stock.pingan.com/omm/mobile/zixun/m.html?adid=1000000000007387&amp;id=1000016796&amp;infid=1000016797</a></p></li><li><p>证券时报关于国债逆回购费用和计息规则的报道：<br><a href="https://stcn.com/article/detail/1504170.html">https://stcn.com/article/detail/1504170.html</a></p></li><li><p>上交所关于 2017 年 5 月 22 日开始实施债券质押式回购新规的说明，提到全年计息天数从 360 天改为 365 天，并按资金实际占款天数计息：<br><a href="https://www.sse.com.cn/aboutus/mediacenter/hotandd/c/c_20170519_4313753.shtml">https://www.sse.com.cn/aboutus/mediacenter/hotandd/c/c_20170519_4313753.shtml</a></p></li><li><p>深交所《债券交易实施细则》相关公式中，回购购回价按实际占款天数 &#x2F; 365 计算：<br><a href="https://docs.static.szse.cn/www/disclosure/notice/W020210512409004773670.pdf">https://docs.static.szse.cn/www/disclosure/notice/W020210512409004773670.pdf</a></p></li><li><p>本文中的券商自动服务费率、自动撤单和最低委托利率说明，来自作者账户内券商功能页面截图。不同券商和账户可能不同。</p></li></ol><style>.repo-screenshot-grid {  display: grid;  grid-template-columns: repeat(2, minmax(0, 1fr));  gap: 18px;  margin: 24px 0 30px;}.repo-screenshot-card {  margin: 0;  border: 1px solid #e5e7eb;  border-radius: 8px;  overflow: hidden;  background: #f8fafc;}.repo-screenshot-card a {  display: block;  height: 560px;  background: #f3f4f6;}.repo-screenshot-card img {  width: 100%;  height: 100%;  object-fit: cover;  display: block;}.repo-screenshot-card--blue img {  object-position: 50% 43%;}.repo-screenshot-card--red img {  object-position: 50% 36%;}.repo-screenshot-card figcaption {  padding: 12px 14px 14px;  color: #4b5563;  font-size: 14px;  line-height: 1.65;  background: #fff;  border-top: 1px solid #e5e7eb;}.repo-screenshot-card figcaption strong {  display: block;  margin-bottom: 2px;  color: #111827;  font-size: 15px;}@media (max-width: 760px) {  .repo-screenshot-grid {    grid-template-columns: repeat(2, minmax(0, 1fr));    gap: 10px;  }  .repo-screenshot-card a {    height: 330px;  }  .repo-screenshot-card figcaption {    padding: 9px 8px 10px;    font-size: 12px;    line-height: 1.5;  }  .repo-screenshot-card figcaption strong {    font-size: 13px;  }}</style>]]></content>
    
    
    <summary type="html">这篇文章记录我为什么没有直接使用券商自带的国债逆回购自动下单功能，而是用 QMT 和 Python 自己做自动化。核心原因很简单：如果每天用 10 万元做一天期逆回购，部分券商自动功能一年可能要多付 480 到 600 元服务费。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="国债逆回购" scheme="https://corvo.myseu.cn/tags/%E5%9B%BD%E5%80%BA%E9%80%86%E5%9B%9E%E8%B4%AD/"/>
    
    <category term="自动交易" scheme="https://corvo.myseu.cn/tags/%E8%87%AA%E5%8A%A8%E4%BA%A4%E6%98%93/"/>
    
    <category term="资金管理" scheme="https://corvo.myseu.cn/tags/%E8%B5%84%E9%87%91%E7%AE%A1%E7%90%86/"/>
    
    <category term="券商" scheme="https://corvo.myseu.cn/tags/%E5%88%B8%E5%95%86/"/>
    
  </entry>
  
  <entry>
    <title>记一次诡异的 K3s DNS 报错排查：当 K3s 遇上飞牛 NAS</title>
    <link href="https://corvo.myseu.cn/2026/03/31/2026-03-31-%E4%B8%80%E6%AC%A1%E8%AF%A1%E5%BC%82%E7%9A%84K3s%E4%B8%ADDNS%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5/"/>
    <id>https://corvo.myseu.cn/2026/03/31/2026-03-31-%E4%B8%80%E6%AC%A1%E8%AF%A1%E5%BC%82%E7%9A%84K3s%E4%B8%ADDNS%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5/</id>
    <published>2026-03-31T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>在 Kubernetes 的日常排障中，网络问题往往最耗时间。这次我在飞牛 NAS 上用 Docker 跑了一个 K3s（单节点 master），准备给 CI 跑 <a href="https://github.com/dag-andersen/argocd-diff-preview">argocd-diff-preview</a>。结果 Argo CD 部署完成后一直报 DNS 解析失败，日志里看起来像“在 Pod 里用 localhost 查 DNS”，非常反直觉。</p><p>最后定位到的根因也很“隐形”：宿主机目录的 Default ACL 影响了 containerd 为 Pod 生成并挂载的 resolv.conf，导致非 root 容器无法读取 <code>/etc/resolv.conf</code>，从而触发了 libc resolver 的兜底逻辑，盲目向 <code>127.0.0.1/[::1]:53</code> 发起查询。</p><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我本地用 Argo CD 管理和发布应用。这次想引入 <a href="https://github.com/dag-andersen/argocd-diff-preview">argocd-diff-preview</a> 做 CI 检查，把 diff 结果作为 GitHub 评论回写到 PR。</p><p>效果大概是这样：</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/31/1774962665949.png" alt="1774962665949.png"></p><p>为了跑这类任务，我需要一个轻量的 Kubernetes 集群。正好手头有飞牛 NAS，就在上面用 Docker 起了一个 K3s server（禁用 <code>servicelb</code>），docker-compose 如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&quot;3.8&quot;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">argocd-k3s:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">k3s:v1.35.1-k3s1</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">argocd-k3s</span></span><br><span class="line">    <span class="attr">privileged:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">bridge</span>  <span class="comment"># 防止本机的 Docker 网络的 DNS 干扰</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;9444:6443&quot;</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;server&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--prefer-bundled-bin&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--disable=servicelb&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--node-name=argocd-k3s&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--kube-apiserver-arg=event-ttl=10m&quot;</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/vol1/1000/K3sData/argocd-k3s/data:/var/lib/rancher/k3s</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/dev:/dev:ro</span></span><br></pre></td></tr></table></figure><p>然后在 CI 里执行 <code>argocd-diff-preview</code> 时就开始报错：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">argocd-diff-preview  \</span><br><span class="line">    --create-cluster=False --keep-cluster-alive  \</span><br><span class="line">    -d  \</span><br><span class="line">    --argocd-chart-url <span class="variable">$&#123;chart_url&#125;</span> \</span><br><span class="line">    --repo <span class="variable">$&#123;repo&#125;</span> \</span><br><span class="line">    --target-branch <span class="variable">$&#123;env.CHANGE_BRANCH&#125;</span> \</span><br><span class="line">    --argocd-chart-name argocd-apps</span><br><span class="line"></span><br><span class="line">Tue, 31 Mar 2026 12:42:20 UTC DBG AppsetGenerateWithRetry attempt 1/5 to Argo CD...</span><br><span class="line">Tue, 31 Mar 2026 12:42:21 UTC DBG Waiting 1s before next appset generate attempt (2/5)...</span><br><span class="line">Tue, 31 Mar 2026 12:42:21 UTC WRN Appset generate attempt 1/5 failed. error=<span class="string">&quot;failed to run argocd appset generate: argocd command failed: &#123;\&quot;level\&quot;:\&quot;fatal\&quot;,\&quot;msg\&quot;:\&quot;rpc error: code = Internal desc = unable to resolve git revision : failed to list refs: dial tcp: lookup argocd-redis on [::1]:53: read udp [::1]:59984-\\u003e[::1]:53: read: connection refused\&quot;,\&quot;time\&quot;:\&quot;2026-03-31T12:42:21Z\&quot;&#125;\n: exit status 20&quot;</span></span><br></pre></td></tr></table></figure><h2 id="现象：Pod-里用-1-53-查-DNS"><a href="#现象：Pod-里用-1-53-查-DNS" class="headerlink" title="现象：Pod 里用 [::1]:53 查 DNS"></a>现象：Pod 里用 [::1]:53 查 DNS</h2><p>Argo CD 无法正常同步应用。查看 <code>argocd-server</code> 日志，发现大量类似报错：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Failed to resync revoked tokens... dial tcp: lookup argocd-redis on [::1]:53: read udp [::1]:34952-&gt;[::1]:53: read: connection refused</span><br></pre></td></tr></table></figure><p>第一眼看到这个日志，我的反应是：为什么 Pod 内部会用 IPv6 的本地环回地址（<code>[::1]</code>）去查 DNS？</p><p>按常规思路我先检查 CoreDNS，但 CoreDNS 运行完全正常。这就更怪了：<code>dnsPolicy: ClusterFirst</code> 的 Pod，理论上应该把查询发给 CoreDNS（例如 <code>10.43.0.10</code>），而不是对着本地 <code>53</code> 端口重试。</p><h2 id="排查：从-etc-resolv-conf-入手"><a href="#排查：从-etc-resolv-conf-入手" class="headerlink" title="排查：从 /etc/resolv.conf 入手"></a>排查：从 <code>/etc/resolv.conf</code> 入手</h2><p>既然外部看不出问题，就直接进入容器确认 DNS 配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl -n argocd <span class="built_in">exec</span> -ti argocd-server-fbbdf5d4d-c8z5q -- /bin/bash</span><br></pre></td></tr></table></figure><p>然后查看 <code>/etc/resolv.conf</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">argocd@argocd-server:~$ <span class="built_in">cat</span> /etc/resolv.conf</span><br><span class="line"><span class="built_in">cat</span>: /etc/resolv.conf: Permission denied (os error 13)</span><br></pre></td></tr></table></figure><p>到这里基本就能解释日志了：应用进程读不到 <code>/etc/resolv.conf</code>，就拿不到 nameserver 配置。</p><p>在这种情况下，libc resolver 会走兜底逻辑，直接尝试向本地 <code>localhost</code>（<code>127.0.0.1</code> 和 <code>[::1]</code>）发 DNS 查询；如果本地没有 DNS 服务监听 <code>53</code> 端口，就会出现 <code>connection refused</code>。</p><p>所以这并不是 IPv6 本身的问题，而是容器“看不见”正确的 nameserver。</p><h2 id="根因：文件权限末尾的-“-”（ACL）"><a href="#根因：文件权限末尾的-“-”（ACL）" class="headerlink" title="根因：文件权限末尾的 “+”（ACL）"></a>根因：文件权限末尾的 “+”（ACL）</h2><p>继续用 <code>ls -l</code> 看权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">argocd@argocd-server:~$ <span class="built_in">ls</span> -alh /etc/resolv.conf </span><br><span class="line">-rw-r-----+ 1 root root 102 Mar 31 11:56 /etc/resolv.conf</span><br></pre></td></tr></table></figure><p>我把这里的内容帖给 AI 之后, 它就提到了 ACL 问题：</p><p>注意权限末尾的 <code>+</code>：这表示该文件启用了 ACL（Access Control List）。即使基础权限看起来没问题，ACL 也可能额外收紧“其他用户（other）”的权限。由于 Argo CD 默认以非 root 用户（例如 UID 999）运行，它就会被挡在门外。</p><p><code>/etc/resolv.conf</code> 不是镜像里的文件，而是运行时挂载进来的。为了确认它在宿主机上对应哪个文件，我回到宿主机用 <code>crictl inspect</code> 查了容器挂载信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">~ <span class="comment"># crictl ps  # 找到 argocd-server 容器的 ID</span></span><br><span class="line">CONTAINER           IMAGE               CREATED             STATE               NAME                     ATTEMPT             POD ID              POD                                       NAMESPACE</span><br><span class="line">c2722b3817277       86219ff1fefea       2 seconds ago       Running             argocd-server                      3                   d32169958ed68       argocd-server-fbbdf5d4d-tjsnf                       argocd</span><br><span class="line"></span><br><span class="line">~ <span class="comment"># crictl inspect &lt;container_id&gt;  # 查看 /etc/resolv.conf 的真实 source</span></span><br><span class="line"><span class="comment"># &#123;</span></span><br><span class="line"><span class="comment">#   &quot;destination&quot;: &quot;/etc/resolv.conf&quot;,</span></span><br><span class="line"><span class="comment">#   &quot;options&quot;: [</span></span><br><span class="line"><span class="comment">#     &quot;rbind&quot;,</span></span><br><span class="line"><span class="comment">#     &quot;rprivate&quot;,</span></span><br><span class="line"><span class="comment">#     &quot;ro&quot;</span></span><br><span class="line"><span class="comment">#   ],</span></span><br><span class="line"><span class="comment">#   &quot;source&quot;: &quot;/var/lib/rancher/k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/fd2373cfd801e2f95267286af155df3ca0cd912563bc9a668cc5e1b3a4956d3e/resolv.conf&quot;,</span></span><br><span class="line"><span class="comment">#   &quot;type&quot;: &quot;bind&quot;</span></span><br><span class="line"><span class="comment"># &#125;</span></span><br><span class="line"></span><br><span class="line">~ <span class="comment"># cat /var/lib/rancher/k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/fd2373cfd801e2f95267286af155df3ca0cd912563bc9a668cc5e1b3a4956d3e/resolv.conf</span></span><br><span class="line">search argocd.svc.cluster.local svc.cluster.local cluster.local</span><br><span class="line">nameserver 10.43.0.10</span><br><span class="line">options ndots:5</span><br></pre></td></tr></table></figure><p>由于我的 K3s 数据目录在 <code>/vol1/1000/K3sData</code>（NAS 挂载盘）上，顺着这个路径找过去，再用 <code>getfacl</code> 查看 ACL：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@Host:~# getfacl /vol1/.../sandboxes/.../resolv.conf</span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rw-</span><br><span class="line">group::--x</span><br><span class="line">other::---  &lt;--- 真凶在这里！</span><br></pre></td></tr></table></figure><p>真相大白：<code>/vol1</code> 这类 NAS 挂载盘默认可能带有严格的 Default ACL。当 containerd 在这个目录下为 Pod 动态生成 <code>resolv.conf</code> 时，会继承父目录的 Default ACL，把 <code>other</code> 权限收紧为 <code>---</code>。Pod 里的非 root 进程就无法读取 <code>/etc/resolv.conf</code>，从而触发“查 localhost DNS”的兜底行为。</p><h2 id="解决方案：清理-Default-ACL-继承规则"><a href="#解决方案：清理-Default-ACL-继承规则" class="headerlink" title="解决方案：清理 Default ACL 继承规则"></a>解决方案：清理 Default ACL 继承规则</h2><p>我最终没有改 K3s 配置，也没有去关闭整块盘的 ACL（这通常会影响 Samba 等服务）。更稳妥的做法是：只清理 K3s&#x2F;containerd 工作目录上导致继承的 Default ACL 规则。</p><p>在宿主机执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 清除沙盒目录上导致问题的 Default ACL 遗传规则</span></span><br><span class="line"><span class="built_in">sudo</span> setfacl -k /vol1/1000/K3sData/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. (可选) 给当前存在的目录批量重置基础权限</span></span><br><span class="line"><span class="built_in">sudo</span> setfacl -R -b /vol1/1000/K3sData/</span><br></pre></td></tr></table></figure><p>做完后把 Argo CD 的 Pod 删掉让它重建。新的 Pod 启动后，containerd 生成的 <code>resolv.conf</code> 恢复为正常的可读权限；再进入容器执行 <code>cat /etc/resolv.conf</code> 也不再报 <code>Permission denied</code>。至此，Argo CD 立刻恢复正常，应用也能正常 Sync。</p><h3 id="自动持久化：使用-tmpfiles-d-进阶方案"><a href="#自动持久化：使用-tmpfiles-d-进阶方案" class="headerlink" title="自动持久化：使用 tmpfiles.d (进阶方案)"></a>自动持久化：使用 tmpfiles.d (进阶方案)</h3><p>如果你担心 NAS 系统在重启或通过 Web UI 操作后会重新“遗传”错误的 ACL 规则，可以使用 systemd 的 <code>tmpfiles.d</code> 机制。这是一种比 Crontab 脚本更优雅的“声明式”配置。</p><p>在宿主机创建配置文件 <code>/etc/tmpfiles.d/k3s-nas-acl.conf</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># 确保目录及其子目录基础权限为 0755</span><br><span class="line"># 类型  路径                   模式  用户  组    时间  参数</span><br><span class="line">z     /vol1/1000/K3sData/     0755  root  root  -     -</span><br><span class="line"></span><br><span class="line"># 递归强制应用规则：确保 others 可读，且新生成的子项也继承该权限</span><br><span class="line">A+    /vol1/1000/K3sData/     -     -     -     -     other::r-x,default:other::r-x</span><br></pre></td></tr></table></figure><p>配置完成后，可以执行以下命令立即生效（无需重启）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemd-tmpfiles --create /etc/tmpfiles.d/k3s-nas-acl.conf</span><br></pre></td></tr></table></figure><p>系统会扫描该路径，并按照配置自动纠正所有不符合要求的 ACL 项。</p><h2 id="总结与避坑指南"><a href="#总结与避坑指南" class="headerlink" title="总结与避坑指南"></a>总结与避坑指南</h2><ul><li>别被 <code>[::1]:53</code> 误导：Pod 内查 localhost DNS，优先检查是否能读取 <code>/etc/resolv.conf</code>。</li><li>留意非 root 容器：越来越多组件默认非 root 运行，宿主机生成&#x2F;挂载的文件必须保证“other 可读”或至少对应用用户可读。</li><li>小心 NAS 默认 ACL：在 NAS 挂载盘上跑 K3s&#x2F;Docker 时，<code>ls -l</code> 权限末尾的 <code>+</code> 往往是权限问题的信号；遇到诡异现象优先用 <code>getfacl</code> 定位。</li><li>AI 真的太强大了, 问对合适的问题, 能让调试更高效。</li></ul><p>希望这次记录能给你一个更快的排查切入点。</p>]]></content>
    
    
    <summary type="html">在飞牛 NAS 上用 Docker 跑 K3s，部署 Argo CD 后 Pod 解析服务名却去查 [::1]:53。根因是宿主机目录的 Default ACL 影响了 containerd 生成的 resolv.conf，导致非 root 容器读不到 /etc/resolv.conf。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Docker" scheme="https://corvo.myseu.cn/tags/Docker/"/>
    
    <category term="Kubernetes" scheme="https://corvo.myseu.cn/tags/Kubernetes/"/>
    
    <category term="K3s" scheme="https://corvo.myseu.cn/tags/K3s/"/>
    
    <category term="DNS" scheme="https://corvo.myseu.cn/tags/DNS/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="containerd" scheme="https://corvo.myseu.cn/tags/containerd/"/>
    
  </entry>
  
  <entry>
    <title>半自动化交易系统（六）</title>
    <link href="https://corvo.myseu.cn/2026/03/26/2026-03-26-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%85%AD)/"/>
    <id>https://corvo.myseu.cn/2026/03/26/2026-03-26-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%85%AD)/</id>
    <published>2026-03-26T20:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<hr><p>本文是交易系统系列的第六篇，主要记录近期在期权策略和系统功能上的优化。我把一部分组合功能做了整合，重点是我常用的牛市价差；另外，也把出错订单单独记录下来，方便后续复盘和优化。</p><h2 id="组合订单的实现"><a href="#组合订单的实现" class="headerlink" title="组合订单的实现"></a>组合订单的实现</h2><p>如前文《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》所述，我目前主要做科创50ETF期权的价差策略。单一标的的好处是，页面和流程都能做得更聚焦、更高效。在上一篇《<a href="https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/">半自动化交易系统(五)</a>》里，我提到过按月份做持仓管理。每个月的仓位，基本都由单腿期权和比例价差这类组合构成。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180027632.png" alt="1767180027632.png"></p><p>我发现自己高频会用到价差组合的构建和释放。比如创建一个价差时，每次都要做这三步：</p><ol><li>买入低行权价看涨期权</li><li>卖出高行权价看涨期权</li><li>构建价差组合</li></ol><h3 id="实现细节"><a href="#实现细节" class="headerlink" title="实现细节"></a>实现细节</h3><p>这个过程完全可以自动化，而且能尽量规避短时价格波动。流动性足够好的时候，滑点也能控制在可接受范围内。所以我把这三个步骤整合成了一个独立服务，做成了一个非常简单的组合订单，结构大概如下：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;buy_open_with_executor&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;10011349.SHO&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;count&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;price&quot;</span><span class="punctuation">:</span> <span class="number">0.0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;wait&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">30.0</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;买入权利仓: 10011349.SHO x 6&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sell_open_with_executor&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;10011350.SHO&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;count&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;price&quot;</span><span class="punctuation">:</span> <span class="number">0.0</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;wait&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">30.0</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;卖出义务仓: 10011350.SHO x 6&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;method_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;make_option_combination&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;params&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;combination_type&quot;</span><span class="punctuation">:</span> <span class="number">50</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;contracts&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;10011349.SHO&quot;</span><span class="punctuation">:</span> <span class="number">48</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;10011350.SHO&quot;</span><span class="punctuation">:</span> <span class="number">49</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;quantity&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;strategy_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;认购牛市价差 1.4-1.45&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;status&quot;</span><span class="punctuation">:</span> <span class="string">&quot;completed&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;创建组合: 认购牛市价差 1.4-1.45&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><p>这类指令会被放进消息队列，由单独服务消费，再直接和交易系统交互。我这里为了尽快成交，直接挂对手方一档。科创50ETF期权流动性本身也不错，通常几秒内就能完成交易，实际滑点非常小，执行效率和质量都比较高。</p><p>注意：这里用的是对手方一档，也就是优先保证立刻成交的价格。如果合约流动性不好，这样做风险会很高，利润空间也会被明显压缩。</p><h3 id="组合订单的管理"><a href="#组合订单的管理" class="headerlink" title="组合订单的管理"></a>组合订单的管理</h3><p>现在 AI 写代码确实很好用。需求说清楚后，页面雏形很快就能出来；我自己再把前后端对接和细节收一收，基本就可以快速上线。下面是组合订单管理页面的截图：</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774533798939.png" alt="1774533798939.png"></p><p>我还加了出错订单的“分步骤重试”能力。卡在哪一步都没关系，人肉检查一下，确认没问题就从下一步继续执行。后面如果再接 AI 做检查，会更省事。甚至当开仓单子很多时，也能靠这种组合订单形式批量处理，operator 在开平仓上的手工工作量会小很多。</p><h3 id="价差移仓"><a href="#价差移仓" class="headerlink" title="价差移仓"></a>价差移仓</h3><p>做完这套组合订单后，我开始更系统地思考一个问题：不同月份之间平移牛市价差，成本到底有多高，以及是否值得移仓。比如我持有的是由虚值看涨构成的牛市价差，如果当月机会已经不大，那把整个组合顺延一个月，盈利概率会不会更好？</p><p>因此我也做了一个图表，持续记录我关注的价差在不同月份的价格，用来评估“为了维持盈利机会，我需要支付多少移仓成本”。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774534300695.png" alt="1774534300695.png"></p><p>只要合约时间价值没有被完全吃掉，移仓成本通常都比较低，大多数情况下在 100 元以内。也就是说，花不超过 100 元，通常就能把一个临近到期的价差组合平移到后一个月，或者换到更低行权价，从而明显提升盈利概率。如果再叠加后续可卖出的单腿期权，这项成本并不高，但对胜率和收益改善很明显。</p><h2 id="订单记录"><a href="#订单记录" class="headerlink" title="订单记录"></a>订单记录</h2><p>股票交易的订单记录相对简单，因为频率低。但期权不一样，一天几十单并不夸张。所以我想把订单“日历化”，方便后续分析交易习惯和月度盈亏。于是我也做了一个订单记录页面，直接落每一笔订单的细节。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/03/26/1774534653930.png" alt="1774534653930.png"></p><p>其中绿色块表示交易日。点进某一天，就能看到当天全部订单及状态，这样交易习惯会非常直观。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>我一直把期权看成一种“给市场打工”的工具。只要愿意做风险可控的套利，就有机会在这个市场里持续、稳定地赚钱。这和股票不太一样，股票很多时候要同时承受系统性风险和个股风险。</p><p>这篇文章里介绍的组合订单功能，本质上就是为了更高效地执行价差策略和移仓操作，让我能更稳定地“在市场里打工赚钱”。你也能看到，我的大多数期权操作并不依赖方向预测。市场按预期走会赚得更多；不按预期走，也不至于失控，我依然保留下一月份继续操作的权利。</p><p>另外，我做这些事情的目标也很明确：把操作流程标准化，最后交给其他人或 AI 去执行。</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第六篇，主要介绍近期在期权策略和系统功能上的优化和改进。我将部分组合功能进行了整合, 尤其是针对我常用的牛市价差。另外，我还把出错订单单独记录了下来，便于后续分析和优化。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>假期前的对冲保险：我为什么选ETF期权</title>
    <link href="https://corvo.myseu.cn/2026/02/12/2026-02-12-%E5%81%87%E6%9C%9F%E5%89%8D%E7%9A%84%E5%AF%B9%E5%86%B2%E4%BF%9D%E9%99%A9/"/>
    <id>https://corvo.myseu.cn/2026/02/12/2026-02-12-%E5%81%87%E6%9C%9F%E5%89%8D%E7%9A%84%E5%AF%B9%E5%86%B2%E4%BF%9D%E9%99%A9/</id>
    <published>2026-02-12T15:32:41.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>最近半年我一直在研究期权，特别是从卖方的角度来理解期权生意。久而久之，我发现了一个本质的认识：**期权交易的本质是一种”保险业务”**。卖方通过承担波动风险来获取权利金，本质和经营保险没有区别。既然是生意，就需要根据市场环境不断调整策略。</p><p>说起市场环境，春节和国庆这样的长假期间确实特殊。市场在假期前后往往会经历较大波动——一方面投资者在假期前主动调整仓位；另一方面，假期期间可能发生的突发事件会直接冲击开市后的行情。我看到很多人的策略是”持币过节”，用现金来规避不确定性。但这对我来说不太适合，因为我的持仓是一套非常长期构建的资产配置，不想简单地为了过个假期就破坏这个结构。于是我开始思考：有没有更精致的方式，在不破坏持仓的前提下，来对冲假期的风险？</p><p>我的投资组合核心是高分红的大市值股票，辅以一些成长股和小盘股。这个组合的风格与上证50相当接近，所以在本次分析中，我用上证50作为模型。这样做也是为了简化问题——我对冲的是整体市场风险（用指数来代表），而不是逐只考虑每只股票的波动。</p><h1 id="问题定义"><a href="#问题定义" class="headerlink" title="问题定义"></a>问题定义</h1><p>我想要在假期前构建一个”保险机制”：既能保护投资组合免受假期市场冲击（主要是下跌预期），又不用破坏现有的持仓结构。</p><p>我的股票持仓规模约60万元。虽然不是大资金，但这正好是一个很有代表性的规模——足够大到需要认真对待风险，又小到需要精打细算成本。</p><p>接下来，我会从<strong>期货</strong> 和 <strong>期权</strong>两个维度分别分析，看看哪种工具最适合这个特定的问题。</p><h1 id="对冲选择"><a href="#对冲选择" class="headerlink" title="对冲选择"></a>对冲选择</h1><h2 id="股指期货"><a href="#股指期货" class="headerlink" title="股指期货"></a>股指期货</h2><h3 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h3><p>期货是一种标准化合约：规定在未来某个时间以约定的价格交割某资产。它本身是中立的工具——既可以对冲风险，也可以用来投机。</p><p>具体到对冲：如果我担心假期后市场下跌，我可以<strong>卖出</strong>期货合约来”锁定”当前价格。这样一来，即使股票跌了，期货的盈利就会抵消股票的亏损。听起来很完美，但问题在于——期货需要保证金，而且一旦市场大幅波动，会面临”追加保证金”的风险。</p><h3 id="对我的现实约束"><a href="#对我的现实约束" class="headerlink" title="对我的现实约束"></a>对我的现实约束</h3><p>上证50期货合约的规格：</p><ul><li>每点300元的乘数</li><li>最近的合约价格约3100点</li><li><strong>一手能对冲约90万市值</strong></li><li><strong>需要约15万的保证金</strong></li></ul><p>这就立刻产生了一个现实问题：我有60万持仓，但账户里不可能闲置15万来”冻结”在保证金上（这15万相当于25%的账户被”冰冻”）。对于我这个量级的资金，期货的保证金成本太高了。</p><p>这个工具对于<strong>资产量在几千万以上</strong>的投资者是合适的，但对我目前的情况来说，不划算。</p><p>参考：<a href="http://www.cffex.com.cn/sz50/">CFFEX 上证50期货</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771145393046.png" alt="1771145393046.png"></p><h2 id="股指期货期权"><a href="#股指期货期权" class="headerlink" title="股指期货期权"></a>股指期货期权</h2><h3 id="原理-1"><a href="#原理-1" class="headerlink" title="原理"></a>原理</h3><p>期权是建立在期货基础之上的。如果说期货是”必须交割”的合约，那么期权就是”可以选择交割”的权利。期权赋予持有者在未来某个时间以约定价格买入（Call）或卖出（Put）某资产的<strong>权利</strong>，但没有义务。</p><p>这一点很关键：期权的非线性特征意味着它天然适合做对冲。我只需要为这份”权利”付出权利金，而不需要准备大额的保证金。</p><p>具体到上证50期货期权：</p><ul><li>每点100元的乘数（比期货少）</li><li>最近价格约3100点</li><li><strong>一张能对冲约30万市值</strong></li><li><strong>权利金成本约4000~6000元</strong></li><li><strong>买方不需要保证金</strong></li></ul><p>看起来理想多了，但我咨询了券商的客户经理后，遇到了一个隐藏的门槛：<strong>账户需要至少50万的闲置资金才能开通</strong>。而我的60万基本都在另一个期权账户持仓里，根本没有这笔”闲置资金”来满足开户要求。</p><p>这个方案对于<strong>资产在几百万级别</strong>的投资者很适合，但对我的现状来说，又卡在了准入条件上。</p><p>参考：<a href="http://www.cffex.com.cn/sz50gzqq/">CFFEX 上证50股指期货期权</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771145732477.png" alt="1771145732477.png"></p><h2 id="ETF期权（最终方案）"><a href="#ETF期权（最终方案）" class="headerlink" title="ETF期权（最终方案）"></a>ETF期权（最终方案）</h2><h3 id="原理-2"><a href="#原理-2" class="headerlink" title="原理"></a>原理</h3><p>上证50ETF是一只标准化的ETF基金，它跟踪上证50指数。与期货期权的区别在于——它不是虚拟的指数合约，而是真实存在的<strong>可交易股票</strong>。</p><p>正因为这个特性，上证50ETF期权的准入门槛低得多。</p><h3 id="规格对比"><a href="#规格对比" class="headerlink" title="规格对比"></a>规格对比</h3><table><thead><tr><th></th><th>单位市值</th><th>权利金成本</th><th>准入门槛</th></tr></thead><tbody><tr><td><strong>ETF期权</strong></td><td>约3万</td><td>400~600元</td><td>低（适合我）</td></tr></tbody></table><p>每个合约对应100手ETF（即1万股），权利金成本相对较低。重要的是——券商对这个品种没有设置额外的”闲置资金”要求，我可以直接用交易账户操作。</p><p>这意味着我可以<strong>灵活调整对冲力度</strong>。比如，我可以买10~20张看跌期权，既能覆盖大部分的对冲需求（10张 × 3万 &#x3D; 30万；我只需要覆盖60万），又不用过度对冲浪费成本。</p><p>权利金成本估算：假设每张500元，对冲10张所需成本仅为5000元，相当于我总持仓的0.8%。这个成本对于对冲假期风险来说，是可以接受的。</p><p>参考：<a href="https://www.sse.com.cn/assortment/options/contract/c/c_20230303_5717359.shtml">SSE 上证50ETF期权合约</a></p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771147574405.png" alt="1771147574405.png"></p><p><strong>结论：这是我最终的选择</strong>。它很好地平衡了对冲效果和成本效率，而且准入条件完全符合我的现状。</p><h1 id="期权合约具体选择"><a href="#期权合约具体选择" class="headerlink" title="期权合约具体选择"></a>期权合约具体选择</h1><p>既然选定了ETF期权作为对冲工具，接下来就是<strong>如何选择合约</strong>。主要需要决策的细节有三个：</p><h2 id="合约到期日的选择"><a href="#合约到期日的选择" class="headerlink" title="合约到期日的选择"></a>合约到期日的选择</h2><p>以2026年春节为例：</p><ul><li>2月13日是假期前最后一个交易日</li><li>2月24日（假期后）才开市</li><li>2月份期权合约会在2月25日到期</li></ul><p>这里有个陷阱：如果选2月到期的合约，它会在假期<strong>结束后</strong>马上到期。这样一来，你从假期风险中”活下来”，但合约却立刻清算了，可能面临比较大的价差问题（bid-ask spread）。</p><p>更好的选择是<strong>3月到期的合约</strong>。它能覆盖真正的风险窗口（2月13日到2月24日），而且离到期日还有足够的时间，不用担心流动性变差的问题。</p><h2 id="买哪个行权价？"><a href="#买哪个行权价？" class="headerlink" title="买哪个行权价？"></a>买哪个行权价？</h2><p>有三种极端选择：</p><ol><li><strong>平值（ATM）</strong>：贴近当前股价的行权价，保险最充分，但保费最贵</li><li><strong>深度虚值</strong>：远离当前股价很远，保费很便宜，但保险效果形同虚设  </li><li><strong>虚值一档</strong>（理想中点）：成本和效果的平衡点</li></ol><p>我倾向于选<strong>虚值一档</strong>。这样既不会因为追求”完美对冲”而过度投入，也不会因为贪便宜而买不到真正的保障。再次提醒，这不是赌方向的投机——这里的目的就是”花合理的钱，买充分的保险”。</p><h2 id="为什么不通过卖Call来对冲？"><a href="#为什么不通过卖Call来对冲？" class="headerlink" title="为什么不通过卖Call来对冲？"></a>为什么不通过卖Call来对冲？</h2><p>有小伙伴也问过我：与其买Put，不如卖Call（看涨期权）来赚权利金，用这笔钱来”自我保险”？</p><p>这在数学上省钱，但<strong>引入了额外的风险</strong>：如果行情大涨，我的股票虽然赚钱了，但被套的Call会限制我的上涨空间。对冲的核心目的是<strong>风险中立</strong>，而不是用一个风险来抵消另一个风险。所以卖Call不是我的主要策略。</p><h2 id="执行记录"><a href="#执行记录" class="headerlink" title="执行记录"></a>执行记录</h2><p>回到2026年春节的实际操作。从2月9日（周一）开始，我开始用限价单逐日建仓。最终的持仓是：</p><ul><li><strong>卖出2张看涨期权（Call）</strong>：小额的反向操作，用来微调</li><li><strong>买入6张看跌期权（Put）</strong>：核心对冲头寸</li></ul><p>这个配置覆盖了18万左右的名义市值（6 × 3万），相当于对我18万持仓做了保险覆盖。我其实想买10张Put，但是最后两天的合约太贵了，限价单没有成交。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771148565646.png" alt="1771148565646.png"></p><p>结果怎样呢？好消息是期权对冲本身已经赚钱了。坏消息是最后两个交易日大盘下跌明显，虽然对冲帮我减少了损失，但账户总体仍然缩水了。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/02/15/1771148884945.png" alt="1771148884945.png"></p><p>这就是现实：对冲的意义不在于”消除亏损”，而在于**”可控损失的规模”**。另外, 因为我的对冲只是针对长期不开盘的假期风险，所以对冲的效果也只能覆盖这个特定的风险窗口。假期结束后，我就会给期权平仓，这样一来一回的成本非常的低。</p><h1 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h1><p>这个案例实际上反映了一个很务实的问题：<strong>如何在有限的资本和约束条件下，做出最优的风险管理决策</strong>。</p><p>回顾整个推理过程：</p><ol><li><strong>定义问题</strong>：不是”如何完全消除风险”（不现实），而是”如何成本有效地对冲假期风险”</li><li><strong>评估工具</strong>：期货和两种期权都各有优势，但都有现实约束</li><li><strong>匹配方案</strong>：根据我的资金规模和账户条件，ETF期权是最合适的选择</li><li><strong>精细化执行</strong>：选择合理的合约规格、到期日和行权价</li></ol><p>对于不同量级的投资者，最优选择是不同的：</p><table><thead><tr><th>资产规模</th><th>推荐工具</th><th>关键约束</th></tr></thead><tbody><tr><td>&lt;10万</td><td>期权太贵</td><td>需考虑减仓或资产配置调整</td></tr><tr><td>60~300万</td><td>ETF期权（我的方案）</td><td>灵活高效，成本可控</td></tr><tr><td>300~几千万</td><td>期货期权或股指期货</td><td>准入门槛和保证金充足</td></tr><tr><td>几千万+</td><td>期货+更复杂组合</td><td>可做多腿对冲策略</td></tr></tbody></table><p>没有”完美”的对冲，都是权衡。核心是理解每个工具的<strong>本质、约束和成本</strong>，然后做出符合自己现状的选择。如这篇文章开头所说，这不仅涉及期权知识，更涉及如何在约束条件下做决策——这是做投资或经营生意的永恒主题。</p>]]></content>
    
    
    <summary type="html">春节长假期间，市场风险被放大。本文分享了我如何通过期货和期权两个工具的对比，在现实约束条件下，选择最适合自己的对冲方案。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="风险管理" scheme="https://corvo.myseu.cn/tags/%E9%A3%8E%E9%99%A9%E7%AE%A1%E7%90%86/"/>
    
    <category term="保险" scheme="https://corvo.myseu.cn/tags/%E4%BF%9D%E9%99%A9/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="期货" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E8%B4%A7/"/>
    
    <category term="ETF" scheme="https://corvo.myseu.cn/tags/ETF/"/>
    
  </entry>
  
  <entry>
    <title>个人财务模型与非对称机会</title>
    <link href="https://corvo.myseu.cn/2026/01/05/2026-01-05-%E9%9D%9E%E5%AF%B9%E7%A7%B0%E6%9C%BA%E4%BC%9A%E4%B8%8E%E4%B8%AA%E4%BA%BA%E8%B4%A2%E5%8A%A1%E6%A8%A1%E5%9E%8B/"/>
    <id>https://corvo.myseu.cn/2026/01/05/2026-01-05-%E9%9D%9E%E5%AF%B9%E7%A7%B0%E6%9C%BA%E4%BC%9A%E4%B8%8E%E4%B8%AA%E4%BA%BA%E8%B4%A2%E5%8A%A1%E6%A8%A1%E5%9E%8B/</id>
    <published>2026-01-05T20:32:41.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>最近在整理自己的财务笔记时，我发现这套体系已经形成了一个相对完整的框架。这篇文章不会讲那些让人肾上腺素飙升的暴富故事，而是想冷静地拆解一个问题：一个普通人如何从”出卖劳动力”一步步过渡到”依靠资产收租”。</p><p>这套体系的核心不在于追求市场的暴利，而在于承认一个朴素的事实：**财富积累往往伴随着枯燥的重复劳动。** 我试图理清从“出卖劳动力”到“拥有资产”之间，究竟存在怎样的转化机制。当然整篇文章的观点也仅仅是我个人的理解和实践经验，不构成任何投资建议。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/Xnip2026-01-08_22-48-39.jpg" alt="Xnip2026-01-08_22-48-39.jpg"></p><hr><h2 id="对现金流的抽象定义"><a href="#对现金流的抽象定义" class="headerlink" title="对现金流的抽象定义"></a>对现金流的抽象定义</h2><p>在构建这个模型的时候，我发现单纯盯着”收益率”这个数字其实意义不大。更重要的是先搞清楚”钱从哪里来”。我把现金流大致分为四类：</p><ol><li><strong>劳动（工资）</strong>：本质是出卖时间或技能。</li><li><strong>借贷（利息）</strong>：让渡资金的使用权。</li><li><strong>权益（分红）</strong>：作为资产所有者分享收益。</li><li><strong>保险（补偿）</strong>：这是模型中比较特殊的一环。</li></ol><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767886199100.png" alt="1767886199100.png"></p><h3 id="把自己当成”保险公司”"><a href="#把自己当成”保险公司”" class="headerlink" title="把自己当成”保险公司”"></a>把自己当成”保险公司”</h3><p>我把<strong>期权卖方（Selling Options）</strong>理解成一种”保险生意” 。当我卖出期权的时候，本质上是在承担市场波动的风险（让买方能睡个好觉），然后收取”权利金”作为保费 。</p><p>既然是生意，那就意味着它是一种<strong>劳动</strong> ，而不是躺着就能赚钱的被动收入。我需要持续投入时间和精力来维护这门生意 。目标也很明确：不去赌方向，而是像经营保险公司那样，通过提供流动性或对冲服务，稳健地赚取 <strong>10%-15%</strong> 的年化权利金 。</p><h3 id="关于“保险机制”的理解"><a href="#关于“保险机制”的理解" class="headerlink" title="关于“保险机制”的理解"></a>关于“保险机制”的理解</h3><p>保险的本质是用小保费对冲小概率大损失, 关键在于资本充足以承受极端赔付.在金融市场中, 我把卖期权视为一套<strong>“保险机制”</strong>: 作为卖方承担波动风险, 用权利金作为对价.前提是保证金&#x2F;底仓能够覆盖最坏情况, 否则就是用未来透支现在.它不是被动投资, 而是一门需要持续维护的生意; 目标是获取相对稳健的现金流, 而非追求暴利.对多数人而言, 与重资产创业相比, 这门“小保险业务”更轻、更可执行.</p><hr><h2 id="核心比喻：大楼与脚手架"><a href="#核心比喻：大楼与脚手架" class="headerlink" title="核心比喻：大楼与脚手架"></a>核心比喻：大楼与脚手架</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884662449.png" alt="1767884662449.png"></p><p>如果把财务自由比作盖一座大楼，这个模型的逻辑是这样的 ：</p><ul><li><strong>高分红股票（大楼本体）</strong>：这是最终目标。能提供真正的被动分红现金流，是将来可以”住”的地方。</li><li><strong>期权交易（脚手架）</strong>：这是加速工具。做卖方生意赚取额外现金流，用这些钱买更多股票（砖头），从而更快地把楼盖起来。</li><li><strong>打工收入（地基）</strong>：在楼盖起来之前，打工收入提供最基础的生存保障。</li></ul><p>这个顺序很重要：如果没有资产积累（没打地基）就直接去卖期权（搭架子），或者只搭架子不盖楼（纯投机），那就不是在做生意，而是在赌博 。</p><hr><h2 id="一条可执行的路线图"><a href="#一条可执行的路线图" class="headerlink" title="一条可执行的路线图"></a>一条可执行的路线图</h2><p>根据资金规模，我给自己规划了一条相对清晰的路径 [2]：</p><h3 id="第一阶段：生存期（10万以内）"><a href="#第一阶段：生存期（10万以内）" class="headerlink" title="第一阶段：生存期（10万以内）"></a>第一阶段：生存期（10万以内）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884691728.png" alt="1767884691728.png"></p><ul><li><strong>核心任务</strong>：保住饭碗，稳定工作收入。</li><li><strong>阶段特点</strong>：这是最基础的原始积累阶段。在还没有资产护城河的时候，<strong>工资是唯一靠得住的正向现金流</strong>。</li></ul><h3 id="第二阶段：建仓期（10万-50万）"><a href="#第二阶段：建仓期（10万-50万）" class="headerlink" title="第二阶段：建仓期（10万 - 50万）"></a>第二阶段：建仓期（10万 - 50万）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884707519.png" alt="1767884707519.png"></p><ul><li><strong>核心任务</strong>：建立根据地，积累底仓。</li><li><strong>具体操作</strong>：**”不管股价涨跌，持续买入积累股份”** 。</li><li><strong>底层逻辑</strong>：这个阶段是为了让你整体有个初步的框架, 也是为了验证你的水平.</li></ul><p>我们经常听说某个老板炒股亏了就是这种现象, 如果没法在股市里保住本金, 那么无论你在其他地方赚多少钱, 最终都会被市场收割掉.我建议一开始就要去尝试, 看看这条路是不是能走的下去. 通过长期的判断认清自己的水平, 以及对市场的理解.</p><h3 id="第三阶段：期权业务期（50万-500万）"><a href="#第三阶段：期权业务期（50万-500万）" class="headerlink" title="第三阶段：期权业务期（50万 - 500万）"></a>第三阶段：期权业务期（50万 - 500万）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884730399.png" alt="1767884730399.png"></p><ul><li><strong>核心任务</strong>：搭建脚手架，加速复利。</li><li><strong>具体操作</strong>：开始做期权卖方（Selling Options）。从市场这个”盆”里收权利金，然后把所有权利金再投入买股票。</li><li><strong>心理预期</strong>：即使只有 6% 的额外收益也算是加速。这会是一个漫长的过程，可能需要持续很多年。</li></ul><p>这个业务会让你在承担部分风险的情况下, 赚取相对稳健的现金流. 注意, 这里的核心是”稳健”, 而不是”暴利”.你需要接受这种”有限收益, 有限风险”的特性 。如果这个时候疯狂加杠杆, 可能爆一次仓就会导致自己亏损几个月积蓄。这里一定要清楚一件事, 你没有在躺赚, 你是在做生意, 你需要付出时间和精力去维护这个业务.</p><h3 id="第四阶段：拆除脚手架（500万-）"><a href="#第四阶段：拆除脚手架（500万-）" class="headerlink" title="第四阶段：拆除脚手架（500万+）"></a>第四阶段：拆除脚手架（500万+）</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884751769.png" alt="1767884751769.png"></p><ul><li><strong>核心任务</strong>：**”不想一直卖保险了”**。</li><li><strong>终局状态</strong>：当资产规模达到一定程度，分红已经能覆盖日常开销的时候，就可以停止那些消耗精力的期权操作，拆掉脚手架，回归单纯的资产持有状态 。这才是真正的自由——从”必须操作”中解放出来 。</li></ul><p>到这里后, 最好将这项业务关闭或是外包出去, 可以尽量自动化, 或者雇人进行期权操作, 不要再去自己做这个重复的过程了.这个时候你可以有选择去做你想做的事, 甚至有一些现金流可以开始赌一下某个项目了, 因为你已经有足够的资产保护你不会归零了.</p><p>重点: 这里的第二阶段和第三阶段是不可以颠倒的, 你必须先有足够的市场认知, 稳定的盈利手段, 才能去承担期权卖方的风险.</p><hr><h2 id="隐藏的门槛：其实是一本”修心手册”"><a href="#隐藏的门槛：其实是一本”修心手册”" class="headerlink" title="隐藏的门槛：其实是一本”修心手册”"></a>隐藏的门槛：其实是一本”修心手册”</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884822853.png" alt="1767884822853.png"></p><p>这套策略看起来挺简单的，但真要执行起来很难，因为它会不断挑战人性中的贪婪和恐惧。</p><h3 id="期权投资是一项保险生意"><a href="#期权投资是一项保险生意" class="headerlink" title="期权投资是一项保险生意"></a>期权投资是一项保险生意</h3><p>是生意就会有赚有赔, 请一定记住这一点. 就算你算的胜率是99%, 也不能保证你每次都能赚到钱.</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767885083036.png" alt="1767885083036.png"></p><h3 id="接受”慢”的节奏"><a href="#接受”慢”的节奏" class="headerlink" title="接受”慢”的节奏"></a>接受”慢”的节奏</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884842082.png" alt="1767884842082.png"></p><p>经常会有这样的疑问：”单纯囤股加卖期权是不是太慢了？”</p><p>我的想法是：<strong>与其追求暴利搞得寝食难安，不如用稳健的方式安心睡觉，把精力留给生活中更重要的事情</strong> 。</p><p>试图绕过积累阶段直接追求”快”，通常意味着要牺牲心态的平稳。如果为了多赚点权利金就把风险拉得很高，那这些工具反而会变成绞肉机 。</p><h3 id="接受平庸与机械重复"><a href="#接受平庸与机械重复" class="headerlink" title="接受平庸与机械重复"></a>接受平庸与机械重复</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884860814.png" alt="1767884860814.png"></p><p>这个模型本身就锁死了收益上限（期权卖方的封顶收益特性）。在牛市疯狂的时候，大概率会踏空，收益跑输那些赌单边的人。需要提前做好这种”相对剥夺感”的心理准备 。</p><p>另外，作为”保险业务员”，需要忍受长期的机械重复操作。<strong>能不能控制住自己，其实比懂不懂技术更关键</strong> 。</p><hr><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>这套”期权脚手架”模型，本质上是一套<strong>防御性的财务体系</strong> 。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884884831.png" alt="1767884884831.png"></p><p>如果控制不住恐惧和贪婪，比如喜欢追涨杀跌、盲目满仓，或者为了多赚权利金就不顾风险，那这些工具其实帮不了什么忙。这种情况下，<strong>老老实实打工攒钱</strong>反而是最明智的选择，至少工资这个正向现金流不会让人亏到归零 。</p><p>但对于那些能够控制住自己心性的人来说，这确实是一条通往”睡后收入”的相对稳健的路径。</p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/08/1767884904421.png" alt="1767884904421.png"></p><p><strong>脚手架终将拆除，唯有大楼屹立不倒。</strong></p>]]></content>
    
    
    <summary type="html">分享一套我正在执行的财务模型。它不追求暴富，而是通过承认“卖期权是做生意”这一本质，建立一套从出卖劳动力过渡到依靠资产收租的稳健路径。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="数学" scheme="https://corvo.myseu.cn/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="保险" scheme="https://corvo.myseu.cn/tags/%E4%BF%9D%E9%99%A9/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="经济" scheme="https://corvo.myseu.cn/tags/%E7%BB%8F%E6%B5%8E/"/>
    
    <category term="财务自由" scheme="https://corvo.myseu.cn/tags/%E8%B4%A2%E5%8A%A1%E8%87%AA%E7%94%B1/"/>
    
    <category term="现金流" scheme="https://corvo.myseu.cn/tags/%E7%8E%B0%E9%87%91%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>投资最重要的是别亏钱</title>
    <link href="https://corvo.myseu.cn/2026/01/01/2026-01-01-%E6%8A%95%E8%B5%84%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E5%88%AB%E4%BA%8F%E9%92%B1/"/>
    <id>https://corvo.myseu.cn/2026/01/01/2026-01-01-%E6%8A%95%E8%B5%84%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%E5%88%AB%E4%BA%8F%E9%92%B1/</id>
    <published>2026-01-01T15:32:41.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>巴菲特曾说过投资有两条铁律：第一条是永远不要亏钱；第二条是永远不要忘记第一条。</p><p>以前我只是把这句话当成一种“心态建设”，认为这只是在强调风险控制。但在深入研究了<strong>对数正态分布（Log-normal Distribution）</strong>模型后，我发现这句话其实有着极其冷酷且严密的数学底色。</p><p>为了方便直观理解，我编写了一个交互式的可视化工具，建议配合本文阅读：👉 <a href="https://compound-truth.corvofeng.workers.dev/">复利真相：对数正态分布实验室</a></p><hr><h2 id="1-从正态分布说起"><a href="#1-从正态分布说起" class="headerlink" title="1. 从正态分布说起"></a>1. 从正态分布说起</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259774945.png" alt="1767259774945.png"></p><p>在进入复杂的金融模型前，我们需要先理解自然界的基石——<strong>正态分布</strong>。</p><h3 id="高尔顿板：加法的视觉化"><a href="#高尔顿板：加法的视觉化" class="headerlink" title="高尔顿板：加法的视觉化"></a>高尔顿板：加法的视觉化</h3><p>想象一块布满交错钉子的板子，小球从顶端落下，每次碰到钉子都会随机向左或向右弹跳。这个物理过程本质上是<strong>随机步骤的累加</strong>。当小球足够多时，底部的堆积形状必然会呈现出完美的“钟形曲线”。</p><h3 id="中心极限定理-CLT"><a href="#中心极限定理-CLT" class="headerlink" title="中心极限定理 (CLT)"></a>中心极限定理 (CLT)</h3><p>这就是数学上的<strong>中心极限定理</strong>：大量相互独立、分布随机的变量，只要它们是<strong>相加（Summation）</strong>的关系，最终的加和一定会趋向于正态分布。</p><p>在加法的世界里，涨跌是对称的。如果你有 100 元，今天加 10 元，明天减 10 元，你还是 100 元。</p><hr><h2 id="2-投资收益的模型：乘法的陷阱"><a href="#2-投资收益的模型：乘法的陷阱" class="headerlink" title="2. 投资收益的模型：乘法的陷阱"></a>2. 投资收益的模型：乘法的陷阱</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259811434.png" alt="1767259811434.png"></p><p>然而，投资世界遵循的不是加法，而是<strong>乘法</strong>。</p><h3 id="累加-vs-累乘"><a href="#累加-vs-累乘" class="headerlink" title="累加 vs 累乘"></a>累加 vs 累乘</h3><p>你的财富增长不是 $P_0 + r_1 + r_2$，而是：$$P_t &#x3D; P_0 \times (1 + r_1) \times (1 + r_2) \times \dots \times (1 + r_t)$$</p><p>这种<strong>累乘随机过程</strong>导致了一个致命的不对称性：如果你亏损了 50%，你需要盈利 100% 才能回到原点。</p><h3 id="对数变换：桥接两个世界"><a href="#对数变换：桥接两个世界" class="headerlink" title="对数变换：桥接两个世界"></a>对数变换：桥接两个世界</h3><p>为了使用强大的中心极限定理，数学家对价格取了对数（$\ln$）：$$\ln(P_t) &#x3D; \ln(P_0) + \ln(1+r_1) + \ln(1+r_2) + \dots$$</p><p>现在，等式右边变成了<strong>对数收益率的累加</strong>。根据中心极限定理，$\ln(P_t)$ 服从正态分布。<strong>推导结论：如果资产价格的对数是正态分布，那么资产价格本身就服从“对数正态分布”。</strong></p><hr><h2 id="3-对数正态分布的图像特质"><a href="#3-对数正态分布的图像特质" class="headerlink" title="3. 对数正态分布的图像特质"></a>3. 对数正态分布的图像特质</h2><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259907293.png" alt="1767259907293.png"></p><p>当我们观察对数正态分布的概率密度曲线时，会发现它与正态分布完全不同：</p><ol><li><strong>不对称性（右偏）</strong>：它有一条向右延伸的长尾巴（理论上无限的上涨空间），但左侧死死地卡在 0（你最多亏光）。</li><li><strong>重心左移</strong>：这是本文最核心的观察点。</li></ol><p>在对数正态分布中，有三个“中心”：</p><ul><li>**期望值 (Mean)**：数学上的平均收益。</li><li>**中位数 (Median)**：50% 的人能达到的结局。</li><li>**众数 (Mode)**：概率最高、最可能发生的结局。</li></ul><hr><h2 id="4-深度性质：为什么“别亏钱”是第一法则"><a href="#4-深度性质：为什么“别亏钱”是第一法则" class="headerlink" title="4. 深度性质：为什么“别亏钱”是第一法则"></a>4. 深度性质：为什么“别亏钱”是第一法则</h2><p>通过观察模型参数 $\mu$（预期收益）和 $\sigma$（波动率）的互动，我们可以得出以下实战启示：</p><h3 id="4-1-波动率陷阱：亏损是复利的杀手"><a href="#4-1-波动率陷阱：亏损是复利的杀手" class="headerlink" title="4.1 波动率陷阱：亏损是复利的杀手"></a>4.1 波动率陷阱：亏损是复利的杀手</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259951578.png" alt="1767259951578.png"></p><p>对数正态分布下，复合年化收益率 $g$ 的近似公式为：$$g \approx \mu - \frac{\sigma^2}{2}$$</p><p>看到那个 $\frac{\sigma^2}{2}$ 了吗？<strong>波动率会直接从你的收益中“扣钱”。</strong>即使平均收益 $\mu$ 很高，只要波动率 $\sigma$ 足够大，你的真实增长 $g$ 可能是负数。这就是为什么“稳健”比“爆发”更重要的数学原因。</p><h3 id="4-2-不要加杠杆：中位数的坍缩"><a href="#4-2-不要加杠杆：中位数的坍缩" class="headerlink" title="4.2 不要加杠杆：中位数的坍缩"></a>4.2 不要加杠杆：中位数的坍缩</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767259989096.png" alt="1767259989096.png"></p><p>加杠杆会线性增加 $\mu$，但会以<strong>平方速度</strong>增加 $\sigma^2$。反映在图像上，虽然平均值（Mean）被极少数暴富的幸存者拉向了右侧，但曲线的峰值（Mode）和中点（Median）会迅速向左侧（亏损区）坍缩。<strong>结论：杠杆越高，你变成那个“被平均”的炮灰概率就越大。</strong></p><h3 id="4-3-追高的幻觉：高波动的代价"><a href="#4-3-追高的幻觉：高波动的代价" class="headerlink" title="4.3 追高的幻觉：高波动的代价"></a>4.3 追高的幻觉：高波动的代价</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260059169.png" alt="1767260059169.png"></p><p>热门股（高 $\mu$, 极高 $\sigma$）往往呈现出极度的左偏。虽然它“看起来”涨得快，但其<strong>众数（最可能发生的结局）往往远低于 1.0</strong>。你追逐的是那条稀疏的、极难捕捉的“长右尾”，而你面对的却是大概率的亏损峰值。</p><h3 id="4-4-本金要足够"><a href="#4-4-本金要足够" class="headerlink" title="4.4 本金要足够"></a>4.4 本金要足够</h3><p>在乘法模型中，所有的收益都基于 $P_0$。由于波动拖累的存在，小额本金通过高风险波动翻倍的概率，远低于大额本金通过低波动增长的确定性。<strong>本金不仅是资本，更是抗风险的“冗余度”。</strong></p><h3 id="4-5-永远有概率赢：时间的解药"><a href="#4-5-永远有概率赢：时间的解药" class="headerlink" title="4.5 永远有概率赢：时间的解药"></a>4.5 永远有概率赢：时间的解药</h3><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260089028.png" alt="1767260089028.png"></p><p>只要你的复合收益率 $g &gt; 0$，随着时间 $t$ 的增加：</p><ul><li>增长项按 $t$ 线性增长。</li><li>随机波动项按 $\sqrt{t}$ 缓慢增长。<strong>只要你不因大亏或杠杆被清出场，时间最终会稀释掉短期的随机性，让财富分布的山峰缓慢爬过“盈亏平衡点”。</strong></li></ul><hr><h2 id="5-总结"><a href="#5-总结" class="headerlink" title="5. 总结"></a>5. 总结</h2><p>我可能做了一些不严谨的假设才构建了这个模型，但它揭示了一个深刻的真相：<strong>投资不是一个比谁跑得快的游戏，而是一个比谁活得久的游戏。</strong></p><p><img src="https://rawforcorvofeng.cn/blog/2026/01/01/1767260115783.png" alt="1767260115783.png"></p><p>“别亏钱”不是为了追求保守，而是为了保护那个脆弱的复利引擎不被 $\sigma^2$ 这个恶魔强行熄火。在这个不对称的概率世界里，<strong>平庸的赢 + 极少的输 &#x3D; 伟大的复利。</strong></p><p>如果你对这些参数如何影响分布感兴趣，欢迎去我的<a href="https://compound-truth.corvofeng.workers.dev/">可视化工具</a>亲手调一调参数，你会对“风险”产生全新的敬畏。</p>]]></content>
    
    
    <summary type="html">我们经常听到“投资最重要的是别亏钱”，我之前只是牢记这一点，但是近期查资料查到了有关对数正态分布相关的知识。顺着它的思路，我自己也从模型角度对这句话进行了一些理解。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="投资" scheme="https://corvo.myseu.cn/tags/%E6%8A%95%E8%B5%84/"/>
    
    <category term="数学" scheme="https://corvo.myseu.cn/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="经济" scheme="https://corvo.myseu.cn/tags/%E7%BB%8F%E6%B5%8E/"/>
    
  </entry>
  
  <entry>
    <title>半自动化交易系统（五）</title>
    <link href="https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/"/>
    <id>https://corvo.myseu.cn/2025/12/31/2025-12-31-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%94)/</id>
    <published>2025-12-31T10:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<hr><p>本文作为交易系统系列的第五篇，主要介绍近期在期权策略和系统功能上的优化和改进。在券商平台开通QMT权限后，我实现了使用Python进行期权交易的自动化操作。本文将详细介绍系统架构、功能实现以及策略改进的相关内容。</p><h2 id="券商集成"><a href="#券商集成" class="headerlink" title="券商集成"></a>券商集成</h2><p>在期权自动化交易方面，我的主要账户在国金, 正好满足了要求, 所以就用国金的QMT接口作为底层交易通道。之前使用MiniQMT进行股票交易，但期权交易需要完整版QMT权限。</p><p>集成过程中使用的核心函数包括：</p><ol><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#get-trade-detail-data-%E6%9F%A5%E8%AF%A2%E8%B4%A6%E5%8F%B7%E8%B5%84%E9%87%91%E4%BF%A1%E6%81%AF%E3%80%81%E5%A7%94%E6%89%98%E8%AE%B0%E5%BD%95%E7%AD%89">get_trade_detail_data</a> 用于获取账户资金信息、委托记录等：</li><li><a href="https://zilchyao.github.io/xuntou_yao/#_4-34-%E5%8F%96%E6%9C%9F%E6%9D%83%E7%BB%84%E5%90%88%E6%8C%81%E4%BB%93get-comb-option">get_comb_option</a> 取期权组合持仓</li><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#make-option-combination">make_option_combination</a> 用于创建期权组合, 我主要用来做价差</li><li><a href="http://docs.thinktrader.net/pages/d0dd26/#_39-%E8%A7%A3%E9%99%A4%E6%9C%9F%E6%9D%83%E7%BB%84%E5%90%88%E6%8C%81%E4%BB%93-release-option-combination">release_option_combination</a> 用于释放期权组合</li><li><a href="https://dict.thinktrader.net/innerApi/trading_function.html?id=I3DJ97#%E4%BA%A4%E6%98%93%E4%B8%8B%E5%8D%95%E5%87%BD%E6%95%B0">passorder</a> 所有的下单操作, 包括开仓, 平仓</li><li><a href="https://dict.thinktrader.net/dictionary/option.html?id=I3DJ97#%E8%8E%B7%E5%8F%96%E6%9C%9F%E6%9D%83%E5%85%A8%E6%8E%A8%E6%95%B0%E6%8D%AE">get_full_tick</a> 获取期权逐笔数据</li></ol><p>关于API的详细使用方法，券商提供的技术文档已经有较为完整的说明，这里不再赘述。如需要技术咨询服务，可通过私信联系讨论具体需求和费用。</p><p>需要注意的是，QMT启动后会独占交易通道，佣金宝和国金的其他客户端无法同时进行交易。如需在移动端进行操作，可以使用国金提供的汇点期权App作为替代方案。</p><h2 id="页面功能设计"><a href="#页面功能设计" class="headerlink" title="页面功能设计"></a>页面功能设计</h2><p>为了更有效地管理期权持仓，我开发了一个专门的持仓管理页面。该页面不仅展示持仓信息，还集成了调仓功能，可以便捷地进行期权组合的构建和调整。</p><p>如前文《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》所述，我目前专注于科创50ETF期权的价差策略。单一标的的策略使得页面设计可以更加专注和高效。</p><h3 id="持仓概览"><a href="#持仓概览" class="headerlink" title="持仓概览"></a>持仓概览</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767179952954.png" alt="1767179952954.png"></p><p>上图展示了持仓页面的整体布局。图中标注部分显示了当前标的物及其实时价格，这是监控持仓状态的核心指标。</p><h3 id="分月持仓管理"><a href="#分月持仓管理" class="headerlink" title="分月持仓管理"></a>分月持仓管理</h3><p>考虑到不同到期月份的期权合约具有不同的时间价值特性，系统按照到期日对持仓进行分类展示，便于分析和管理。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180027632.png" alt="1767180027632.png"></p><p>页面从左到右依次显示：牛市价差组合数量、备兑组合数量、义务仓数量以及权利仓数量。这种布局方式能够快速呈现整体仓位结构。</p><p>此外，系统对不同行权价的时间价值进行了颜色编码，通过视觉化的方式突出显示各合约的时间价值水平，提高了信息的可读性。</p><h3 id="调仓操作界面"><a href="#调仓操作界面" class="headerlink" title="调仓操作界面"></a>调仓操作界面</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180121324.png" alt="1767180121324.png"></p><p>调仓页面提供了简洁的操作界面。用户可以直接修改目标持仓数量，系统会自动计算需要执行的交易操作。</p><p>页面集成了实时行情数据，能够实时显示当前的买卖报价。科创50ETF期权具有较好的流动性，买卖价差相对较小。当前版本实现了对手价下单功能，限价单功能计划在后续版本中添加。</p><p>页面底部以JSON格式展示完整的持仓信息，包括各合约的数量和价格，便于在下单前进行最终确认。</p><h3 id="组合策略管理"><a href="#组合策略管理" class="headerlink" title="组合策略管理"></a>组合策略管理</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767180206595.png" alt="1767180206595.png"></p><p>期权组合是策略实施的核心部分。页面提供了组合调整界面，支持便捷地构建和修改各类价差组合。</p><h2 id="策略优化与实现"><a href="#策略优化与实现" class="headerlink" title="策略优化与实现"></a>策略优化与实现</h2><p>《<a href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/">期权策略-变种比例价差</a>》一文中详细阐述了策略的理论框架。在实际落地过程中，为了更好地实现程序化交易，对策略进行了一些适配性调整和优化。</p><h3 id="策略参数优化"><a href="#策略参数优化" class="headerlink" title="策略参数优化"></a>策略参数优化</h3><p>在仓位管理方面，将之前的零散操作调整为标准化配置：在每个价位段，统一采用<strong>10张权利仓+12-15张义务仓</strong>的标准比例来构建组合，同时配合少量平值期权义务仓的裸卖操作。</p><p>这种标准化配置的优势在于：仓位控制更加精确，避免了为凑整数而产生的困扰，使得整体仓位管理更加规范和可控。</p><h3 id="风控机制设计"><a href="#风控机制设计" class="headerlink" title="风控机制设计"></a>风控机制设计</h3><p>衍生品交易中，风险控制是系统稳定运行的基础。系统实现了完整的风控和调仓逻辑。从我的角度来看, 风控长什么样不重要, 重要的是一定要有一个.它能够提醒你当前的风险暴露情况, 并且在必要时刻给出调仓建议. 我就想了一套最简单的让AI来生成.</p><p>围绕获取时间价值这一核心目标，针对义务仓设计了三层风控机制：</p><ol><li><strong>高风险调仓机制</strong>：当持仓的风险评分超过预设阈值时，系统会自动识别并建议更保守的调仓方案，降低持仓风险暴露</li><li><strong>虚值平行移仓机制</strong>：当虚值合约时间价值快速衰减，且下月合约的时间价值达到当月的2倍以上时，系统会建议平行移仓，在获取更高时间价值的同时，可以适当降低持仓数量</li><li><strong>低价值清仓机制</strong>：对于时间价值低于50元的期权合约，系统会建议平仓，以提高保证金使用效率</li></ol><p>系统还实现了风险评分机制记录，根据持仓情况和标的价格实时计算风险分数，并以图表形式记录风险变化趋势。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/12/31/1767184797272.png" alt="1767184797272.png"></p><p>通过这套风控体系，能够及时识别和控制潜在风险。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>本文介绍了期权自动化交易系统的主要功能模块和策略实现。从券商接口集成、页面功能设计，到策略优化和风控机制，系统已经具备了基本的自动化交易能力。</p><p>当前系统仍有较大的改进空间。限价单功能、更多样化的策略组合、更精细的风控算法等功能都在规划之中。系统的持续优化和完善将是后续工作的重点。</p><p>欢迎对期权交易自动化感兴趣的读者交流讨论。</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第五篇，主要介绍近期在期权策略和系统功能上的优化和改进。在券商平台开通QMT权限后，我实现了使用Python进行期权交易的自动化操作。本文将详细介绍系统架构、功能实现以及策略改进的相关内容。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>期权策略-变种比例价差</title>
    <link href="https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/"/>
    <id>https://corvo.myseu.cn/2025/10/18/2025-10-18-%E6%9C%9F%E6%9D%83%E7%AD%96%E7%95%A5-%E5%8F%98%E7%A7%8D%E6%AF%94%E4%BE%8B%E4%BB%B7%E5%B7%AE%E4%BB%A5%E5%8F%8A%E9%A3%8E%E9%99%A9%E6%8E%A7%E5%88%B6/</id>
    <published>2025-10-18T10:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>💡 <strong>前言</strong></p><p>这篇文章想和大家分享我一直在使用的期权策略，以及我对风险控制的一些体会。<br>这套策略是我在开始期权交易后不久就建立的，至今仍在使用。期间经过多次调整与优化，但核心逻辑始终未变。</p><p>👉 本文面向已经具备一定期权基础的投资者。<br>如果你刚入门，建议先了解期权的基本概念和原理。本文不会涉及复杂的希腊字母计算，也不探讨定价模型，更多是关于策略思路与风险控制的实践。（我自己也不太会算那些 😂）</p><blockquote><p>⚠️ <strong>风险提示：</strong>没有任何策略是永远有效的。市场在变，波动在变，人也会变。<br>以下内容仅为个人经验分享，不构成任何投资建议。</p></blockquote><hr><h2 id="🧩-普通比例价差（Ratio-Spread）"><a href="#🧩-普通比例价差（Ratio-Spread）" class="headerlink" title="🧩 普通比例价差（Ratio Spread）"></a>🧩 普通比例价差（Ratio Spread）</h2><p><strong>Ratio Spread（比率价差）</strong> 是一种常见的期权组合策略。<br>它的核心思想是通过 <strong>买入与卖出不同比例的期权</strong>，利用波动性与时间价值的差异，在风险可控的情况下获取收益。</p><p>以看涨期权为例 👇</p><ol><li><strong>买入</strong> 较低执行价的看涨期权（Long Call）——获得上涨收益机会；  </li><li><strong>卖出</strong> 较高执行价的看涨期权（Short Call）——收取权利金抵消部分成本。</li></ol><p>举个最简单的例子：<br>买入 1 张执行价为 10 元的 Call，同时卖出 2 张执行价为 12 元的 Call。<br>你支付买入的权利金，同时获得卖出的权利金，形成一个「比例结构」。</p><p>🔗 延伸阅读  </p><ul><li><a href="https://www.moomoo.com/us/hans/learn/detail-ratio-spread-117038-240298018">moomoo 教程</a>  </li><li><a href="https://xueqiu.com/8188497048/137926836">雪球讨论</a></li></ul><p>策略的到期盈亏图如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760626207592.png" alt="1760626207592.png"></p><p>我个人并不太喜欢这种「山峰型」的损益曲线。<br>它虽然直观，却让人感到不够平衡与优雅。于是，我尝试使用下面我更偏好的变种。</p><hr><h2 id="🚀-我的变种策略"><a href="#🚀-我的变种策略" class="headerlink" title="🚀 我的变种策略"></a>🚀 我的变种策略</h2><h3 id="🎬-策略灵感"><a href="#🎬-策略灵感" class="headerlink" title="🎬 策略灵感"></a>🎬 策略灵感</h3><p>我最早在 <a href="https://www.youtube.com/watch?v=0UrpGD_79FQ">PowerUpGammas 的视频</a> 中看到这种思路。<br>视频讨论的是「如何用期权修复股票浮亏」，但我认为它不仅适用于亏损修复，也可在 <strong>趋势行情中放大收益</strong>。</p><iframe width="560" height="315" src="https://www.youtube.com/embed/0UrpGD_79FQ?si=gaz_euaqdREDjhBy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><p>后来, 他讲了另一篇 <a href="https://www.youtube.com/watch?v=fxXqDGuveQ4">超级备兑期权</a>, 就是本篇文章所讲的内容.</p><iframe width="560" height="315" src="https://www.youtube.com/embed/fxXqDGuveQ4?si=dyUAFo3mutw9kvrq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><hr><h3 id="🧱-策略结构"><a href="#🧱-策略结构" class="headerlink" title="🧱 策略结构"></a>🧱 策略结构</h3><ol><li>持有一份标的资产（用于备兑）；  </li><li>买入 1 张较低执行价的看涨期权；  </li><li>卖出 2 张较高执行价的看涨期权。</li></ol><p>与普通比率价差相比，这里额外加入了标的资产本身，起到了<strong>风险缓冲</strong>的作用。</p><p>换个角度理解：</p><ul><li>「买低 + 卖高」 &#x3D; 牛市价差（Bull Call Spread）  </li><li>「持股 + 卖高」 &#x3D; 备兑看涨（Covered Call）</li></ul><p>两者结合，就构成了这种混合型结构。</p><hr><h3 id="📈-到期盈亏图与分析"><a href="#📈-到期盈亏图与分析" class="headerlink" title="📈 到期盈亏图与分析"></a>📈 到期盈亏图与分析</h3><p>我用 OptionStrat 画了一张 SPY 的示意图：<br>👉 <a href="https://optionstrat.com/5SNKWQgvyWql">策略图链接</a></p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760627211016.png" alt="1760627211016.png"></p><p>图中可以分为三个区间：</p><ol><li><strong>左侧红区</strong>：股价低于 680，全体期权作废，盈亏与正股一致。  </li><li><strong>中间绿区（680–700）</strong>：收益由股票上涨 + 看涨期权增值组成。  </li><li><strong>右侧平顶区（&gt;700）</strong>：卖出两张 Call 的收益抵消上涨空间，收益封顶。</li></ol><blockquote><p>💬 关键：<br>两张高行权价的 Call 收入必须能覆盖低行权价 Call 的成本，否则策略将需要额外资金投入（风险上升）。</p></blockquote><p>我很喜欢这条盈亏曲线，它平滑、线性、干净。<br>数学上，它是一个<strong>分段线性函数</strong>；逻辑上，它在中段实现了无成本的杠杆提升。</p><p>✨ 优点总结：</p><ul><li>风险可控，结构清晰  </li><li>在<strong>区间内</strong>实现 2 倍收益  </li><li>无额外资金占用</li></ul><hr><h2 id="🧭-策略的进一步变种"><a href="#🧭-策略的进一步变种" class="headerlink" title="🧭 策略的进一步变种"></a>🧭 策略的进一步变种</h2><p>既然原理是「用比率调整收益区间」，那我们就可以玩出更多组合。</p><h3 id="🎯-变种-1：调整区间宽度"><a href="#🎯-变种-1：调整区间宽度" class="headerlink" title="🎯 变种 1：调整区间宽度"></a>🎯 变种 1：调整区间宽度</h3><p>调整买卖期权的执行价，可改变收益区间。<br>例如：</p><ul><li>买入 1 张 680 Call  </li><li>卖出 2 张 710 Call</li></ul><p>区间拉宽 → 收益范围更大，但权利金差距也变大，需要重新平衡成本。</p><hr><h3 id="⚙️-变种-2：调整比例"><a href="#⚙️-变种-2：调整比例" class="headerlink" title="⚙️ 变种 2：调整比例"></a>⚙️ 变种 2：调整比例</h3><p>可以买入 2 张、卖出 3 张，从而实现更高杠杆（例如 3 倍收益）。<br>只要卖出的权利金能覆盖买入成本，该结构依然成立。</p><hr><h3 id="🔄-变种-3：反向思维（看跌版）"><a href="#🔄-变种-3：反向思维（看跌版）" class="headerlink" title="🔄 变种 3：反向思维（看跌版）"></a>🔄 变种 3：反向思维（看跌版）</h3><p>同理，也可构建看跌版策略：<br>买入 1 张高行权价 Put，卖出 2 张低行权价 Put，同时准备现金用于”备兑”。</p><h3 id="🔄-变种整合"><a href="#🔄-变种整合" class="headerlink" title="🔄 变种整合"></a>🔄 变种整合</h3><p>如果我们将这几个变种策略结合起来, 那么最后的盈亏图可能长成这样, 在不同的区间内, 我们可以获得不同倍数的收益. 也可以理解为加了不同倍数的杠杆. </p><p><a href="https://optionstrat.com/NpbByzGw1vll">https://optionstrat.com/NpbByzGw1vll</a> </p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760628194047.png" alt="1760628194047.png"></p><p>我没有画看跌的比率价差, 因为这个工具并没有给我用现金做备兑的选项, 但其实它和看涨的比率价差类似, 只是方向相反.</p><hr><h2 id="⚖️-风险与取舍"><a href="#⚖️-风险与取舍" class="headerlink" title="⚖️ 风险与取舍"></a>⚖️ 风险与取舍</h2><p>这种结构的优点在于：<strong>看错不亏，看对大赚</strong>。<br>但仍需注意以下风险 👇</p><ol><li><strong>标的下跌风险</strong>：若价格跌破低行权价，亏损与持股一致。  </li><li><strong>机会成本</strong>：资金被标的锁定，横盘时收益有限。  </li><li><strong>踏空风险</strong>：若标的暴涨，收益被封顶，需提前规划。</li></ol><hr><h2 id="🧮-市场分析与量化探索"><a href="#🧮-市场分析与量化探索" class="headerlink" title="🧮 市场分析与量化探索"></a>🧮 市场分析与量化探索</h2><p>既然结构清晰，我自然想看看，我平时交易的科创50ETF期权，能实现多大杠杆。</p><p>我写了一个小程序，基于科创50ETF期权数据，计算每个合约能实现的<strong>最大杠杆倍数（无额外投入）</strong>。</p><p>例如：</p><ul><li>26年3月的科创50ETF期权合约中：<blockquote><p>  1.55 Call 价格为 1213</p><p>  1.6  Call 价格为 1063</p></blockquote></li></ul><p>→ 理论上可开到 8 倍杠杆（卖8张，买7张）  </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">8</span> * <span class="number">1063</span> - <span class="number">7</span> * <span class="number">1213</span> = +<span class="number">13</span>  <span class="comment"># （未计手续费）</span></span><br></pre></td></tr></table></figure><p>我自己编写了一个定时任务自动计算每个区间段内可以实现的杠杆倍数并打点, 下面是两张不同月份合约的杠杆计算结果图, 横轴为不同时间点, 纵轴为杠杆倍数。</p><p>📉 近月合约（2–3倍杠杆）：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629002867.png" alt="1760629002867.png"></p><p>📈 远月合约（6–8倍杠杆）：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629061847.png" alt="1760629061847.png"></p><p>读者可以自己算一下：<strong>杠杆倍数与价差成反比，与合约价格成正比。</strong>两张期权价差越小、价格越高，可开的杠杆就越大。</p><hr><h2 id="📊-我的持仓追踪与管理"><a href="#📊-我的持仓追踪与管理" class="headerlink" title="📊 我的持仓追踪与管理"></a>📊 我的持仓追踪与管理</h2><p>我使用 Google 表格来管理持仓与杠杆情况👇</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629475045.png" alt="1760629475045.png"></p><p>并标记了每个区间段、每个月份的杠杆倍数：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/16/1760629373123.png" alt="1760629373123.png"></p><p>这些数据帮助我动态调整仓位，优化结构。</p><p>📍 开仓容易，管理更关键。很多期权合约不一定要持有到期的, 中途怎么调整, 可能是更重要的.</p><p>我做了几个月期权的一点思考就是: 只要你能在市场中活着, 你就有机会赚钱. 这个策略能让你在市场中活很久. 哪天失业了, 可以用这个策略给市场打工, 赚点小钱.</p><hr><h2 id="🧩-总结"><a href="#🧩-总结" class="headerlink" title="🧩 总结"></a>🧩 总结</h2><p>这套比率价差变种，是我实战中最核心、最常用的策略之一。<br>它特别适合趋势明确的单边行情，或是大幅的震荡行情。</p><p>对于更大体量的投资者，这种结构更像是 <strong>微型做市（Market Making）</strong>：<br>提供市场流动性、赚取结构性溢价。<br>当然，这需要更成熟的风险矩阵与资金分层体系。</p><hr><h3 id="🤔-为什么我不担心策略公开会失效？"><a href="#🤔-为什么我不担心策略公开会失效？" class="headerlink" title="🤔 为什么我不担心策略公开会失效？"></a>🤔 为什么我不担心策略公开会失效？</h3><ol><li><strong>市场需要流动性</strong>：更多人使用 → 价格更高效。</li><li><strong>机构更复杂</strong>：他们的模型理论上更加负责 我根本不需要担心他们。</li><li><strong>收益有限</strong>：Capped profit 不吸引极端投机者。</li></ol>]]></content>
    
    
    <summary type="html">这篇文章想和大家分享我一直在使用的期权策略，以及我对风险控制的一些体会。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="Option" scheme="https://corvo.myseu.cn/tags/Option/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="科创50ETF" scheme="https://corvo.myseu.cn/tags/%E7%A7%91%E5%88%9B50ETF/"/>
    
  </entry>
  
  <entry>
    <title>使用Google表格整理期权持仓</title>
    <link href="https://corvo.myseu.cn/2025/10/14/2025-10-14-%E4%BD%BF%E7%94%A8Google%E8%A1%A8%E6%A0%BC%E6%95%B4%E7%90%86%E6%9C%9F%E6%9D%83%E6%8C%81%E4%BB%93/"/>
    <id>https://corvo.myseu.cn/2025/10/14/2025-10-14-%E4%BD%BF%E7%94%A8Google%E8%A1%A8%E6%A0%BC%E6%95%B4%E7%90%86%E6%9C%9F%E6%9D%83%E6%8C%81%E4%BB%93/</id>
    <published>2025-10-14T10:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一些背景"><a href="#一些背景" class="headerlink" title="一些背景"></a>一些背景</h2><p>我虽然已经使用Bolt开发了期权相关的页面, 但是在实际交易中, 还是习惯使用Google表格来整理期权数据, 主要有以下几个原因:</p><ol><li>目前还没有把后端系统接入到QMT, 只能手动导入数据, 所以并没有什么自动化的优势.</li><li>目前我做期权, 依然还是处于比较新手的阶段, 还在探索比较合适的工具, 这个时候去研究展示页面我认为收益不高</li><li>Google表格的界面非常友好, 可以很方便地进行数据的查看和编辑, 而且我能慢慢整理出自己想要的究竟是什么</li><li>我也使用了一下飞书的文档, 它的自定义函数支持我是没看懂, 考虑到实用性和扩展性, 还是选了Google表格</li></ol><p>我的Google表格的地址如下, 如果想修改, 读者可以直接复制一份到自己的Google账号下进行修改</p><p><a href="https://docs.google.com/spreadsheets/d/1IiRv47a8lwmZt84KsiZnTKOTp4HDsqJUgsyUxbWHGlU/edit?gid=1506563050#gid=1506563050">https://docs.google.com/spreadsheets/d/1IiRv47a8lwmZt84KsiZnTKOTp4HDsqJUgsyUxbWHGlU/edit?gid=1506563050#gid=1506563050</a></p><h2 id="期权持仓的获取"><a href="#期权持仓的获取" class="headerlink" title="期权持仓的获取"></a>期权持仓的获取</h2><p>我用的是国金的金太阳来看我的持仓, 它是通达信的一个定制版本, 也提供了数据导出的功能</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760454197980.png" alt="1760454197980.png"></p><p>我就用它的导出功能, 导出成Excel, 然后再复制到Google表格中</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760455027983.png" alt="1760455027983.png"></p><h2 id="持仓收益整理"><a href="#持仓收益整理" class="headerlink" title="持仓收益整理"></a>持仓收益整理</h2><p>我希望尽量记录自己的仓位变化情况, 正好也用Google表格以及图表进行记录和查看</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456434235.png" alt="1760456434235.png"></p><h2 id="Google表格的整理-内置函数"><a href="#Google表格的整理-内置函数" class="headerlink" title="Google表格的整理(内置函数)"></a>Google表格的整理(内置函数)</h2><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760455185669.png" alt="1760455185669.png"></p><p>这张图中. 有几个部分我用了Google表格的内置函数来实现</p><h3 id="根据到期日进行过滤"><a href="#根据到期日进行过滤" class="headerlink" title="根据到期日进行过滤"></a>根据到期日进行过滤</h3><p>比如, 整个tab中, 我首先进行过滤, <code>Q2</code>这个单元格对应的到期日, 这里是<code>20251022</code>, 而后基于合约名称进行排序</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=sort(filter(&#x27;持仓&#x27;!A2:N, &#x27;持仓&#x27;!N2:N = Q2), 2, true)</span><br></pre></td></tr></table></figure><h3 id="获取未平仓的CALL"><a href="#获取未平仓的CALL" class="headerlink" title="获取未平仓的CALL"></a>获取未平仓的CALL</h3><p>而后, 我用这个公式来获取<code>未平仓的CALL</code>, 如下, 它的规则是:</p><ol><li>当我发现期权名称中包含<code>购</code>字  –  为看涨期权</li><li>可用量大于0  – 说明还有未平仓的</li><li>开仓价格为负数  – 说明当时是在卖出</li><li>并且不是备兑的时候 – 非备兑</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=FILTER(B2:O20, regexmatch(C2:C20,&quot;.*购.*&quot;), F2:F20&gt;0, G2:G20&lt;0, NOT(D2:D20=&quot;备兑&quot;))</span><br></pre></td></tr></table></figure><p>未平仓的PUT也是类似的, 读者可以自己去表格中查看公式</p><h2 id="调用自定义的函数"><a href="#调用自定义的函数" class="headerlink" title="调用自定义的函数"></a>调用自定义的函数</h2><p>针对这些可能有行权风险的义务仓, 我还编写了一些自定义的函数, 来帮助我进行一些计算. 比如, 当前标的价格, 计算合约是实值还是虚值</p><h3 id="函数代码编写"><a href="#函数代码编写" class="headerlink" title="函数代码编写"></a>函数代码编写</h3><p>可以从这个位置打开来查看脚本</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456135053.png" alt="1760456135053.png"></p><p>里面的代码我是求助Gemini来做的, 它比自己写快太多了, 还有注释, 好评!</p><p><img src="https://rawforcorvofeng.cn/blog/2025/10/14/1760456203388.png" alt="1760456203388.png"></p><h3 id="表格中调用函数"><a href="#表格中调用函数" class="headerlink" title="表格中调用函数"></a>表格中调用函数</h3><p>我可以直接调用写好的函数来计算得到所有期权的状态, 方便我评估风险, 哪些属于实值的义务仓需要在到期前尽快平掉或是移仓</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=ANALYZE_OPTION_STATUS(C:C, R2*1000)</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我说真的, 不管是用自己的程序还是用Google表格整理都不是特别方便. 但是我用了券商的软件包括通达信还是汇点, 他们的对于已持有的期权仓位的分析都非常有限,只能看到一些基本的信息. 甚至连按照月份来分类都没有, 只能看到一个大概的持仓. 当我做的期权越来越多的时候, 这些信息就显得非常不够用了.</p><p>如果是机构交易者应该也是要有自己的系统来管理这些数据的, 但是对于个人投资者来说, 我目前还没找到一个特别好的工具. 如果有推荐的期权工具也欢迎大家留言告诉我.</p>]]></content>
    
    
    <summary type="html">使用Google表格整理期权数据的经验分享</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="Option" scheme="https://corvo.myseu.cn/tags/Option/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
    <category term="Google" scheme="https://corvo.myseu.cn/tags/Google/"/>
    
    <category term="Sheets" scheme="https://corvo.myseu.cn/tags/Sheets/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统（四）</title>
    <link href="https://corvo.myseu.cn/2025/09/20/2025-09-20-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%9B%9B)/"/>
    <id>https://corvo.myseu.cn/2025/09/20/2025-09-20-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E5%9B%9B)/</id>
    <published>2025-09-20T10:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<hr><p>这篇文章是我的半自动化股票交易系统系列的第四篇，主要聚焦于期权相关的功能和策略改动。近期我的主要精力都放在期权自动化和策略优化上。本文不会详细介绍期权基础知识，更适合已有一定期权基础的读者。如果你对期权还不熟悉，建议先查阅相关入门资料，后续我也会专门写一篇期权基础与策略的介绍。</p><h2 id="国内期权市场现状"><a href="#国内期权市场现状" class="headerlink" title="国内期权市场现状"></a>国内期权市场现状</h2><p>很多朋友听到“期权”时，往往不相信国内也有类似的杠杆工具。实际上，国内不仅有商品期权，还有较为成熟的金融期权市场，尤其是股指期权。具体规则可以参考<a href="https://www.cs.ecitic.com/newsite/bdp/gpqq/jygz/">中信证券官网的交易规则</a>。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_22-51-55.jpg" alt="Xnip2025-09-20_22-51-55.jpg"></p><p>我个人主要关注的是<code>华夏科创50ETF（588000.SH）</code>的期权。选择这个标的的原因很简单：价格计算方便，每张合约大约1万元，且科创板股票波动率较高，非常适合期权策略的实践。</p><p>目前国内主流的期权交易软件如汇点、通达信等，对自定义指标和策略的支持有限。如果想实现自动化交易，基本只能靠自己开发程序。与券商沟通后了解到，若想开通API权限，通常需要满足100万元资金量和500张期权交易的门槛，我还在为这个目标努力中。</p><h2 id="T型报价与数据获取"><a href="#T型报价与数据获取" class="headerlink" title="T型报价与数据获取"></a>T型报价与数据获取</h2><p>T型报价表是期权交易的基础工具，也是我自动化程序的第一步。只有能实时获取期权报价和持仓数据，后续的分析和策略执行才有可能实现。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_22-23-34.jpg" alt="Xnip2025-09-20_22-23-34.jpg"></p><p>许多期权策略的分析和决策，都是基于当前的T型报价实时计算得出的。</p><h2 id="持仓数据解析"><a href="#持仓数据解析" class="headerlink" title="持仓数据解析"></a>持仓数据解析</h2><p>由于目前还没有开放的API接口，我的期权持仓数据主要通过券商导出的持仓文件（CSV格式）获取。程序会自动解析这些文件，生成标准化的持仓数据，便于后续分析和策略管理。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_11-30-48.jpg" alt="Xnip2025-09-20_11-30-48.jpg"></p><p>在系统中，我可以根据实际持仓情况，自定义和选择对应的策略组合。</p><h2 id="期权策略的维护与管理"><a href="#期权策略的维护与管理" class="headerlink" title="期权策略的维护与管理"></a>期权策略的维护与管理</h2><p>基于当前持有的期权合约，我可以自定义常见的策略组合，比如牛市价差、熊市价差等基础策略，也可以灵活组合更复杂的策略。由于缺乏API，目前策略的维护主要依赖手动操作。好在我的资金规模尚未大到需要频繁调整仓位，现阶段这种方式尚可接受。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/1758382525875.png" alt="1758382525875.png"></p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_11-29-21.jpg" alt="Xnip2025-09-20_11-29-21.jpg"></p><h2 id="报价监听与策略通知"><a href="#报价监听与策略通知" class="headerlink" title="报价监听与策略通知"></a>报价监听与策略通知</h2><p>在维护好策略后，系统会根据当前持仓和策略，自动监听合约报价的变化，判断是否需要进行买卖操作。需要说明的是，目前实际下单仍需手动在券商软件中完成，系统会通过 Telegram 发送通知，提醒我及时操作。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/09/20/Xnip2025-09-20_12-05-48.jpg" alt="Xnip2025-09-20_12-05-48.jpg"></p><p>对于十几万元规模的账户来说，这种半自动化已经极大减轻了盯盘和计算压力。只需等待程序通知，无需频繁关注行情和手动计算盈亏。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p>期权交易与股票有很大不同，需要学习和掌握的内容也更多。当前我主要利用期权获取稳定现金流，并对冲部分股票仓位的风险。期权策略丰富多样，自动化程度越高，效率和收益也会越好。受限于API门槛，目前我的系统还无法实现完全自动化，只能做价格提醒和部分策略维护。希望未来能达到券商API的要求，实现真正的自动化期权交易。</p><p>如果你对期权自动化、策略开发等话题感兴趣，欢迎留言交流！</p>]]></content>
    
    
    <summary type="html">本文作为交易系统系列的第四篇，主要介绍近期在期权相关策略和系统功能上的改动。近期我的主要精力都放在期权自动化和策略优化上，欢迎有兴趣的读者交流探讨。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="股指期权" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E6%8C%87%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>使用 Bitwarden 在 K8s 集群管理 Secrets</title>
    <link href="https://corvo.myseu.cn/2025/08/23/2025-08-23-%E4%BD%BF%E7%94%A8Bitwarden%E5%9C%A8K8s%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86Secrets/"/>
    <id>https://corvo.myseu.cn/2025/08/23/2025-08-23-%E4%BD%BF%E7%94%A8Bitwarden%E5%9C%A8K8s%E9%9B%86%E7%BE%A4%E7%AE%A1%E7%90%86Secrets/</id>
    <published>2025-08-23T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>我一直用自建的 Vaultwarden 管理密码。最近突然意识到，K3s 集群里的密码都直接写在 Git 仓库里，既不安全也不优雅。于是决定把这些密码迁移到 Bitwarden，并实现自动同步到集群。</p><p>整个过程其实很顺利，这里记录一下操作流程，方便大家参考。</p><h2 id="为什么要做这件事"><a href="#为什么要做这件事" class="headerlink" title="为什么要做这件事"></a>为什么要做这件事</h2><p>虽然我用 ArgoCD 自动发布服务，但密码等敏感信息都直接写在 Git 仓库里。这样做不仅不安全，而且维护起来很麻烦。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755960391002.png" alt="1755960391002.png"></p><p>我希望能有一个自动同步 Secrets 的控制器，把密码从 Bitwarden 自动同步到 K8s 集群，提高安全性和管理效率。正好在 <a href="https://argo-cd.readthedocs.io/en/stable/operator-manual/secret-management/">ArgoCD 文档</a> 里看到官方推荐用独立的 Secrets 管理系统，比如 <a href="https://external-secrets.io/">external-secrets</a>。</p><h2 id="架构设计"><a href="#架构设计" class="headerlink" title="架构设计"></a>架构设计</h2><p>方案很简单：在集群里部署 Bitwarden 的转发服务和 external-secrets 控制器，Secrets 会自动创建到对应的 namespace。</p><p>详细流程可以参考：<a href="https://external-secrets.io/v0.19.2/examples/bitwarden/">argocd bitwarden</a></p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755962102555.png" alt="1755962102555.png"></p><h2 id="实现步骤"><a href="#实现步骤" class="headerlink" title="实现步骤"></a>实现步骤</h2><p>我是用 ArgoCD 做 IaC 管理的，下面用 Application 的方式举例说明。</p><h3 id="安装-external-secrets"><a href="#安装-external-secrets" class="headerlink" title="安装 external-secrets"></a>安装 external-secrets</h3><p>用 Helm 安装 external-secrets，并开启 ClusterSecretStore 的 CRD 支持。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">argoproj.io/v1alpha1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Application</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">external-secrets</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">argocd</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">project:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">source:</span></span><br><span class="line">    <span class="attr">repoURL:</span> <span class="string">&#x27;https://external-secrets.github.io/external-secrets/&#x27;</span></span><br><span class="line">    <span class="attr">chart:</span> <span class="string">external-secrets</span></span><br><span class="line">    <span class="attr">targetRevision:</span> <span class="number">0.19</span><span class="number">.2</span></span><br><span class="line">    <span class="attr">helm:</span></span><br><span class="line">      <span class="attr">parameters:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">bitwarden-sdk-server.enabled</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">&quot;false&quot;</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">&quot;crds.createClusterSecretStore&quot;</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">&quot;true&quot;</span></span><br><span class="line">  <span class="attr">destination:</span></span><br><span class="line">    <span class="attr">server:</span> <span class="string">&#x27;https://kubernetes.default.svc&#x27;</span></span><br><span class="line">    <span class="attr">namespace:</span> <span class="string">external-secrets</span></span><br><span class="line">  <span class="attr">syncPolicy:</span></span><br><span class="line">    <span class="attr">automated:</span></span><br><span class="line">      <span class="attr">selfHeal:</span> <span class="literal">true</span></span><br><span class="line">      <span class="attr">prune:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">syncOptions:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">CreateNamespace=true</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">ServerSideApply=true</span></span><br></pre></td></tr></table></figure><h3 id="部署-Bitwarden-服务"><a href="#部署-Bitwarden-服务" class="headerlink" title="部署 Bitwarden 服务"></a>部署 Bitwarden 服务</h3><p>部署 Bitwarden CLI 服务，确保能正常获取密码。可以在容器里执行 <code>bw list items</code> 验证。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755963071234.png" alt="1755963071234.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">kubectl apply -f - &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">apiVersion: v1</span></span><br><span class="line"><span class="string">kind: Secret</span></span><br><span class="line"><span class="string">metadata:</span></span><br><span class="line"><span class="string">  name: bitwarden-cli</span></span><br><span class="line"><span class="string">  namespace: external-secrets</span></span><br><span class="line"><span class="string">type: Opaque</span></span><br><span class="line"><span class="string">data:</span></span><br><span class="line"><span class="string">  BW_HOST: $(echo -n &quot;https://xxxxx&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">  BW_USERNAME: $(echo -n &quot;&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">  BW_PASSWORD: $(echo -n &quot;&quot; | base64 | tr -d &#x27;\n&#x27;)</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 参考文档：</span></span><br><span class="line"><span class="comment"># https://bitwarden.corvo.fun/#/vault?organizationId=unassigned&amp;search=ext&amp;itemId=502e2c9a-fefc-4d6d-93a9-0f66d7d4191a</span></span><br><span class="line"><span class="comment"># https://external-secrets.io/latest/examples/bitwarden/#deploy-bitwarden-credentials</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line">          <span class="attr">image:</span> <span class="string">ghcr.io/charlesthomas/bitwarden-cli:2025.6.1</span></span><br><span class="line">      <span class="comment"># ...</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="comment"># ...</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">NetworkPolicy</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.k8s.io/v1</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">external-secret-2-bw-cli</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="comment"># ...</span></span><br></pre></td></tr></table></figure><h3 id="配置-external-secrets-的密码获取方式"><a href="#配置-external-secrets-的密码获取方式" class="headerlink" title="配置 external-secrets 的密码获取方式"></a>配置 external-secrets 的密码获取方式</h3><p>告诉 external-secrets 如何从 Bitwarden 获取密码。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-login</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">headers:</span></span><br><span class="line">        <span class="attr">Content-Type:</span> <span class="string">application/json</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.login.<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-fields</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.fields[?@.name==\&quot;<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>\&quot;].value&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-notes</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/item/<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span></span><br><span class="line">        <span class="attr">jsonPath:</span> <span class="string">&quot;$.data.notes&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">bitwarden-attachments</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">provider:</span></span><br><span class="line">    <span class="attr">webhook:</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">&quot;http://bitwarden-cli:8087/object/attachment/<span class="template-variable">&#123;&#123; .remoteRef.property &#125;&#125;</span>?itemid=<span class="template-variable">&#123;&#123; .remoteRef.key &#125;&#125;</span>&quot;</span></span><br><span class="line">      <span class="attr">result:</span> &#123;&#125;</span><br></pre></td></tr></table></figure><h3 id="自动同步密码到集群"><a href="#自动同步密码到集群" class="headerlink" title="自动同步密码到集群"></a>自动同步密码到集群</h3><p>假如你已经在 Bitwarden 里保存了密码，只需创建 ExternalSecret，控制器会自动同步到 K8s 集群。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/23/1755962739832.png" alt="1755962739832.png"></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ExternalSecret</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">refreshInterval:</span> <span class="string">1h</span></span><br><span class="line">  <span class="attr">secretStoreRef:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">bitwarden-secretsmanager</span></span><br><span class="line">    <span class="attr">kind:</span> <span class="string">SecretStore</span></span><br><span class="line">  <span class="attr">data:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">secretKey:</span> <span class="string">AAA</span></span><br><span class="line">    <span class="attr">sourceRef:</span></span><br><span class="line">      <span class="attr">storeRef:</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">bitwarden-notes</span></span><br><span class="line">        <span class="attr">kind:</span> <span class="string">ClusterSecretStore</span></span><br><span class="line">    <span class="attr">remoteRef:</span></span><br><span class="line">      <span class="attr">key:</span> <span class="string">AAA</span></span><br></pre></td></tr></table></figure><p>最终会自动生成 K8s Secret，数据已经同步到集群，可以直接挂载和使用。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">Opaque</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Secret</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line">  <span class="attr">ownerReferences:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">apiVersion:</span> <span class="string">external-secrets.io/v1</span></span><br><span class="line">    <span class="attr">kind:</span> <span class="string">ExternalSecret</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">xx</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">AAA:</span> <span class="string">QkJCQ0NDRERE</span></span><br></pre></td></tr></table></figure><h2 id="总结与建议"><a href="#总结与建议" class="headerlink" title="总结与建议"></a>总结与建议</h2><p>以前用 AWS SSM 管理密码，但因为成本没用起来。现在用 Bitwarden 管理 K8s 密码，既安全又方便。如果线上环境对安全性要求高，建议还是用专业的密码管理工具。</p><p>几点补充说明：</p><ol><li>Bitwarden 是我自建的密码管理工具，已经做了自动备份和容灾，所以用它管理集群密码比较放心。</li><li>Bitwarden 支持权限控制。如果用它管理 K8s 密钥，建议单独建一个 organization 存储，并用专门的用户读取。这样即使集群被攻破，也能保证其他密码安全。</li></ol>]]></content>
    
    
    <summary type="html">之前一直用自建的 Vaultwarden 管理密码，最近发现 K3s 集群的密码都直接写在 Git 仓库里，既不安全也不优雅。于是研究了如何用 Bitwarden 管理集群密码，并实现自动同步。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Kubernetes" scheme="https://corvo.myseu.cn/tags/Kubernetes/"/>
    
    <category term="K3s" scheme="https://corvo.myseu.cn/tags/K3s/"/>
    
    <category term="AWS" scheme="https://corvo.myseu.cn/tags/AWS/"/>
    
    <category term="Bitwarden" scheme="https://corvo.myseu.cn/tags/Bitwarden/"/>
    
    <category term="Vaultwarden" scheme="https://corvo.myseu.cn/tags/Vaultwarden/"/>
    
    <category term="external-secrets" scheme="https://corvo.myseu.cn/tags/external-secrets/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统（三）</title>
    <link href="https://corvo.myseu.cn/2025/08/15/2025-08-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%B8%89)/"/>
    <id>https://corvo.myseu.cn/2025/08/15/2025-08-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%82%A1%E7%A5%A8%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%B8%89)/</id>
    <published>2025-08-15T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>近期我的半自动化交易系统有了两项功能升级：一是扩展了 Telegram 的功能，可以直接在通知消息中通过标签实现买卖操作；二是集成了 LLM（大语言模型）工具，用于分析持仓和仓位变动。</p><h2 id="在-Telegram-中直接执行买卖操作"><a href="#在-Telegram-中直接执行买卖操作" class="headerlink" title="在 Telegram 中直接执行买卖操作"></a>在 Telegram 中直接执行买卖操作</h2><p>以往的半自动化模式是：程序检测到股票价格变化后，自动发送通知到 Telegram，我再根据提醒去券商软件下单。</p><p>最近我对这一流程进行了优化，现在可以直接在 Telegram 的通知消息上通过打标签来实现买卖操作，大大提升了效率和便捷性。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/16/1755357194553.png" alt="1755357194553.png"></p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><p>核心逻辑如下：后端会检查消息的发送者是否为管理员，并判断标签（icon）是否符合要求，只有都满足条件才会继续执行买卖操作。下面是部分实现代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">conv_command</span>(<span class="params">update: Update, context: ContextTypes.DEFAULT_TYPE</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    app_logger.info(<span class="string">f&quot;Update: <span class="subst">&#123;update&#125;</span>, Context: <span class="subst">&#123;context.__dict__&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">str</span>(update.message_reaction.user.<span class="built_in">id</span>) <span class="keyword">not</span> <span class="keyword">in</span> admin_user_ids:</span><br><span class="line">        app_logger.warning(<span class="string">f&quot;User <span class="subst">&#123;update.message_reaction.user.<span class="built_in">id</span>&#125;</span> is not an admin&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    act = update.message_reaction.new_reaction</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> act <span class="keyword">or</span> <span class="keyword">not</span> act[<span class="number">0</span>]:</span><br><span class="line">        app_logger.warning(<span class="string">&quot;No reaction found in the update.&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    emoji_data = act[<span class="number">0</span>].to_dict()</span><br><span class="line">    <span class="keyword">if</span> emoji_data[<span class="string">&#x27;emoji&#x27;</span>] != <span class="string">&#x27;👏&#x27;</span>:</span><br><span class="line">        app_logger.warning(<span class="string">f&quot;Reaction <span class="subst">&#123;act&#125;</span> is not supported&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="comment"># ... buy or sell logic</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    application = Application.builder().token(token).build()</span><br><span class="line">    application.add_handler(MessageReactionHandler(conv_command))</span><br></pre></td></tr></table></figure><p>通过这种方式，用户只需在 Telegram 消息上添加指定标签（如“👏”），系统就会自动完成买卖操作，无需手动切换到券商软件。</p><h2 id="利用-LLM-工具分析持仓与仓位调整"><a href="#利用-LLM-工具分析持仓与仓位调整" class="headerlink" title="利用 LLM 工具分析持仓与仓位调整"></a>利用 LLM 工具分析持仓与仓位调整</h2><p>我参考了 <a href="https://github.com/TauricResearch/TradingAgents">TauricResearch&#x2F;TradingAgents</a> 项目。虽然它主要支持 OpenAI 并且是终端交互，但我借鉴了其中的 prompt 设计，并在自己的系统中集成了 LLM 分析工具。现在，自动化代码生成和模型调用都非常高效，能够快速完成分析任务。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755392398699.png" alt="1755392398699.png"></p><h3 id="TradingAgents-的功能亮点"><a href="#TradingAgents-的功能亮点" class="headerlink" title="TradingAgents 的功能亮点"></a>TradingAgents 的功能亮点</h3><p>TradingAgents 利用 OpenAI 的函数调用能力（<a href="https://platform.openai.com/docs/guides/function-calling">Function Calling</a>），可以自动获取股票行情、检查新闻，并通过多轮交互生成分析报告。整个过程类似如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755360355504.png" alt="1755360355504.png"></p><p>这种方式让模型能够主动调用后端函数，自动完成数据抓取和分析，极大提升了智能化水平。</p><h3 id="我的实际应用"><a href="#我的实际应用" class="headerlink" title="我的实际应用"></a>我的实际应用</h3><p>我没有 OpenAI 的 API，但之前充值了 DeepSeek 的，所以直接用它来做持仓分析。目前项目中的 LLM 交互流程比较简洁：系统会整理最近的持仓数据，上传给 DeepSeek 进行分析，模型会给出仓位变动建议和操作意见。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/08/17/1755400172041.png" alt="1755400172041.png"></p><p>目前我每周查看一次模型生成的报告，已经能够满足日常的持仓管理和策略调整需求。</p><p><img src="https://rawforcorvofeng.cn/flarum/2025/08/16/41d2d526-346e-49e0-aedb-46c9ab7fc933-image.png" alt="image.png"></p>]]></content>
    
    
    <summary type="html">本文介绍近期系统的主要改动，包括 Telegram 扩展功能和 LLM 工具的集成。现在可以直接在 Telegram 通知中打标签实现买卖操作，并利用大模型分析持仓及仓位变动。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="ChatGPT" scheme="https://corvo.myseu.cn/tags/ChatGPT/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="ECharts" scheme="https://corvo.myseu.cn/tags/ECharts/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
    <category term="DeepSeek" scheme="https://corvo.myseu.cn/tags/DeepSeek/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统(二)</title>
    <link href="https://corvo.myseu.cn/2025/06/15/2025-06-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%8C)/"/>
    <id>https://corvo.myseu.cn/2025/06/15/2025-06-15-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F(%E4%BA%8C)/</id>
    <published>2025-06-15T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>最近两个月, 我又完善了一下交易系统. 目前bolt已经支持了<a href="https://support.bolt.new/integrations/git">GitHub项目的集成</a>, 我就顺势把前后端代码分开了.</p><p>前端代码完全使用bolt来生成的, 因此我开源了一份<a href="https://github.com/corvofeng/trader-frontend-mirror">放在GitHub corvofeng&#x2F;trader-frontend-mirror</a>,会不定期同步最新代码过去. 纯前端页面部署了一份在Cloudflare上, 可以直接预览这里:</p><p><a href="https://trader-front-mirror.corvofeng.workers.dev/">https://trader-front-mirror.corvofeng.workers.dev/</a></p><!-- ![1749951978788.png](https://rawforcorvofeng.cn/blog/2025/06/15/1749951978788.png) --><h1 id="新增的几个功能"><a href="#新增的几个功能" class="headerlink" title="新增的几个功能"></a>新增的几个功能</h1><h2 id="展示自动操作记录"><a href="#展示自动操作记录" class="headerlink" title="展示自动操作记录"></a>展示自动操作记录</h2><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955395119.png" alt="1749955395119.png"></p><p>这个功能主要是确认我的程序是不是在正常运行, 所以我在关键位置打点了, 偶尔翻下记录就能知道有没有正常在跑.AI生成代码真的好用, 这个功能我自己写肯定要花不少时间.</p><h2 id="Treemap展示股票持仓"><a href="#Treemap展示股票持仓" class="headerlink" title="Treemap展示股票持仓"></a>Treemap展示股票持仓</h2><p>Treemap 这里是用的 echarts 的组件.</p><p><a href="https://echarts.apache.org/examples/en/index.html#chart-type-treemap">https://echarts.apache.org/examples/en/index.html#chart-type-treemap</a></p><p>说真的, 这个组件我用了很多的 token, 每次不满意就要重新生成一整个组件代码, 而且需要不少手动微调.</p><p>目前可以根据资金量展示不同大小的卡片, 当日的盈亏情况展示不同颜色.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955483322.png" alt="1749955483322.png"></p><p>点开分组之后可以查看每个股票的持仓情况.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955499836.png" alt="1749955499836.png"></p><h2 id="上传券商导出的持仓文件"><a href="#上传券商导出的持仓文件" class="headerlink" title="上传券商导出的持仓文件"></a>上传券商导出的持仓文件</h2><p>因为我有一些券商没有开通QMT, 只能导出xls文件来查看仓位, 我想顺便集成到这个系统中,就增加了这个功能.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749955449612.png" alt="1749955449612.png"></p><p>在用户上传持仓文件之后, 后台程序会解析持仓并返回预览, 而且会提供一个uuid来提供查看和分享</p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749956853677.png" alt="1749956853677.png"></p><p><img src="https://rawforcorvofeng.cn/blog/2025/06/15/1749957323780.png" alt="1749957323780.png"></p><h1 id="一些功能展望"><a href="#一些功能展望" class="headerlink" title="一些功能展望"></a>一些功能展望</h1><p>以下功能是我准备逐步增加的:</p><ul><li>多种券商持仓文件的支持</li></ul><blockquote><p>我自己只测试了两种券商, 中金财富和国泰君安, 如果用户有其他券商的持仓文件需要导入, 可能会考虑支持.</p></blockquote><ul><li>期权价格的监听</li></ul><blockquote><p>期权和保险的功能类似, 可以令你拥有稳定现金流的工具.我近期的很多时间也放在了期权交易上, 所以可能会在这方面投入一些时间</p></blockquote><ul><li>AI分析持仓</li></ul><blockquote><p> 用户在上传持仓文件后, 可以丢给AI, 针对持仓风格给出一些建议</p></blockquote>]]></content>
    
    
    <summary type="html">最近两个月, 我又完善了一下交易系统. 在之前的基础上又增加了一些新功能. 也包括一些未来的功能展望.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="ECharts" scheme="https://corvo.myseu.cn/tags/ECharts/"/>
    
    <category term="期权" scheme="https://corvo.myseu.cn/tags/%E6%9C%9F%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>日经ETF的一些技术面统计</title>
    <link href="https://corvo.myseu.cn/2025/05/24/2025-05-24-%E6%97%A5%E7%BB%8FETF%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E6%9C%AF%E9%9D%A2%E7%BB%9F%E8%AE%A1/"/>
    <id>https://corvo.myseu.cn/2025/05/24/2025-05-24-%E6%97%A5%E7%BB%8FETF%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E6%9C%AF%E9%9D%A2%E7%BB%9F%E8%AE%A1/</id>
    <published>2025-05-24T15:32:41.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<script src="https://cdn.jsdelivr.net/npm/plotly.js-dist-min@3.0.1/plotly.min.js"></script><style>.js-plotly-plot,.plotly-graph-div {  width: 100% !important;  max-width: 100% !important;}.js-plotly-plot {  overflow-x: auto;  -webkit-overflow-scrolling: touch;}</style><p>我个人从去年开始就逐步买入日经相关的场外基金, 也同时在场内有看 <a href="https://xueqiu.com/S/SH513520">日经ETF(SH:513520)</a> 这只ETF基金:在当时我使用 Backtrader 做回测时, 这只基金是我回测最多的, 所以我也针对它做了一些技术面的统计.</p><blockquote><p>其分析结果仅仅是一种技术面的观察, 不能预测未来趋势, 也不保证买了就可以赚钱,如果你认为只是技术面分析就能稳赚不赔, 我可能会认为你并不适合炒股, 也不适合做我的读者.</p></blockquote><p>如果想要查看部分代码, 以及更加优雅的图形交互, 请打开 <a href="https://colab.research.google.com/drive/1Lx0dRRFGdyECvKhS5LYry7L4Oz7CwKPf">Google Colab地址</a>.</p><h2 id="亏损盈利分布"><a href="#亏损盈利分布" class="headerlink" title="亏损盈利分布"></a>亏损盈利分布</h2><h3 id="当日相比前一日的盈亏情况"><a href="#当日相比前一日的盈亏情况" class="headerlink" title="当日相比前一日的盈亏情况"></a>当日相比前一日的盈亏情况</h3><blockquote><p>计算基于盘中价格相对于前一日最高价和最低价的不同盈亏情景概率。比如横座标</p><ul><li>0.05表明, 今日的最低价相比昨日的收盘价下跌超过5%</li><li>-0.05表明, 今日的最高价相比昨日的收盘价上涨超过5%</li></ul></blockquote><p>我本来是想使用正态分布做拟合的, 但是当我把数据贴给ChatGPT的时候, 它帮我做了几种不同分布的拟合分析,发现下面这个分布更加适合 Lorentzian 分布</p><table><thead><tr><th>特性</th><th>描述</th></tr></thead><tbody><tr><td><strong>重尾（fat tails）</strong></td><td>比高斯分布的尾部更“厚重”，意味着极端值出现的概率更高</td></tr><tr><td><strong>无定义的均值和方差</strong></td><td>理论上平均值、方差都<strong>不存在</strong>，因为积分发散</td></tr><tr><td><strong>中心尖锐</strong></td><td>峰值区域比高斯更尖锐，快速变化</td></tr><tr><td><strong>峰值对称</strong></td><td>关于中心对称</td></tr><tr><td><strong>多见于物理过程</strong></td><td>如<strong>共振峰</strong>、<strong>谱线展宽</strong>、<strong>傅里叶变换中的响应函数</strong></td></tr></tbody></table><div id='e6782097-d8f6-43e8-8e28-c501e7c730be' width="80%"></div><script>window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e6782097-d8f6-43e8-8e28-c501e7c730be")) {                    Plotly.newPlot(                        "e6782097-d8f6-43e8-8e28-c501e7c730be",                        [{"marker":{"color":"blue"},"mode":"markers+lines","name":"Probability (Actual)","x":{"dtype":"f8","bdata":"CtejcD0Kt797FK5H4Xq0v+xRuB6F67G\u002fuB6F61G4rr+amZmZmZmpv3sUrkfheqS\u002fuB6F61G4nr8ZBFYOLbKdv9nO91PjpZu\u002fmpmZmZmZmb9aZDvfT42Xvxsv3SQGgZW\u002f2\u002fl+arx0k7+cxCCwcmiRv7gehetRuI6\u002fObTIdr6fir+6SQwCK4eGvzvfT42XboK\u002feekmMQisfL97FK5H4Xp0v3sUrkfhenQ\u002feekmMQisfD8730+Nl26CP7pJDAIrh4Y\u002fObTIdr6fij+4HoXrUbiOP5zEILByaJE\u002f2\u002fl+arx0kz8bL90kBoGVP1pkO99PjZc\u002fmpmZmZmZmT\u002fZzvdT46WbPxkEVg4tsp0\u002fuB6F61G4nj97FK5H4XqkP5qZmZmZmak\u002fuB6F61G4rj\u002fsUbgeheuxP3sUrkfherQ\u002fCtejcD0Ktz8="},"y":{"dtype":"f8","bdata":"HwdUrCQXgT8ptBo7hsmGP2xfzJ4eNog\u002fdgyTLYDojT\u002fnCGnX7VyVP5KLCJibxZs\u002f8bUvZk8Pqz\u002fVNrr7MzKtP1inttHdn7E\u002fFp58vscBtT89yri3RJG4P5yWV9Z6qbw\u002f5mbxhmuOwD\u002fBrWgGsjTEP1kaakqh1cg\u002f1Ta6+zMyzT95lHFviSLRP3ArmoEsDdU\u002f+u9CfO2L2T9Hd39GpkPePwk6ExaefN4\u002fs6eHDQbh2D8I9iN1md\u002fUP4kiMao+sM8\u002fbDAIx1+dyj88+XyPAyrGP1inttHdn8E\u002fbQFE76AEvT+b9N+F+Nq3PzwoQWfCwrM\u002ffjF7ethgsD\u002fxtS9mTw+rP\u002foeB1SsJKc\u002fiN5BCToTpj\u002fVNrr7MzKdPwOI3kEJOpM\u002fKbQaO4bJhj9isgUQvYOCP7m3RJEYVX8\u002fHwdUrCQXcT8="},"type":"scatter"},{"line":{"color":"red","dash":"dash"},"mode":"lines","name":"Probability (Fitted)","x":{"dtype":"f8","bdata":"CtejcD0Kt7+7\u002f9aJmfK2v20oCqP12ra\u002fHlE9vFHDtr\u002fQeXDVrau2v4Gio+4JlLa\u002fM8vWB2Z8tr\u002fk8wkhwmS2v5YcPToeTba\u002fR0VwU3o1tr\u002f5baNs1h22v6qW1oUyBra\u002fXL8Jn47utb8N6Dy46ta1v78QcNFGv7W\u002fcDmj6qKntb8iYtYD\u002f4+1v9OKCR1beLW\u002fhLM8Nrdgtb823G9PE0m1v+cEo2hvMbW\u002fmS3WgcsZtb9KVgmbJwK1v\u002fx+PLSD6rS\u002fradvzd\u002fStL9f0KLmO7u0vxD51f+Xo7S\u002fwiEJGfSLtL9zSjwyUHS0vyVzb0usXLS\u002f1puiZAhFtL+IxNV9ZC20vzntCJfAFbS\u002f6hU8sBz+s7+cPm\u002fJeOazv01nouLUzrO\u002f\u002f4\u002fV+zC3s7+wuAgVjZ+zv2LhOy7ph7O\u002fEwpvR0Vws7\u002fFMqJgoVizv3Zb1Xn9QLO\u002fKIQIk1kps7\u002fZrDustRGzv4rVbsUR+rK\u002fPP6h3m3isr\u002fuJtX3ycqyv59PCBEms7K\u002fUHg7KoKbsr8CoW5D3oOyv7TJoVw6bLK\u002fZfLUdZZUsr8WGwiP8jyyv8hDO6hOJbK\u002feWxuwaoNsr8rlaHaBvaxv9y91PNi3rG\u002fjuYHDb\u002fGsb8\u002fDzsmG6+xv\u002fE3bj93l7G\u002fomChWNN\u002fsb9UidRxL2ixvwWyB4uLULG\u002ftto6pOc4sb9oA269QyGxvxosodafCbG\u002fy1TU7\u002fvxsL98fQcJWNqwvy6mOiK0wrC\u002f385tOxCrsL+R96BUbJOwv0Ig1G3Ie7C\u002f9EgHhyRksL+lcTqggEywv1eabbncNLC\u002fCMOg0jgdsL+669PrlAWwv9YoDgri26+\u002fOXp0PJqsr7+cy9puUn2vv\u002f8cQaEKTq+\u002fYm6n08Ier7\u002fFvw0Ge++uvygRdDgzwK6\u002fi2LaauuQrr\u002fus0Cdo2Guv1AFp89bMq6\u002ftFYNAhQDrr8WqHM0zNOtv3n52WaEpK2\u002f3EpAmTx1rb8\u002fnKbL9EWtv6LtDP6sFq2\u002fBT9zMGXnrL9okNliHbisv8vhP5XViKy\u002fLjOmx41ZrL+RhAz6RSqsv\u002fTVciz++qu\u002fVyfZXrbLq7+6eD+Rbpyrvx3KpcMmbau\u002fgBsM9t49q7\u002fjbHIolw6rv0a+2FpP36q\u002fqA8\u002fjQewqr8LYaW\u002fv4Cqv26yC\u002fJ3Uaq\u002f0QNyJDAiqr80VdhW6PKpv5emPomgw6m\u002f+veku1iUqb9dSQvuEGWpv8CacSDJNam\u002fI+zXUoEGqb+GPT6FOdeov+mOpLfxp6i\u002fTOAK6ql4qL+vMXEcYkmovxKD104aGqi\u002fdNQ9gdLqp7\u002fXJaSzirunvzp3CuZCjKe\u002fnchwGPtcp78AGtdKsy2nv2NrPX1r\u002fqa\u002fxryjryPPpr8pDgri25+mv4xfcBSUcKa\u002f77DWRkxBpr9SAj15BBKmv7VTo6u84qW\u002fGKUJ3nSzpb979m8QLYSlv95H1kLlVKW\u002fQZk8dZ0lpb+k6qKnVfakvwY8CdoNx6S\u002faY1vDMaXpL\u002fM3tU+fmikvy8wPHE2OaS\u002fkoGio+4JpL\u002f10gjWptqjv1gkbwhfq6O\u002fu3XVOhd8o78exzttz0yjv4EYop+HHaO\u002f5GkI0j\u002fuor9Hu24E+L6iv6oM1Tawj6K\u002fDV47aWhgor9wr6GbIDGiv9IACM7YAaK\u002fNVJuAJHSob+Yo9QySaOhv\u002fv0OmUBdKG\u002fXkahl7lEob\u002fBlwfKcRWhvyTpbfwp5qC\u002fhzrULuK2oL\u002fqizphmoegv03doJNSWKC\u002fsC4HxgopoL8mANvwhfOfv+yip1X2lJ+\u002fskV0umY2n7946EAf19eevz6LDYRHeZ6\u002fBC7a6Lcanr\u002fI0KZNKLydv45zc7KYXZ2\u002fVBZAFwn\u002fnL8auQx8eaCcv+Bb2eDpQZy\u002fqP6lRVrjm79soXKqyoSbvzBEPw87Jpu\u002f+OYLdKvHmr+8idjYG2mav4QspT2MCpq\u002fSM9xovyrmb8Qcj4HbU2Zv9QUC2zd7pi\u002fnLfX0E2QmL9gWqQ1vjGYvyj9cJou05e\u002f7J89\u002f550l7+0QgpkDxaXv3jl1sh\u002ft5a\u002fQIijLfBYlr8EK3CSYPqVv8zNPPfQm5W\u002fkHAJXEE9lb9UE9bAsd6Uvxy2oiUigJS\u002f4FhvipIhlL+o+zvvAsOTv2yeCFRzZJO\u002fNEHVuOMFk7\u002f446EdVKeSv8CGboLESJK\u002fhCk75zTqkb9MzAdMpYuRvxBv1LAVLZG\u002f2BGhFYbOkL+ctG169m+Qv2RXOt9mEZC\u002fUPQNiK5lj7\u002fgOadRj6iOv2h\u002fQBtw642\u002f8MTZ5FAujb+ACnOuMXGMvwhQDHgStIu\u002fmJWlQfP2ir8g2z4L1DmKv7Ag2NS0fIm\u002fOGZxnpW\u002fiL\u002fIqwpodgKIv1DxozFXRYe\u002f4DY9+zeIhr9ofNbEGMuFv\u002fjBb475DYW\u002fgAcJWNpQhL8QTaIhu5ODv5iSO+ub1oK\u002fINjUtHwZgr+wHW5+XVyBvzhjB0g+n4C\u002fkFFBIz7Ef7+g3HO2\u002f0l+v8BnpknBz3y\u002f0PLY3IJVe7\u002fwfQtwRNt5vwAJPgMGYXi\u002fIJRwlsfmdr8wH6MpiWx1v1Cq1bxK8nO\u002fYDUIUAx4cr+AwDrjzf1wvyCX2uweB2+\u002fQK0\u002fE6ISbL+Aw6Q5JR5pv6DZCWCoKWa\u002f4O9uhis1Y78ABtSsrkBgv4A4cqZjmFq\u002fwGQ882mvVL+AIg2A4IxNvwB7oRntukG\u002fAFDXzOajJ78ATtfM5qMnP4B6oRntukE\u002fACINgOCMTT+AZDzzaa9UP0A4cqZjmFo\u002f4AXUrK5AYD\u002fA726GKzVjP6DZCWCoKWY\u002fYMOkOSUeaT9ArT8TohJsPwCX2uweB28\u002fcMA64839cD9QNQhQDHhyP0Cq1bxK8nM\u002fIB+jKYlsdT8QlHCWx+Z2P\u002fAIPgMGYXg\u002f4H0LcETbeT\u002fA8tjcglV7P7BnpknBz3w\u002fkNxztv9Jfj+AUUEjPsR\u002fPzBjB0g+n4A\u002fqB1ufl1cgT8g2NS0fBmCP5CSO+ub1oI\u002fCE2iIbuTgz94BwlY2lCEP\u002fDBb475DYU\u002fYHzWxBjLhT\u002fYNj37N4iGP0jxozFXRYc\u002fwKsKaHYCiD8wZnGelb+IP6gg2NS0fIk\u002fGNs+C9Q5ij+QlaVB8\u002faKPwBQDHgStIs\u002feApzrjFxjD\u002fwxNnkUC6NP2B\u002fQBtw640\u002f2DmnUY+ojj9I9A2IrmWPP2BXOt9mEZA\u002fmLRtevZvkD\u002fUEaEVhs6QPwxv1LAVLZE\u002fSMwHTKWLkT+AKTvnNOqRP7yGboLESJI\u002f9OOhHVSnkj8wQdW44wWTP2ieCFRzZJM\u002fpPs77wLDkz\u002fgWG+KkiGUPxi2oiUigJQ\u002fVBPWwLHelD+McAlcQT2VP8jNPPfQm5U\u002fACtwkmD6lT88iKMt8FiWP3Tl1sh\u002ft5Y\u002fsEIKZA8Wlz\u002fonz3\u002fnnSXPyT9cJou05c\u002fXFqkNb4xmD+Yt9fQTZCYP9AUC2zd7pg\u002fDHI+B21NmT9Ez3Gi\u002fKuZP4AspT2MCpo\u002fvInY2Btpmj\u002f05gt0q8eaPzBEPw87Jps\u002faKFyqsqEmz+k\u002fqVFWuObP9xb2eDpQZw\u002fGLkMfHmgnD9QFkAXCf+cP4xzc7KYXZ0\u002fxNCmTSi8nT8ALtrotxqePziLDYRHeZ4\u002fdOhAH9fXnj+sRXS6ZjafP+iip1X2lJ8\u002fIADb8IXznz+uLgfGCimgP0zdoJNSWKA\u002f6Is6YZqHoD+GOtQu4ragPyLpbfwp5qA\u002fwJcHynEVoT9cRqGXuUShP\u002fr0OmUBdKE\u002flqPUMkmjoT80Um4AkdKhP9AACM7YAaI\u002fbK+hmyAxoj8MXjtpaGCiP6gM1Tawj6I\u002fRLtuBPi+oj\u002fkaQjSP+6iP4AYop+HHaM\u002fHMc7bc9Moz+4ddU6F3yjP1gkbwhfq6M\u002f9NII1qbaoz+QgaKj7gmkPywwPHE2OaQ\u002fzN7VPn5opD9ojW8MxpekPwQ8CdoNx6Q\u002foOqip1X2pD9AmTx1nSWlP9xH1kLlVKU\u002fePZvEC2EpT8UpQnedLOlP7RTo6u84qU\u002fUAI9eQQSpj\u002fssNZGTEGmP4xfcBSUcKY\u002fKA4K4tufpj\u002fEvKOvI8+mP2BrPX1r\u002fqY\u002fABrXSrMtpz+cyHAY+1ynPzh3CuZCjKc\u002f1CWks4q7pz901D2B0uqnPxCD104aGqg\u002frDFxHGJJqD9I4ArqqXioP+iOpLfxp6g\u002fhD0+hTnXqD8g7NdSgQapP8CacSDJNak\u002fXEkL7hBlqT\u002f496S7WJSpP5SmPomgw6k\u002fNFXYVujyqT\u002fQA3IkMCKqP2yyC\u002fJ3Uao\u002fCGGlv7+Aqj+oDz+NB7CqP0S+2FpP36o\u002f4GxyKJcOqz98Gwz23j2rPxzKpcMmbas\u002fuHg\u002fkW6cqz9UJ9letsurP\u002fTVciz++qs\u002fkIQM+kUqrD8sM6bHjVmsP8jhP5XViKw\u002faJDZYh24rD8EP3MwZeesP6DtDP6sFq0\u002fPJymy\u002fRFrT\u002fcSkCZPHWtP3j52WaEpK0\u002fFKhzNMzTrT+wVg0CFAOuP1AFp89bMq4\u002f7LNAnaNhrj+IYtpq65CuPyQRdDgzwK4\u002fxL8NBnvvrj9gbqfTwh6vP\u002fwcQaEKTq8\u002fnMvablJ9rz84enQ8mqyvP9QoDgri268\u002fuOvT65QFsD8Iw6DSOB2wP1aabbncNLA\u002fpHE6oIBMsD\u002fySAeHJGSwP0Ig1G3Ie7A\u002fkPegVGyTsD\u002fezm07EKuwPyymOiK0wrA\u002ffH0HCVjasD\u002fKVNTv+\u002fGwPxgsodafCbE\u002faANuvUMhsT+22jqk5zixPwSyB4uLULE\u002fUonUcS9osT+iYKFY03+xP\u002fA3bj93l7E\u002fPg87JhuvsT+M5gcNv8axP9y91PNi3rE\u002fKpWh2gb2sT94bG7Bqg2yP8ZDO6hOJbI\u002fFhsIj\u002fI8sj9k8tR1llSyP7LJoVw6bLI\u002fAqFuQ96Dsj9QeDsqgpuyP55PCBEms7I\u002f7CbV98nKsj88\u002fqHebeKyP4rVbsUR+rI\u002f2Kw7rLURsz8mhAiTWSmzP3Zb1Xn9QLM\u002fxDKiYKFYsz8SCm9HRXCzP2DhOy7ph7M\u002fsLgIFY2fsz\u002f+j9X7MLezP0xnouLUzrM\u002fnD5vyXjmsz\u002fqFTywHP6zPzjtCJfAFbQ\u002fhsTVfWQttD\u002fWm6JkCEW0PyRzb0usXLQ\u002fcko8MlB0tD\u002fAIQkZ9Iu0PxD51f+Xo7Q\u002fXtCi5ju7tD+sp2\u002fN39K0P\u002fp+PLSD6rQ\u002fSlYJmycCtT+YLdaByxm1P+YEo2hvMbU\u002fNtxvTxNJtT+Eszw2t2C1P9KKCR1beLU\u002fIGLWA\u002f+PtT9wOaPqoqe1P74QcNFGv7U\u002fDOg8uOrWtT9avwmfju61P6qW1oUyBrY\u002f+G2jbNYdtj9GRXBTejW2P5QcPToeTbY\u002f5PMJIcJktj8yy9YHZny2P4Cio+4JlLY\u002fznlw1a2rtj8eUT28UcO2P2woCqP12rY\u002fuv\u002fWiZnytj8K16NwPQq3Pw=="},"y":{"dtype":"f8","bdata":"xSHvLhLKez85OdMw7gJ8P2yM\u002f7t4PHw\u002fDkDbmrR2fD+YnRSmpLF8P5i5+MRL7Xw\u002fcI3N7awpfT\u002fLmC4my2Z9P2EfbIOppH0\u002fuBjtKkvjfT\u002f355NSsyJ+PzXzJUHlYn4\u002f4DG2TuSjfj9iyxLls+V+P27fNYBXKH8\u002fCpO5rtJrfz+VfU8SKbB\u002fP+KSO2Be9X8\u002f9FPpMLsdgD+JWH56OkGAPx1tXQYvZYA\u002fwszY2JqJgD\u002fgb1sBgK6AP\u002fdEsprg04A\u002fxJxXy775gD\u002fX3MDFHCCBP\u002fKMrsj8RoE\u002fx9N+H2FugT\u002f6eIIiTJaBP7CCVDfAvoE\u002fP4Y00b\u002fngT8bxGNxTRGCP3UohadrO4I\u002fnkoAEh1mgj+mhmdeZJGCP5BN4UlEvYI\u002ficmUob\u002fpgj8g9RlD2RaDPyhF7RyURIM\u002f2gbnLvNygz+YlLaK+aGDP5OFYVSq0YM\u002fuv3GwggChD8uRScgGDOEP8jPr8rbZIQ\u002fS98LNVeXhD9i7PnmjcqEP2ME5n2D\u002foQ\u002f+UuJrTszhT+72I5AumiFP9AVPhkDn4U\u002fEeoqMhrWhT9s2OueAw6GP7ZV1ozDRoY\u002fy5HBQ16Ahj9D9M8m2LqGP0yQP7U19oY\u002fktVBi3syhz\u002f+x9pirm+HP3EKyBTTrYc\u002f6gxwme7shz9usdkJBi2IP0G\u002frKAebog\u002flH87uz2wiD9R45XaaPOIP8CVpqSlN4k\u002fY2Ra5fl8iT9FadKPa8OJPxFqob8AC4o\u002feeMUur9Tij\u002fmPYrvrp2KP8+u0PzU6Io\u002fh0+YrDg1iz+O+e744IKLP5d+ywzV0Ys\u002fQtqnRRwijD+eAis1vnOMP+AE46LCxow\u002f2yMQjjEbjT\u002fjtoEvE3GNP8GQhftvyI0\u002flsDqo1Ahjj+ZiBgavnuOP7FxOpHB144\u002fb26CgGQ1jz\u002f4C4KlsJSPP4q8mwaw9Y8\u002fLqrGejYskD9EcAoJeV6QPwuHWCalkZA\u002f6TO\u002fdMDFkD\u002f+YJnB0PqQP34eHAfcMJE\u002fe630behnkT8C3PdO\u002fJ+RP\u002f2E4zQe2ZE\u002fcxEz3lQTkj9q5Ac\u002fp06SP16nJoMci5I\u002fSHoKELzIkj81GA+HjQeTP10Qs8eYR5M\u002fM0Pz8eWIkz+g48BofcuTP0tOk9RnD5Q\u002fZBsXJq5UlD9P4\u002fuYWZuUP7ND4rZz45Q\u002fh8hrWgYtlT+idG6yG3iVP32+TUW+xJU\u002fXfB69PgSlj\u002fD9x4A12KWPwjO7wpktJY\u002fDcQzHqwHlz85HfWtu1yXP\u002fmJaJ2fs5c\u002fsDiJQ2UMmD8eXe1vGmeYP5g51m\u002fNw5g\u002fXeR+E40imT9MNK2zaIOZP3p1iDdw5pk\u002fqr25GrRLmj8N9dlzRbOaP+rmMfs1HZs\u002fIfLQEZiJmz+HOf\u002fIfvibP5qBEOr9aZw\u002fTDud\u002finenD9WkydZGFWdP5a7Mh7fzp0\u002frAfTTZVLnj\u002f04L3NUsueP\u002f8H4XMwTp8\u002fKxOJEUjUnz8Fzo8\u002f2i6gP\u002fsLRdRIdaA\u002fH3YZTX69oD9gdmPHiQehP1MO2f56U6E\u002ftZ4zVWKhoT+yPD\u002faUPGhP1UiXFRYQ6I\u002fuTV5SYuXoj\u002fLF48I\u002fe2iPxGpo7PBRqM\u002fmHheSu6hoz9UIDe1mP+jP4EqR9HXX6Q\u002fgr7JfMPCpD8jAVSkdCilPxvN0VAFkaU\u002foi1TtpD8pT8B17dDM2umP9C3RrMK3aY\u002fPqtAHDZSpz+AUH4F1sqnPyYXKnkMR6g\u002fHKuoGf3GqD8fF8M3zUqpP9cwJ+qj0qk\u002fti9UJqpeqj\u002fOrgrbCu+qPyvKWAzzg6s\u002fiolc8ZEdrD8IXNgTGbysPyIJt3G8X60\u002f+ymeoLIIrj\u002fx96\u002fzNLeuPwgAn6N\u002fa68\u002fLAmc\u002fOgSsD9lRUQ9N3OwP6JoZI3N1rA\u002f50+attA9sT\u002fpGn5tZ6ixP3yIPW66FrI\u002fGwHxmvSIsj\u002fStMEbQ\u002f+yPw18+IDVebM\u002fEjgN5934sz\u002fJK84ckXy0P7MftssmBbU\u002fLf6GotmStT9A1jyC5yW2P5exaq2RvrY\u002fxT8P+hxdtz9Sy+oF0gG4P20EWm39rLg\u002fo5ixBPBeuT\u002fi\u002fAwU\u002fxe6PyzQdpWE2Lo\u002fB1xCdd+guz\u002fiWlvUc3G8P3uuOkyrSr0\u002fkT8TNPUsvj9e86jmxhi\u002fP5yyDQROB8A\u002f4c1eZXuHwD8l6uwYMA3BP2iCfSi0mME\u002fuX0BQ1Mqwj9c6PjVXMLCPxCn5yEkYcM\u002fwxZPSAAHxD\u002fLXVBRTLTEP2STvSZnacU\u002foSHzgbMmxj8IIlXJl+zGP61HvNl9u8c\u002fqap5t9KTyD9AXd8hBnbJP+6ObAOKYso\u002fyJjXt9FZyz90fzggUVzMP0Ygj3x7as0\u002fPRrQAMKEzj8b\u002fpQakqvPP1lwx62pb9A\u002f7eUBfjIQ0T+OwgZ0jbfRP7IJFSXdZdI\u002fGpoTwzob0z\u002fel2TMs9fTP6hXiGlHm9Q\u002fhpwGduNl1T\u002fGfxA1YTfWP9ucdbaBD9c\u002f0fsQ9unt1z+VDOrGHtLYP0RJBaSAu9k\u002fhn8\u002fi0ep2j8C4FQSf5rbP0qc4vICjtw\u002fLjnuVnyC3T+SiAY7YHbeP4pxtUPvZ98\u002ffFLQs5sq4D+BewXmC57gP+uTCpIjDeE\u002fplodZa524T8ThQ1TbtnhPxh8ld8iNOI\u002fz830kJGF4j+8ma8+j8ziP8OebNAJCOM\u002fBQ8q5xE34z+6lrfa41jjP6eUQ3LvbOM\u002fjg8Ty91y4z9Op1T8lGrjP5stITA5VOM\u002fJ+WnGysw4z+gJyz1A\u002f\u002fiP9cZVDePweI\u002fe3Z4qMJ44j\u002fuRwE2tSXiP7wnhD2VyeE\u002fIl3V155l4T\u002flZBmoEvvgP\u002f6S+pUti+A\u002fn1\u002fMuiEX4D9EflhTIUDfP4lAsDsOTt4\u002fY3NSBfRZ3T8je+5tiWXcP9P7ccRQcts\u002ff93bV5iB2j+qwmxJfJTZPzaIo2Xpq9g\u002fDR61sKDI1z8w1gVfO+vWP7OH9\u002f4uFNY\u002f+4DzpdFD1T9Pmyj+XXrUP0COkhz3t9M\u002fBSRYD6z80j8fYWEbe0jSP1KKUqVUm9E\u002fDJoLxh310D8wpZqNslXQP67M4fLPec8\u002fftCfRxtVzj\u002fz+PVl3jzNP2S4zB2rMMw\u002fZIP\u002fxw8wyz8vt7jymDrKP\u002f0ZUcDST8k\u002ft0BqA0pvyD8edeshjZjHPzdoeccsy8Y\u002fAtz7brwGxj9ioc\u002fJ0krFP9ZOYgoKl8Q\u002f04wpFwDrwz+09jGqVkbDP\u002f6+4GCzqMI\u002fkEP2vr8Rwj8ICWUnKYHBP3pxJs2g9sA\u002f1D3bndtxwD9FlG9PJOW\u002fP7PS8vcA8b4\u002f75bTHcwGvj8LP4ssCya9Px3fZs1JTrw\u002fAfWroRl\u002fuz+pNtL8Ebi6P6iYgZ\u002fP+Lk\u002f7Kjcc\u002fRAuT95FX9LJ5C4P8eqfZ8T5rc\u002fB1CfUmlCtz9KzfR13KS2P8XG5g8lDbY\u002fk8vF5f56tT+RHN9HKe60P92KEeBmZrQ\u002ffiDYgn3jsz8H77sCNmWzP\u002fIcGwZc67I\u002fRO4w3711sj\u002fN30hmLASyP3\u002ffBdZ6lrE\u002fIxemqX4ssT8Fiit9D8awP7DeUe8GY7A\u002fLgA6hUADsD\u002fPiGkfM02vPy3PLCTima4\u002fa9X6VE\u002fsrT83YPD2PkStP1gZ6y14oaw\u002fqcfa1MQDrD8wkl5Y8WqrPy0JjJPM1qo\u002frXK\u002fridHqj9Qj1YA1rupP465OO+sNKk\u002fIN8Q14OxqD\u002f1Yx\u002fuMzKoP4B8iyyYtqc\u002fI\u002focNY0+pz\u002fC4Ug\u002f8cmmP1RufAKkWKY\u002fF1yToobqpT8sgWede3+lP9fRaLlmF6U\u002fgPYt9SyypD8GlO53tE+kP0JR2YLk76M\u002feIE4Y6WSoz\u002fWK1ll4DejP0nqKMh\u002f36I\u002fK9F\u002fsW6Joj97PQwjmTWiP5kH1+\u002fr46E\u002f4i9XslSUoT92pwzDwUahP5Fcmi8i+6A\u002fOi1YsmWxoD\u002fJ11WqfGmgP+5syBNYI6A\u002fPVu4AdO9nz+EO8olRjifP9bc0efutZ4\u002fzmr6oLM2nj\u002fZbeqje7qdP2KdtTEvQZ0\u002f2ZVcb7fKnD\u002fxltJb\u002flacPyXogcbu5Zs\u002fRPFHRnR3mz9lfuIwewubP5oKyJLwoZo\u002fKUhlJ8I6mj8BdbpR3tWZP6xaUxU0c5k\u002fiSaVD7MSmT+YjV1xS7SYPzjz7vjtV5g\u002fd4gl7Iv9lz+llfESF6WXP6JWE7KBTpc\u002fAAcVhr75lj9w63++wKaWP+JUSfl7VZY\u002fGsR0PuQFlj83fej77beVP24BcgGOa5U\u002fWAj4fLkglT+JtNf2ZdeUP03eak6Jj5Q\u002fEG61thlJlD9J2zezDQSUP8\u002f\u002f5BRcwJM\u002f2Ic59\u002ft9kz8eX3O95DyTP\u002fSQ5w8O\u002fZI\u002flyZ12W++kj8FohNFAoGSP\u002fDGe7u9RJI\u002fOXTp4JoJkj\u002ftYPWSks+RP8ifheadlpE\u002fSdrTJbZekT\u002fGQojO1CeRP3VJ6I\u002fz8ZA\u002ffS0YSQy9kD8Ajm4HGYmQP8Qq2QQUVpA\u002f9w1SpvcjkD8Ixsj0fOWPP3iOgG\u002fGhI8\u002fotS5d8Eljz8AuVATZMiOP7bhiJCkbI4\u002f5EGgg3kSjj9izXnE2bmNPxgPX2y8Yo0\u002f+6XX0xgNjT+9t5WQ5riMP\u002ftzdnMdZow\u002fDc6VhrUUjD8NnXQLp8SLPyVcMHnqdYs\u002fvM3Lengoiz+xzYftSdyKP1qmS99XkYo\u002frEQcjZtHij92rqFhDv+JP\u002fQluvOpt4k\u002fuGsaBWhxiT8Bl\u002fqAQiyJPx4Cz3oz6Ig\u002fLs8MLTWliD8wjvn3QWOIPwSThWBUIog\u002fI48wD2fihz9PB\u002fjOdKOHPz5CT4x4ZYc\u002fN1EgVG0ohz9a2NVSTuyGP5Q\u002fbdMWsYY\u002fXvmQPsJ2hj+cj7oZTD2GP+YqXAawBIY\u002fFEsRwenMhT+Ma9Yg9ZWFPzRQRxbOX4U\u002fXbvjqnAqhT8jT1oA2fWEP05f2U8DwoQ\u002fuHtl6euOhD\u002fafDUzj1yEP+jeE6npKoQ\u002fijnF2\u002ff5gz\u002fJpHNwtsmDP0ndHiAimoM\u002f\u002ffsQtzdrgz8Il1cU9DyDP50jQSlUD4M\u002f0XHe+FTigj80HYiX87WCPzvOZyotioI\u002fOioF5\u002f5egj\u002fZUNYSZjSCPxDH0wJgCoI\u002fabEPG+rggT\u002f6P1DOAbiBP\u002fovrZ2kj4E\u002fr0cwGNBngT\u002fVsnjagUCBPyQmYY63GYE\u002fCLKo6m7zgD8fLZ6ypc2AP0QgzrVZqIA\u002fkh6zz4iDgD++dGjnMF+AP6IbX+9PO4A\u002fAtsU5eMXgD\u002fzE5uh1el\u002fPzO2nIrFpH8\u002fokY2v5Ngfz+9FWuNPB1\u002fPxUxvFa82n4\u002fMQ+ujw+Zfj+8s1G\u002fMlh+PyMv0X4iGH4\u002fUF7\u002feNvYfT+8z+ppWpp9P5e0cx6cXH0\u002fDcXkc50ffT8dAI9XW+N8P6UvaMbSp3w\u002f8RqszABtfD8QUoCF4jJ8P4B9mhp1+Xs\u002f\u002fR3pw7XAez+GqT7HoYh7Pw=="},"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"legend":{"x":0.01,"y":0.99},"title":{"text":"Probability With Lorentzian Fitted Curven"},"xaxis":{"title":{"text":"Threshold (%)"}},"yaxis":{"title":{"text":"Probability"}},"width": "20%",},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('e6782097-d8f6-43e8-8e28-c501e7c730be');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };</script><h3 id="连续的盈利或亏损"><a href="#连续的盈利或亏损" class="headerlink" title="连续的盈利或亏损"></a>连续的盈利或亏损</h3><blockquote><p>横座标表示连续几天, 5表示连续五天盈利, -5表示连续5天亏损这张图的统计结果表明, 连续3天以上都盈利或是亏损的概率只有不到10%, 连续5天以上的盈利亏损概率仅1%</p></blockquote><div id="e6ae1475-5e1b-47df-8c96-eccaed1f0323" class="plotly-graph-div" style="height:600px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e6ae1475-5e1b-47df-8c96-eccaed1f0323")) {                    Plotly.newPlot(                        "e6ae1475-5e1b-47df-8c96-eccaed1f0323",                        [{"marker":{"color":"blue"},"mode":"markers+lines","name":"Probability (Actual)","x":{"dtype":"i1","bdata":"9vf4+fr7\u002fP3+\u002fwECAwQFBgcICQo="},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAAAAAAAAAAAKsCb3B4xUY\u002fqwJvcHjFVj8AQlNUGhRxPwHjfH4nnok\u002fQKrdnp02oz\u002fxSNqrhhW5PzttJtgfk8s\u002fHUEuhEfS3j9+RCGbaMzdPxs54TLegco\u002florrrEwPtj8rMlrbcYCiP+vJz5DuXZA\u002fAeN8fieeeT8AQlNUGhRhP6sCb3B4xUY\u002fAAAAAAAAAAAAAAAAAAAAAA=="},"type":"scatter"},{"line":{"color":"red","dash":"dash"},"mode":"lines","name":"Probability (Fitted)","x":{"dtype":"f8","bdata":"AAAAAAAAJMCoaPyceusjwFHR+Dn11iPA+Tn11m\u002fCI8ChovFz6q0jwEkL7hBlmSPA8nPqrd+EI8Ca3OZKWnAjwEJF4+fUWyPA6q3fhE9HI8CTFtwhyjIjwDt\u002f2L5EHiPA4+fUW78JI8CMUNH4OfUiwDS5zZW04CLA3CHKMi\u002fMIsCEisbPqbciwC3zwmwkoyLA1Vu\u002fCZ+OIsB9xLumGXoiwCYtuEOUZSLAzpW04A5RIsB2\u002frB9iTwiwB5nrRoEKCLAx8+pt34TIsBvOKZU+f4hwBehovFz6iHAvwmfju7VIcBocpsracEhwBDbl8jjrCHAuEOUZV6YIcBgrJAC2YMhwAkVjZ9TbyHAsX2JPM5aIcBZ5oXZSEYhwAJPgnbDMSHAqrd+Ez4dIcBSIHuwuAghwPqId00z9CDAo\u002fFz6q3fIMBLWnCHKMsgwPPCbCSjtiDAnCtpwR2iIMBElGVemI0gwOz8YfsSeSDAlGVemI1kIMA9zlo1CFAgwOU2V9KCOyDAjZ9Tb\u002f0mIMA1CFAMeBIgwLzhmFLl+x\u002fADLORjNrSH8BchIrGz6kfwK1VgwDFgB\u002fA\u002fiZ8OrpXH8BO+HR0ry4fwJ7Jba6kBR\u002fA75pm6JncHsBAbF8ij7MewJA9WFyEih7A4Q5RlnlhHsAy4EnQbjgewIKxQgpkDx7A0oI7RFnmHcAjVDR+Tr0dwHQlLbhDlB3AxPYl8jhrHcAUyB4sLkIdwGWZF2YjGR3AtmoQoBjwHMAGPAnaDcccwFcNAhQDnhzAqN76Tfh0HMD4r\u002fOH7UscwEiB7MHiIhzAmVLl+9f5G8DqI941zdAbwDr11m\u002fCpxvAisbPqbd+G8Dbl8jjrFUbwCxpwR2iLBvAfDq6V5cDG8DNC7ORjNoawB7dq8uBsRrAbq6kBXeIGsC+f50\u002fbF8awA9RlnlhNhrAYCKPs1YNGsCw84ftS+QZwADFgCdBuxnAUZZ5YTaSGcCiZ3KbK2kZwPI4a9UgQBnAQwpkDxYXGcCU21xJC+4YwOSsVYMAxRjANH5OvfWbGMCFT0f36nIYwNYgQDHgSRjAJvI4a9UgGMB3wzGlyvcXwMeUKt+\u002fzhfAGGYjGbWlF8BoNxxTqnwXwLkIFY2fUxfACdoNx5QqF8BaqwYBigEXwKt8\u002fzp\u002f2BbA+034dHSvFsBMH\u002fGuaYYWwJzw6eheXRbA7cHiIlQ0FsA9k9tcSQsWwI5k1JY+4hXA3jXN0DO5FcAvB8YKKZAVwH\u002fYvkQeZxXA0Km3fhM+FcAhe7C4CBUVwHFMqfL96xTAwh2iLPPCFMAS75pm6JkUwGPAk6DdcBTAs5GM2tJHFMAEY4UUyB4UwFQ0fk699RPApQV3iLLME8D11m\u002fCp6MTwEaoaPycehPAl3lhNpJRE8DnSlpwhygTwDgcU6p8\u002fxLAiO1L5HHWEsDZvkQeZ60SwCmQPVhchBLAemE2klFbEsDKMi\u002fMRjISwBsEKAY8CRLAa9UgQDHgEcC8phl6JrcRwA14ErQbjhHAXUkL7hBlEcCuGgQoBjwRwP7r\u002fGH7EhHAT731m\u002fDpEMCfju7V5cAQwPBf5w\u002fblxDAQDHgSdBuEMCRAtmDxUUQwOHT0b26HBDAZEqV71\u002fnD8AG7YZjSpUPwKaPeNc0Qw\u002fASDJqSx\u002fxDsDo1Fu\u002fCZ8OwIp3TTP0TA7AKho\u002fp976DcDMvDAbyagNwGxfIo+zVg3ADgIUA54EDcCwpAV3iLIMwFBH9+pyYAzA8unoXl0ODMCSjNrSR7wLwDQvzEYyagvA1NG9uhwYC8B2dK8uB8YKwBYXoaLxcwrAuLmSFtwhCsBYXISKxs8JwPr+df6wfQnAnKFncpsrCcA8RFnmhdkIwN7mSlpwhwjAfok8zlo1CMAgLC5CReMHwMDOH7YvkQfAYnERKho\u002fB8ACFAOeBO0GwKS29BHvmgbARFnmhdlIBsDm+9f5w\u002fYFwIieyW2upAXAKEG74ZhSBcDK46xVgwAFwGqGnsltrgTADCmQPVhcBMCsy4GxQgoEwE5ucyUtuAPA7hBlmRdmA8CQs1YNAhQDwDBWSIHswQLA0vg59dZvAsB0mytpwR0CwBQ+Hd2rywHAtuAOUZZ5AcBWgwDFgCcBwPgl8jhr1QDAmMjjrFWDAMA6a9UgQDEAwLgbjilVvv+\u002f+GBxESoa\u002f784plT5\u002fnX+v4DrN+HT0f2\u002fwDAbyagt\u002fb8Adv6wfYn8v0C74ZhS5fu\u002fiADFgCdB+7\u002fIRaho\u002fJz6vwiLi1DR+Pm\u002fSNBuOKZU+b+QFVIge7D4v9BaNQhQDPi\u002fEKAY8CRo979Y5fvX+cP2v5gq37\u002fOH\u002fa\u002f2G\u002fCp6N79b8YtaWPeNf0v2D6iHdNM\u002fS\u002foD9sXyKP87\u002fghE9H9+ryvyDKMi\u002fMRvK\u002faA8WF6Gi8b+oVPn+df7wv+iZ3OZKWvC\u002fYL5\u002fnT9s77\u002fgSEZt6SPuv2DTDD2T2+y\u002f4F3TDD2T679w6Jnc5krqv\u002fByYKyQAum\u002fcP0mfDq657\u002fwh+1L5HHmv4AStBuOKeW\u002fAJ166zfh47+AJ0G74ZjivxCyB4uLUOG\u002fkDzOWjUI4L8gjilVvn\u002fdvyCjtvQR79q\u002fQLhDlGVe2L9AzdAzuc3Vv0DiXdMMPdO\u002fQPfqcmCs0L\u002fAGPAkaDfMv8BCCmQPFse\u002fwGwko7b0wb8ALn3Eu6a5vwAEY4UUyK6\u002fAFiXA2OFlL8AWJcDY4WUPwADY4UUyK4\u002fgC19xLumuT\u002fAbCSjtvTBP8BCCmQPFsc\u002fgBjwJGg3zD9A9+pyYKzQP0DiXdMMPdM\u002fIM3QM7nN1T8guEOUZV7YPyCjtvQR79o\u002fII4pVb5\u002f3T+APM5aNQjgPwCyB4uLUOE\u002fgCdBu+GY4j8AnXrrN+HjP3AStBuOKeU\u002f8IftS+Rx5j9w\u002fSZ8OrrnP+ByYKyQAuk\u002fYOiZ3OZK6j\u002fgXdMMPZPrP2DTDD2T2+w\u002f0EhGbekj7j9Qvn+dP2zvP+iZ3OZKWvA\u002fqFT5\u002fnX+8D9gDxYXoaLxPyDKMi\u002fMRvI\u002f4IRPR\u002ffq8j+YP2xfIo\u002fzP1j6iHdNM\u002fQ\u002fGLWlj3jX9D\u002fYb8Kno3v1P5Aq37\u002fOH\u002fY\u002fUOX71\u002fnD9j8QoBjwJGj3P9BaNQhQDPg\u002fiBVSIHuw+D9I0G44plT5PwiLi1DR+Pk\u002fwEWoaPyc+j+AAMWAJ0H7P0C74ZhS5fs\u002fAHb+sH2J\u002fD+4MBvJqC39P3jrN+HT0f0\u002fOKZU+f51\u002fj\u002f4YHERKhr\u002fP7AbjilVvv8\u002fOGvVIEAxAECYyOOsVYMAQPQl8jhr1QBAVIMAxYAnAUC04A5RlnkBQBQ+Hd2rywFAcJsracEdAkDQ+Dn11m8CQDBWSIHswQJAkLNWDQIUA0DsEGWZF2YDQExucyUtuANArMuBsUIKBEAIKZA9WFwEQGiGnsltrgRAyOOsVYMABUAoQbvhmFIFQISeyW2upAVA5PvX+cP2BUBEWeaF2UgGQKC29BHvmgZAABQDngTtBkBgcREqGj8HQMDOH7YvkQdAHCwuQkXjB0B8iTzOWjUIQNzmSlpwhwhAPERZ5oXZCECYoWdymysJQPj+df6wfQlAWFyEisbPCUC0uZIW3CEKQBQXoaLxcwpAdHSvLgfGCkDU0b26HBgLQDAvzEYyagtAkIza0ke8C0Dw6eheXQ4MQFBH9+pyYAxArKQFd4iyDEAMAhQDngQNQGxfIo+zVg1AyLwwG8moDUAoGj+n3voNQIh3TTP0TA5A6NRbvwmfDkBEMmpLH\u002fEOQKSPeNc0Qw9ABO2GY0qVD0BkSpXvX+cPQODT0b26HBBAkALZg8VFEEBAMeBJ0G4QQO5f5w\u002fblxBAno7u1eXAEEBOvfWb8OkQQP7r\u002fGH7EhFArBoEKAY8EUBcSQvuEGURQAx4ErQbjhFAvKYZeia3EUBq1SBAMeARQBoEKAY8CRJAyjIvzEYyEkB4YTaSUVsSQCiQPVhchBJA2L5EHmetEkCI7UvkcdYSQDYcU6p8\u002fxJA5kpacIcoE0CWeWE2klETQEaoaPycehNA9NZvwqejE0CkBXeIsswTQFQ0fk699RNAAmOFFMgeFECykYza0kcUQGLAk6DdcBRAEu+aZuiZFEDAHaIs88IUQHBMqfL96xRAIHuwuAgVFUDQqbd+Ez4VQH7YvkQeZxVALgfGCimQFUDeNc3QM7kVQIxk1JY+4hVAPJPbXEkLFkDsweIiVDQWQJzw6eheXRZASh\u002fxrmmGFkD6Tfh0dK8WQKp8\u002fzp\u002f2BZAWqsGAYoBF0AI2g3HlCoXQLgIFY2fUxdAaDccU6p8F0AWZiMZtaUXQMaUKt+\u002fzhdAdsMxpcr3F0Ak8jhr1SAYQNQgQDHgSRhAhE9H9+pyGEA0fk699ZsYQOSsVYMAxRhAlNtcSQvuGEBACmQPFhcZQPA4a9UgQBlAoGdymytpGUBQlnlhNpIZQADFgCdBuxlAsPOH7UvkGUBgIo+zVg0aQBBRlnlhNhpAvH+dP2xfGkBsrqQFd4gaQBzdq8uBsRpAzAuzkYzaGkB8OrpXlwMbQCxpwR2iLBtA3JfI46xVG0CIxs+pt34bQDj11m\u002fCpxtA6CPeNc3QG0CYUuX71\u002fkbQEiB7MHiIhxA+K\u002fzh+1LHECo3vpN+HQcQFQNAhQDnhxABDwJ2g3HHEC0ahCgGPAcQGSZF2YjGR1AFMgeLC5CHUDE9iXyOGsdQHQlLbhDlB1AJFQ0fk69HUDQgjtEWeYdQICxQgpkDx5AMOBJ0G44HkDgDlGWeWEeQJA9WFyEih5AQGxfIo+zHkDwmmbomdweQJzJba6kBR9ATPh0dK8uH0D8Jnw6ulcfQKxVgwDFgB9AXISKxs+pH0AMs5GM2tIfQLzhmFLl+x9ANAhQDHgSIECMn1Nv\u002fSYgQOQ2V9KCOyBAPM5aNQhQIECUZV6YjWQgQOz8YfsSeSBARJRlXpiNIECcK2nBHaIgQPLCbCSjtiBASlpwhyjLIECi8XPqrd8gQPqId00z9CBAUiB7sLgIIUCqt34TPh0hQAJPgnbDMSFAWOaF2UhGIUCwfYk8zlohQAgVjZ9TbyFAYKyQAtmDIUC4Q5RlXpghQBDbl8jjrCFAaHKbK2nBIUC+CZ+O7tUhQBahovFz6iFAbjimVPn+IUDGz6m3fhMiQB5nrRoEKCJAdv6wfYk8IkDOlbTgDlEiQCYtuEOUZSJAfMS7phl6IkDUW78Jn44iQCzzwmwkoyJAhIrGz6m3IkDcIcoyL8wiQDS5zZW04CJAjFDR+Dn1IkDi59RbvwkjQDp\u002f2L5EHiNAkhbcIcoyI0Dqrd+ET0cjQEJF4+fUWyNAmtzmSlpwI0Dyc+qt34QjQEgL7hBlmSNAoKLxc+qtI0D4OfXWb8IjQFDR+Dn11iNAqGj8nHrrI0AAAAAAAAAkQA=="},"y":{"dtype":"f8","bdata":"YEKUjo5I1D093CfL3FrYPTL4wSngON09xUopw6SE4T3U0SQC9fzkPZxAJAR8IOk9VQdzAUYP7j0uv2uQl\u002ffxPfRWyxt0dvU95ruBxZOe+T0cDYBZBo\u002f+PRMLmfUvNgI+OX88b9WwBT6wxgTpwNAJPueBlNqrsw4+VRoUUT0+Ej433P8ODaoVPl2t4HJAtRk+OZftzex7Hj5+S7Emdw8iPococwpYYiU+sGQS2wlNKT6ZVy9avuktPmWU+FqBqzE+Q2c83TjcND6C3I2cwJs4PuiE6Es3Aj0+L+JSwdMVQT47DHYaUhxEPpfFEzd+p0c+64ncyUTNSz7MlS75hlNQPtv4+VkiKVM+HAX\u002fAHl4Vj5lvKgGN1VaPpV8H2sV1l4+7D3s2aYKYj72YybjjhhlPmmcehIvpmg+BDiCe5bHbD5bdY4j7MlwPiBlUxy9knM+K6BqE3nNdj4z51Immot6Pso0o0cq4X4+x\u002fYRRY\u002fygT4YwxEy39iEPmcHhzCMMog+rCGI8MIQjD6mshztj0OQPq0UrmQB1pI+mYEvqXbMlT7toGJldjWZPs+34LeIIZ0+WkZ6Cr3RoD5u5AslU2ijPhP8xEWmYKY+\u002fiXYxXbIqT43io9aWq+tPngc3m57E7E+lOQz9aGhsz6uf0cDao22PjCQ7BGT47k+pHzdKYCyvT6BwdMnNQXBPsNuHULMfsM+XmAm9E5Qxj4rInJOT4XJPndNMgTOKs0+OjVNTbKn0D6GXnMDugHTPgTdXhKsrNU+nm1kO9Cy2D6umwRWpx\u002fcPpnIYdsGAOA+9XtigDAx4j6jGeHWVKvkPsJVlE5kd+c+O6BNgFSf6j6bcNmAOy7uPo\u002fhquA2GPE+TR5qWM9Z8z7yBRgrguP1PtmPEQ6\u002fvfg+9p9rht\u002fx+z4BBLXePYr\u002fPviHRgsnyQE\u002fIMPEd1wLBD+bcEGevJIGP8gG+sz9Zgk\u002fu0XTW6CQDD+OZ1iXgAwQP7CSb9U2BRI\u002fxFjlmhw4FD9v5OwpaqsWP5vTZL\u002fyZRk\u002fw\u002fex5TFvHD8wDWC7Wc8fP8Oy4RyxxyE\u002fkiD0w4zcIz+RaQ6zmismP7PIJ9+yuig\u002f4yapMjSQKz\u002fstWgMD7MuP9W7XDFoFTE\u002flDAGyNb\u002fMj+seCpnSB01P+cvAzOTcjc\u002f786HSvUEOj8WD90YHNo8P7gpXAYs+D8\u002fcPtAReSyQT9o9dlPDpVDP85ircxxpkU\u002fmPgrLjnrRz9dPKl84GdKP9dp4VM6IU0\u002f5jwAiDoOUD+td3kUkK9RP2VRNN2Yd1M\u002fKvdEG4ZpVT9zK3ggwohXPxyGflfz2Fk\u002f48MUVf9dXD+gmjT4DRxfPz+viUvGC2E\u002frRk1m5iqYj+bZhvk\u002fmxkP6oEarehVWY\u002fAqR74FJnaD90T2UFD6VqP4yYAkT\u002fEW0\u002fl0ZFyXqxbz9GFzAwhENxPxLhm\u002fsvy3I\u002f1N+qCrZxdD9dSTihJTl2PzVatayoI3g\u002fqopBYoQzej8h16LPGWt8P7iXUV3mzH4\u002fajPcH8KtgD+Dd9tq1QyCP5gvM3kXhYM\u002fo\u002foHiAEYhT9S6By1G8eGP8UjUv78k4g\u002fA0yFMkuAij\u002fUmrrSuo2MP\u002fQ7deIOvo4\u002flw4TU4yJkD8Km02nW8eRP3PvLshrGZM\u002f1bj6krmAlD+jGgYeSP6VP5vHP2Mgk5c\u002ftOe43lBAmT\u002fqz8Eg7QabP+qsNlMN6Jw\u002fBJyisc3knj\u002f6qvX5Jn+gP5c+olXYmqE\u002fOu+bSA3Goj9CvE\u002fkWAGkP4xzP4hOTaU\u002fUuxddIGqpj8KNmRUhBmoP5FbM8Tomqk\u002fOxNhzT4vqz8V8RheFNesPwheh7n0kq4\u002fatgH8bMxsD9jms3+eCSxP5LSLVoJIrI\u002fUUs0RaIqsz89LVYafj60P6QH0fTTXbU\u002fuNY5V9eItj\u002f074nQt7+3P\u002fUf\u002fp+gArk\u002fhoMiWLhRuj8zq2uBIK27P0Fgwzz1FL0\u002fMtV05kyJvj++kvTcGwXAP8vZVLvfy8A\u002f4hORg\u002fOYwT8VwM8UVWzCP19dBo7+RcM\u002ffQ54JeYlxD+F9BYC\u002fgvFP1M0Cxc0+MU\u002f48OiAXLqxj8K4+zpnOLHP4t8Q2aV4Mg\u002fY5sDYjfkyT+VnbQHWu3KP0PY267P+8s\u002f9vm3zWUPzT9VmRzv5CfOP4UPo6wQRc8\u002fH\u002fyw1lMz0D\u002fJPqzUMcbQP3T52rj8WtE\u002f\u002f5oQf4zx0T8I7Y6\u002ftonSPwqp07pOI9M\u002fgBEKaCW+0z\u002feViaGCVrUP6Itra\u002fH9tQ\u002fH3omcSqU1T\u002fMWTZi+jHWP+ogVEH+z9Y\u002f6CETEvtt1z8gSu09tAvYPyDRe7frqNg\u002f52wGIGJF2T9fvU3v1uDZP9XvcZ0Ie9o\u002f0gLTzrQT2z95lsSBmKrbPxfg6z1wP9w\u002fLisbRfjR3D9rWXvF7GHdP3wQ0QwK790\u002f7sGovAx53j\u002fFdzL\u002fsf\u002feP\u002fZYlLy3gt8\u002fd5c8aO4A4D\u002fgbc+fcD7gP+LWkzbDeeA\u002f+Wi4p8ey4D+k6xdSYOngPxahzJFwHeE\u002fdk0p2dxO4T9BlvnIin3hP3Hp60dhqeE\u002fjN8HmUjS4T+e\u002fRRxKvjhP5zb1gryGuI\u002fG\u002f4EOow64j86J+Z851biP\u002f9+eAz0b+I\u002fW7UR66OF4j9mJGTx6pfiP7D919m+puI\u002fxq0pShey4j\u002fK2kDb7bniP2GxNR8+vuI\u002faZN8pQW\u002f4j9gqTL9Q7ziPyVOiLX6teI\u002fmshIXC2s4j+qQ4F64Z7iP5tuS48ejuI\u002fxqHCCO554j8yyiw7W2LiP3e1YlZzR+I\u002fcZqFWUUp4j9M5xEF4gfiP4xuYctb4+E\u002fZv+wv8a74T9JR7+DOJHhP8mHHDTIY+E\u002fmjJEU44z4T+32pqzpADhP6YcbGAmy+A\u002faSUFhi+T4D96WAlZ3VjgPwQ+H\u002f1NHOA\u002fhroo1kC73z9J4y2t6DnfP5cISSfUtN4\u002fQMGY90Qs3j9fMcmmfaDdP03An13BEd0\u002fuNTjr1OA3D\u002fhad5neOzbP+B5qFJzVts\u002fkRh+DYi+2j\u002fysknU+STaP3dAmFELitk\u002f7VEkcP7t2D\u002fM0iIuFFHYPzwOeXKMs9c\u002fgRwA5KUV1z9qUfbCnXfWPwmcu8Sv2dU\u002fzQ7y8RU81T\u002fO\u002fheHCJ\u002fUP9Bcrde9AtQ\u002frhzyM2pn0z\u002fJukfRP83SPyI2PLVuNNI\u002fpy5BoySd0T+bSg4NjQfRP4aUqgXRc9A\u002fg2wqbi7Ezz\u002fdmQW1B6XOPxwtQ2Zxis0\u002f99SnFqp0zD89pJto62PLP2daABBqWMo\u002f+TVz2lVSyT+mzca72VHIP8vnfd4bV8c\u002f3jkNuD1ixj8bXKcgXHPFP4YXVG6PisQ\u002fWH4Sk+unwz\u002fa\u002fMM9gMvCPyS7nf1Y9cE\u002f3z\u002fdZ30lwT\u002fMQH0\u002f8VvAP3XgTz1pMb8\u002fCqtJQ4i3vT+6qgImMkq8PyT0aDFT6bo\u002fP4QAxNGUuT\u002fDcamrjky4P2Wx9oJlELc\u002fT1enDi3gtT8Ajtmat7u0P8wclFfTorM\u002fiUZJtEqVsj8T7vu55JKxP5hEtmNlm7A\u002feHEP6htdrz\u002fo0oycOpitP+DfrXyg56s\u002fdcmHo8NKqj+nCOo9F8GoP42GuB4MSqc\u002fidbqShHlpT969PV+lJGkPxHbca0CT6M\u002f6rPXdsgcoj83WUCaUvqgPz6YKr4czp8\u002fQUhg79PEnT+ag9u5qdebP5R4hkWABZo\u002fyxPViz1NmD9fmIjly62WP4nSJYsaJpU\u002fpGxyCB61kz8G31ij0FmSP4oYnLYyE5E\u002fFs6YAZbAjz\u002fSqezPTYCNP5JpFGW1Y4s\u002fVOL\u002fawNpiT+9\u002fXz3fI6HP94borl10oU\u002fhbLrKVAzhD8TmSabfa+CP\u002fBlQEJ+RYE\u002fVkYrXsLnfz8AD6VwiHJ9P\u002f7n7LanKHs\u002fb6QJJJYHeT+Xc8455gx3P+ku+o1GNnU\u002fsiGZP4GBcz8gUX5ee+xxP9KulUY0dXA\u002fDRB44Ykzbj\u002f4RWh1vrBrP4MjdU+aXmk\u002fytpGNuA5Zz8BUa0cgD9lP+oj0oaVbGM\u002f0lDz6mW+YT8qPckPXzJgP6AxHtUqjF0\u002fw2bz\u002fITuWj9bP35+hodYP8MTUvAsU1Y\u002fATIJcrZNVD+rcjqUnnNSP2apl1CbwVA\u002frYMHKDRpTj9fX124eZNLP1K5ENSu\u002fEg\u002fLOVEFNmfRj9wpsbnVnhEP2lsdYDagUI\u002fgYG08GS4QD+8lCfzgjA+P7N\u002fIxQCPDs\u002fY6Ei3+uMOD8KDbxuXx02P97mvYHu5zM\u002fFonK\u002f5XnMT9tNKvcthcwP26SDLEe6Cw\u002f2s\u002fCNWnxKT+9WzhMGUQnP3n8u0GR2SQ\u002fOmyP5b6rIj9dZjFjEbUgP41Zcm\u002ff4B0\u002fPzGQeF+yGj\u002faFvh+G9YXP4SGfk9JRBU\u002fPgOcMM31Ej+lM58lLOQQPxVGtz3+Eg4\u002fT0WoFc7ACj+PCit5A8gHPxVWbje\u002fHwU\u002ffq6BJfS\u002fAj+7Ug5iVaEAP9ifodWLev0+nj\u002fD3pIb+j6QlTyb7Br3Pq4Wm0nRbvQ+4tjL2mwO8j6XkLYQkuPvPn6F6WByI+w++0WcsI\u002fP6D5hN4xuS9zlPqxkIl00P+M+H9C8Jeru4D4HKYK7BsbdPvIIipzrJ9o+kIXqowH21j6sDkg\u002fMyTUPkj8I7Wyp9E+baU9ELPtzj6q5g6yFRLLPt7T9BAxrcc+FIuDulWxxD5OPLPxVBLCPgBj4J2xir8+HMnocoCBuz46y4fG\u002fPe3PkLkoO\u002f63rQ+VoIWZwgpsj7hQiaCeJSvPg2RcucYcKs+7s1x8U7Spz7PNKXBo6qkPoYTYfKO6qE+Vj7kqn4Knz7k\u002foYM096aPnytZno3Ppc+tZahvSwXlD67xZCbUVqRPm+nZkVI9I0+nrKLsZPViT6u668pvEOGPp1Zt8KLLIM+5ZnBoxGAgD5pvS8auWB8PqbC1pF6Yng+5jRNWCDwdD62lbDGGfdxPrxVKG5vzm4+av0zo8Jkaj6CDkhyo5hmPpVpnDK7VGM+hK0pZH+GYD7gW6NWrjtcPsit1oqXGVg+SnThY4WOVD4zWLLegIVRPq2\u002fjCnL2E0+1Sk4bAdnST437DiQm5pFPiIPpoEhXEI+LFz9+tQuPz5F4IEII3Y6PgWHDbU3cDY+9LbsuUsDMz6U52JBNRkwPv33RR7UPSs+J7b4YSQIJz7Jmz5CUnUjPjd4xQdXbSA+DwhxkD+3Gz5H964OJF0XPtTBKwpCrhM+AMSSGOOQED7WLglsKd4LPmIx0Os9bAc+Op8QWRysAz4TAgMSmoIAPvAQHqkzsfs9NDR6DOo09z0tp5iD9G7zPZXkjYT8QvA9rHfnlfIx6z0kPnBVGbnmPc611Mru+OI97doO5Iao3z1R3NpC1WTaPaCSgIwY\u002fdU9ZwlrfCBO0j1Z9XqYfnTOPQ=="},"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"legend":{"x":0.01,"y":0.99},"title":{"text":"Probability With Gaussian Fitted Curve"},"xaxis":{"title":{"text":"Days"}},"yaxis":{"title":{"text":"Probability"}},"width":800,"height":600},                        {"responsive": true}                    )                };            </script><h2 id="收益预期管理"><a href="#收益预期管理" class="headerlink" title="收益预期管理"></a>收益预期管理</h2><h3 id="股票降价后的收益率"><a href="#股票降价后的收益率" class="headerlink" title="股票降价后的收益率"></a>股票降价后的收益率</h3><blockquote><p>这里计算得到的图表内容解释</p><ul><li>Expected Return 的数字表示预期盈利是 4%</li><li>以横座标为3为例, 它意味着当日的股票比前一天最高价低了3%以上</li><li>纵座标表示的是达到预期收益的, 如果以 14 天这条线为例, 它表示, 在未来14个交易日中, 能达到4%收益的概率接近60%</li></ul></blockquote><p>如果使用更加简单的例子</p><blockquote><ul><li>第0天, high: 1.0(最高价)</li><li>第1天: low: 0.97 (存在一个价格比前一天低了3%)</li><li>第2天: ….</li><li>第3天: ….</li><li>第14天: 存在一个价格大于 0.97 * 1.04 的概率接近是60%</li></ul></blockquote><p>可以看到, 随着我们的耐心等待, 从7天,14天,到21天,30天之后, 获利概率其实是逐步提升的.</p><div id="5a5d9953-9b13-4396-ad9f-b45860631c27"> </div><script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("5a5d9953-9b13-4396-ad9f-b45860631c27")) {                    Plotly.newPlot(                        "5a5d9953-9b13-4396-ad9f-b45860631c27",                        [{"mode":"lines+markers","name":"7 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.1566265060240964,0.16793066088840736,0.19614147909967847,0.22926829268292684,0.2595419847328244,0.373015873015873,0.46875,0.4883720930232558,0.4642857142857143,0.5652173913043478],"type":"scatter"},{"mode":"lines+markers","name":"14 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.2851817334575955,0.2981501632208923,0.317741935483871,0.36341463414634145,0.37786259541984735,0.5079365079365079,0.65625,0.6744186046511628,0.6428571428571429,0.6521739130434783],"type":"scatter"},{"mode":"lines+markers","name":"21 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.35767790262172283,0.36899563318777295,0.3790322580645161,0.424390243902439,0.4389312977099237,0.5873015873015873,0.71875,0.7441860465116279,0.75,0.782608695652174],"type":"scatter"},{"mode":"lines+markers","name":"30 Days","x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[0.4265536723163842,0.43468715697036225,0.43344155844155846,0.48284313725490197,0.4942528735632184,0.6349206349206349,0.734375,0.7906976744186046,0.7857142857142857,0.782608695652174],"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"title":{"text":"Rise Probability for Different Drop Thresholds Over Various Future Days\u003cbr\u003e(Expected Return: 4.0%)"},"xaxis":{"title":{"text":"Drop Threshold (%)"}},"yaxis":{"title":{"text":"Rise Probability"}},"width":800,"height":600,"hovermode":"x unified"},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('5a5d9953-9b13-4396-ad9f-b45860631c27');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };            </script><h3 id="降价后的收益率-3D"><a href="#降价后的收益率-3D" class="headerlink" title="降价后的收益率-3D"></a>降价后的收益率-3D</h3><p>我尝试使用plotly也制作了 3D 的曲面, 可能没那么光滑, 不过只是查询看起来足够了.</p><div id="bc03a572-4b63-49c2-b15e-833fb96f5f19" class="plotly-graph-div" style="height:600px; width:100%;"></div><script>window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("bc03a572-4b63-49c2-b15e-833fb96f5f19")) {                    Plotly.newPlot(                        "bc03a572-4b63-49c2-b15e-833fb96f5f19",                        [{"colorscale":[[0.0,"#440154"],[0.1111111111111111,"#482878"],[0.2222222222222222,"#3e4989"],[0.3333333333333333,"#31688e"],[0.4444444444444444,"#26828e"],[0.5555555555555556,"#1f9e89"],[0.6666666666666666,"#35b779"],[0.7777777777777778,"#6ece58"],[0.8888888888888888,"#b5de2b"],[1.0,"#fde725"]],"x":[0.25,0.5,1.0,1.5,2.0,3.0,4.0,5.0,6.0,7.000000000000001],"y":[7,14,21,30],"z":{"dtype":"f8","bdata":"yOfE0KxYyz9IvPZCweLMP6gNDpL65c8\u002f0u2M+7Eo0j9D9Q0Yq7jVPwgIeS6PIts\u002fSPbKSt8d4D9aAARqaGPhP1LTKNMH+OE\u002f8H3jdE6Z4j8kzXxQAtTRPwa\u002fxurnhdI\u002fsvi3pdXu0z\u002fd3gdqzx3WPwJ+sPcvx9k\u002fbJpAiqGR3z9MqarRBpbiP+itIaSnAOQ\u002fUhnJIg195D\u002f6DhdNGdzkPxcct8Rgn9Y\u002fxLiLp1ot1z+m5DzkY2bYP8Rs6tMQgto\u002ftoAH9yo63j8O12jCrBriP3BFv\u002fI0CuU\u002fvZTl6TSh5j8EmeYHcirnP\u002f6Mya8eZ+c\u002fgAK\u002fUv+g2T\u002f6fXRK5g7aP+DK2TiTHds\u002fb3bKm6Qk3T\u002f8bwSdRWngP9zjA6CJWeM\u002fb5iSXIo\u002f5j+ByrVO2+vnP9NjUAXpgOg\u002f\u002fN+0Pbuq6D8=","shape":"4, 10"},"type":"surface"},{"line":{"color":"red","width":6},"mode":"lines+markers","name":"Max Gradient Slice","x":[3.0,3.0,3.0,3.0],"y":[7,14,21,30],"z":{"dtype":"f8","bdata":"CAh5Lo8i2z9smkCKoZHfPw7XaMKsGuI\u002f3OMDoIlZ4z8="},"type":"scatter3d"}],                        {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"title":{"text":"3D Rise Probability Surface\u003cbr\u003e(Expected Return: 4.0%)"},"width":800,"height":600,"scene":{"xaxis":{"title":{"text":"Drop Threshold (%)"}},"yaxis":{"title":{"text":"Future Days"}},"zaxis":{"title":{"text":"Rise Probability (%)"}}}},                        {"responsive": true}                    ).then(function(){                            var gd = document.getElementById('bc03a572-4b63-49c2-b15e-833fb96f5f19');var x = new MutationObserver(function (mutations, observer) {{        var display = window.getComputedStyle(gd).display;        if (!display || display === 'none') {{            console.log([gd, 'removed!']);            Plotly.purge(gd);            observer.disconnect();        }}}});// Listen for the removal of the full notebook cellsvar notebookContainer = gd.closest('#notebook-container');if (notebookContainer) {{    x.observe(notebookContainer, {childList: true});}}// Listen for the clearing of the current output cellvar outputEl = gd.closest('.output');if (outputEl) {{    x.observe(outputEl, {childList: true});}}                        })                };            </script><h3 id="平均套牢天数"><a href="#平均套牢天数" class="headerlink" title="平均套牢天数"></a>平均套牢天数</h3><p>我这里的评价套牢天数的定义是, 当你用某个价位买入时, 比如1元, 你想要以1.025d的价格卖出, 需要的时间分布.从图中的数据来看, 在1.41到1.48这段买入后, 平均时间是最短的, 大概是21个交易日内就可以获得2.5%的收益</p><div id="060dd9bf-a2d6-4689-ab54-cf9aee77323b" class="plotly-graph-div" style="height:600px; width:100%;"></div><script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("060dd9bf-a2d6-4689-ab54-cf9aee77323b")) {                    Plotly.newPlot(                        "060dd9bf-a2d6-4689-ab54-cf9aee77323b",                        [{"mode":"lines+markers","x":[1.3,1.301,1.3019999999999998,1.3029999999999997,1.3039999999999996,1.3049999999999995,1.3059999999999994,1.3069999999999993,1.3079999999999992,1.308999999999999,1.309999999999999,1.3109999999999988,1.3119999999999987,1.3129999999999986,1.3139999999999985,1.3149999999999984,1.3159999999999983,1.3169999999999982,1.317999999999998,1.318999999999998,1.3199999999999978,1.3209999999999977,1.3219999999999976,1.3229999999999975,1.3239999999999974,1.3249999999999973,1.3259999999999972,1.326999999999997,1.327999999999997,1.3289999999999969,1.3299999999999967,1.3309999999999966,1.3319999999999965,1.3329999999999964,1.3339999999999963,1.3349999999999962,1.335999999999996,1.336999999999996,1.3379999999999959,1.3389999999999957,1.3399999999999956,1.3409999999999955,1.3419999999999954,1.3429999999999953,1.3439999999999952,1.344999999999995,1.345999999999995,1.3469999999999949,1.3479999999999948,1.3489999999999946,1.3499999999999945,1.3509999999999944,1.3519999999999943,1.3529999999999942,1.353999999999994,1.354999999999994,1.3559999999999939,1.3569999999999938,1.3579999999999937,1.3589999999999935,1.3599999999999934,1.3609999999999933,1.3619999999999932,1.362999999999993,1.363999999999993,1.3649999999999929,1.3659999999999928,1.3669999999999927,1.3679999999999926,1.3689999999999924,1.3699999999999923,1.3709999999999922,1.3719999999999921,1.372999999999992,1.373999999999992,1.3749999999999918,1.3759999999999917,1.3769999999999916,1.3779999999999915,1.3789999999999913,1.3799999999999912,1.3809999999999911,1.381999999999991,1.382999999999991,1.3839999999999908,1.3849999999999907,1.3859999999999906,1.3869999999999905,1.3879999999999904,1.3889999999999902,1.3899999999999901,1.39099999999999,1.39199999999999,1.3929999999999898,1.3939999999999897,1.3949999999999896,1.3959999999999895,1.3969999999999894,1.3979999999999893,1.3989999999999891,1.399999999999989,1.400999999999989,1.4019999999999888,1.4029999999999887,1.4039999999999886,1.4049999999999885,1.4059999999999884,1.4069999999999883,1.4079999999999881,1.408999999999988,1.409999999999988,1.4109999999999878,1.4119999999999877,1.4129999999999876,1.4139999999999875,1.4149999999999874,1.4159999999999873,1.4169999999999872,1.417999999999987,1.418999999999987,1.4199999999999868,1.4209999999999867,1.4219999999999866,1.4229999999999865,1.4239999999999864,1.4249999999999863,1.4259999999999862,1.426999999999986,1.427999999999986,1.4289999999999858,1.4299999999999857,1.4309999999999856,1.4319999999999855,1.4329999999999854,1.4339999999999853,1.4349999999999852,1.435999999999985,1.436999999999985,1.4379999999999848,1.4389999999999847,1.4399999999999846,1.4409999999999845,1.4419999999999844,1.4429999999999843,1.4439999999999842,1.444999999999984,1.445999999999984,1.4469999999999839,1.4479999999999837,1.4489999999999836,1.4499999999999835,1.4509999999999834,1.4519999999999833,1.4529999999999832,1.453999999999983,1.454999999999983,1.4559999999999829,1.4569999999999828,1.4579999999999826,1.4589999999999825,1.4599999999999824,1.4609999999999823,1.4619999999999822,1.462999999999982,1.463999999999982,1.4649999999999819,1.4659999999999818,1.4669999999999817,1.4679999999999815,1.4689999999999814,1.4699999999999813,1.4709999999999812,1.471999999999981,1.472999999999981,1.4739999999999809,1.4749999999999808,1.4759999999999807,1.4769999999999806,1.4779999999999804,1.4789999999999803,1.4799999999999802,1.48099999999998,1.48199999999998,1.48299999999998,1.4839999999999798,1.4849999999999797,1.4859999999999796,1.4869999999999794,1.4879999999999793,1.4889999999999792,1.4899999999999791,1.490999999999979,1.491999999999979,1.4929999999999788,1.4939999999999787,1.4949999999999786,1.4959999999999785,1.4969999999999783,1.4979999999999782,1.4989999999999781,1.499999999999978,1.500999999999978,1.5019999999999778,1.5029999999999777,1.5039999999999776,1.5049999999999775,1.5059999999999774,1.5069999999999772,1.5079999999999771,1.508999999999977,1.509999999999977,1.5109999999999768,1.5119999999999767,1.5129999999999766,1.5139999999999765,1.5149999999999764,1.5159999999999763,1.5169999999999761,1.517999999999976,1.518999999999976,1.5199999999999758,1.5209999999999757,1.5219999999999756,1.5229999999999755,1.5239999999999754,1.5249999999999753,1.5259999999999752,1.526999999999975,1.527999999999975,1.5289999999999748,1.5299999999999747,1.5309999999999746,1.5319999999999745,1.5329999999999744,1.5339999999999743,1.5349999999999742,1.535999999999974,1.536999999999974,1.5379999999999738,1.5389999999999737,1.5399999999999736,1.5409999999999735,1.5419999999999734,1.5429999999999733,1.5439999999999732,1.544999999999973,1.545999999999973,1.5469999999999728,1.5479999999999727,1.5489999999999726,1.5499999999999725],"y":[207.96875,220.46875,223.41935483870967,233.40625,217.0625,238.75757575757575,229.625,232.58823529411765,248.72222222222223,260.35,256.0487804878049,252.8780487804878,230.875,229.1578947368421,217.65714285714284,194.33333333333334,165.32258064516128,159.8125,145.82758620689654,146.68965517241378,138.59259259259258,143.84615384615384,143.84615384615384,143.23076923076923,138.16666666666666,150.36363636363637,144.3,131.36363636363637,131.36363636363637,101.83333333333333,125.05263157894737,118.9,105.47368421052632,95.95238095238095,73.6,81.75,95.58823529411765,95.58823529411765,101.375,100.75,81.75,81.75,77.58823529411765,77.58823529411765,133.61111111111111,155.21052631578948,155.21052631578948,155.21052631578948,147.6,167.0,159.77272727272728,162.66666666666666,132.44444444444446,132.38888888888889,121.7,121.7,141.8095238095238,131.2173913043478,131.47826086956522,112.95454545454545,106.6842105263158,105.95,103.04761904761905,80.0952380952381,74.0952380952381,69.17391304347827,72.63636363636364,79.4,72.86363636363636,92.57142857142857,92.0952380952381,92.0952380952381,88.77272727272727,85.56521739130434,71.85714285714286,69.89655172413794,72.25,73.74074074074075,49.5,46.32142857142857,44.1,42.41379310344828,43.03448275862069,42.758620689655174,41.9,40.29032258064516,37.38235294117647,35.94444444444444,38.666666666666664,38.1764705882353,39.625,38.57575757575758,39.09375,38.90625,42.10344827586207,49.416666666666664,51.17391304347826,49.083333333333336,49.25,42.333333333333336,19.73076923076923,19.296296296296298,17.413793103448278,15.96551724137931,9.766666666666667,9.741935483870968,11.25,12.41025641025641,13.6,13.153846153846153,12.25,12.487804878048781,12.577777777777778,12.681818181818182,12.702127659574469,10.847826086956522,11.489795918367347,11.816326530612244,13.270833333333334,20.79245283018868,20.07843137254902,18.617021276595743,16.791666666666668,27.3,24.065217391304348,24.274509803921568,19.06,19.040816326530614,19.245283018867923,19.879310344827587,20.6,21.07017543859649,21.803571428571427,21.423728813559322,19.767857142857142,20.29090909090909,22.894736842105264,17.617021276595743,16.434782608695652,18.891304347826086,21.386363636363637,21.682926829268293,21.743589743589745,22.026315789473685,22.228571428571428,22.61764705882353,23.28125,21.363636363636363,20.5625,16.93103448275862,14.733333333333333,14.32258064516129,14.064516129032258,12.935483870967742,11.838709677419354,12.580645161290322,13.366666666666667,14.53125,14.151515151515152,14.875,14.515151515151516,14.848484848484848,14.571428571428571,14.5,12.82857142857143,12.944444444444445,11.657142857142857,10.424242424242424,10.303030303030303,11.294117647058824,13.514285714285714,13.382352941176471,12.787878787878787,11.258064516129032,11.258064516129032,10.5625,10.666666666666666,12.457142857142857,11.972972972972974,11.972972972972974,15.512820512820513,15.512820512820513,16.05,16.30952380952381,15.55813953488372,17.3953488372093,17.261904761904763,38.19512195121951,37.45238095238095,36.904761904761905,37.476190476190474,37.73809523809524,36.80487804878049,35.15,33.75609756097561,31.71794871794872,32.18421052631579,28.08108108108108,26.864864864864863,27.47222222222222,29.77777777777778,28.0,27.444444444444443,26.864864864864863,19.514285714285716,20.555555555555557,16.5625,10.433333333333334,10.433333333333334,8.89655172413793,8.89655172413793,10.466666666666667,10.833333333333334,10.833333333333334,10.833333333333334,13.96875,15.454545454545455,18.294117647058822,17.53125,27.939393939393938,29.483870967741936,29.516129032258064,28.875,28.151515151515152,22.741935483870968,20.75862068965517,19.925925925925927,19.925925925925927,22.14814814814815,23.576923076923077,24.32,23.46153846153846,22.74074074074074,23.5,22.0,22.703703703703702,22.703703703703702,21.655172413793103,18.77777777777778,18.464285714285715,19.0,18.392857142857142,18.133333333333333,17.151515151515152,15.515151515151516,15.636363636363637,15.65625,14.096774193548388,32.3125,32.46875,33.225806451612904],"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"width":800,"height":600,"title":{"text":"Average Days to Target Price"},"xaxis":{"title":{"text":"Price"}},"yaxis":{"title":{"text":"Average Days"}}},                        {"responsive": true}                    )                };</script><script>(function () {  function resizeAllPlotlyGraphs() {    if (!window.Plotly) return;    document.querySelectorAll('.js-plotly-plot').forEach(function (gd) {      try {        Plotly.relayout(gd, { autosize: true });        Plotly.Plots.resize(gd);      } catch (e) {      }    });  }  resizeAllPlotlyGraphs();  window.addEventListener('resize', resizeAllPlotlyGraphs, { passive: true });  window.addEventListener('orientationchange', resizeAllPlotlyGraphs, { passive: true });})();</script><h2 id="数据的分析与讨论"><a href="#数据的分析与讨论" class="headerlink" title="数据的分析与讨论"></a>数据的分析与讨论</h2><blockquote><p>以下的观点仅代表个人, 且只针对日经ETF, 我不对任何读者的选择负责. 赚钱赔钱与我无关.</p></blockquote><h3 id="符合直觉的结论"><a href="#符合直觉的结论" class="headerlink" title="符合直觉的结论"></a>符合直觉的结论</h3><ul><li>连续上涨, 连续下跌的概率会随着天数增加而快速减少</li><li>同一支股票的涨跌情况基本符合正态分布, 不过这里我拟合得到的是柯西分布(洛伦兹分布)</li><li>以一个合适的价位买入, 基本不太会被套, 但也不会赚大钱</li></ul><h3 id="可能的策略"><a href="#可能的策略" class="headerlink" title="可能的策略"></a>可能的策略</h3><p>假设每年的交易日大概240天</p><ul><li>根据盈亏的分布</li></ul><p>当日跌幅超4%时, 可以考虑买入并持有15-30个交易日, 在一年中买入的时机大概为 240天*2% 约为5个交易日</p><blockquote><p>因为每次交易有7成以上的概率获得4%的收益, 所以一年的预期收益大概为 4% * 0.7 * 5 大约为 14%</p></blockquote><ul><li>根据平均套牢时间</li></ul><p>日经的数据中, 从1.41到1.48这段的平均回本时间是最短的, 大概是21个交易日内就可以获得2.5%的收益. 平均的交易周期为21天.</p><blockquote><p>假设你每次都能在1.41到1.48之间买到股票, 那么你每年能交易的次数为 240&#x2F;21 &#x3D; 10 次,  那么年化有可能达到 10 * 2.5% &#x3D; 25% 的收益</p></blockquote>]]></content>
    
    
    <summary type="html">我个人从去年开始就逐步买入日经相关的场外基金, 也同时在场内有看日经ETF这只基金, 在当时我使用 Backtrader 做回测时, 这只基金是我用到最多的, 所以我也针对它做了一些技术面的统计.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="Backtrader" scheme="https://corvo.myseu.cn/tags/Backtrader/"/>
    
    <category term="日经ETF" scheme="https://corvo.myseu.cn/tags/%E6%97%A5%E7%BB%8FETF/"/>
    
  </entry>
  
  <entry>
    <title>飞牛NAS的一些底层探索和磁盘扩容</title>
    <link href="https://corvo.myseu.cn/2025/05/18/2025-05-18-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%B8%80%E4%BA%9B%E5%BA%95%E5%B1%82%E6%8E%A2%E7%B4%A2%E5%92%8C%E7%A3%81%E7%9B%98%E6%89%A9%E5%AE%B9/"/>
    <id>https://corvo.myseu.cn/2025/05/18/2025-05-18-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%B8%80%E4%BA%9B%E5%BA%95%E5%B1%82%E6%8E%A2%E7%B4%A2%E5%92%8C%E7%A3%81%E7%9B%98%E6%89%A9%E5%AE%B9/</id>
    <published>2025-05-18T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇博客介绍了我对于飞牛NAS的一些使用, 这篇博客我就简单分享下我对于这个系统本身的一些研究,本文默认读者有一定的Linux还有折腾NAS的基础, 没有的话就不要强求去阅读理解了..</p><h2 id="命令行登录"><a href="#命令行登录" class="headerlink" title="命令行登录"></a>命令行登录</h2><h3 id="SSH服务"><a href="#SSH服务" class="headerlink" title="SSH服务"></a>SSH服务</h3><p>确保系统中的SSH服务打开了:</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747537544479.png" alt="1747537544479.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ ssh corvo@192.168.xxx.yyy</span><br><span class="line">corvo@192.168.xxx.yyy<span class="string">&#x27;s password:</span></span><br><span class="line"><span class="string">Linux HomeFN 6.12.18-trim #5 SMP PREEMPT_DYNAMIC Thu Mar 27 10:30:00 CST 2025 x86_64</span></span><br><span class="line"><span class="string">Last login: Sun May 18 11:06:10 2025 from 192.168.101.221</span></span><br><span class="line"><span class="string">corvo@HomeFN:~$</span></span><br></pre></td></tr></table></figure><p>在第一次登录之后, 我发现每次输入密码麻烦就加了公钥到机器上, 可以自行添加这个目录以及文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">ls</span> ~/.ssh/authorized_keys</span><br><span class="line">/home/corvo/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h3 id="切换root用户"><a href="#切换root用户" class="headerlink" title="切换root用户"></a>切换root用户</h3><p>也可以切换到root用户, 正常输入密码就可以了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">sudo</span> su - root</span><br><span class="line">[<span class="built_in">sudo</span>] password <span class="keyword">for</span> corvo:</span><br><span class="line">root@HomeFN:~#  <span class="comment"># 已经切换到了root用户</span></span><br></pre></td></tr></table></figure><h2 id="系统组件"><a href="#系统组件" class="headerlink" title="系统组件"></a>系统组件</h2><h3 id="操作系统"><a href="#操作系统" class="headerlink" title="操作系统"></a>操作系统</h3><p>这是一个Debian 12的系统, 我个人很喜欢他们的这个选择, 和我的其他NAS系统都能保持一致了.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">cat</span> /etc/*-release</span><br><span class="line">PRETTY_NAME=<span class="string">&quot;Debian GNU/Linux 12 (bookworm)&quot;</span></span><br><span class="line">NAME=<span class="string">&quot;Debian GNU/Linux&quot;</span></span><br><span class="line">VERSION_ID=<span class="string">&quot;12&quot;</span></span><br><span class="line">VERSION=<span class="string">&quot;12 (bookworm)&quot;</span></span><br><span class="line">VERSION_CODENAME=bookworm</span><br><span class="line">ID=debian</span><br><span class="line">HOME_URL=<span class="string">&quot;https://www.debian.org/&quot;</span></span><br><span class="line">SUPPORT_URL=<span class="string">&quot;https://www.debian.org/support&quot;</span></span><br><span class="line">BUG_REPORT_URL=<span class="string">&quot;https://bugs.debian.org/&quot;</span></span><br></pre></td></tr></table></figure><h3 id="系统进程"><a href="#系统进程" class="headerlink" title="系统进程"></a>系统进程</h3><p>查看系统进程我推荐<code>systemctl</code>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# systemctl status</span><br><span class="line">● HomeFN</span><br><span class="line">    State: degraded</span><br><span class="line">    Units: 441 loaded (incl. loaded aliases)</span><br><span class="line">     Jobs: 0 queued</span><br><span class="line">   Failed: 3 units</span><br><span class="line">    Since: Mon 2025-05-12 21:02:26 CST; 5 days ago</span><br><span class="line">  systemd: 252.30-1~deb12u2</span><br><span class="line">   CGroup: /</span><br><span class="line">           ├─init.scope</span><br><span class="line">           │ └─1 /sbin/init</span><br><span class="line">           ├─system.slice</span><br><span class="line">           │ ├─ModemManager.service</span><br><span class="line">           │ │ └─843 /usr/sbin/ModemManager</span><br><span class="line">           │ ├─NetworkManager.service</span><br><span class="line">           │ │ └─816 /usr/sbin/NetworkManager --no-daemon</span><br><span class="line">           │ ├─accountsrv.service</span><br><span class="line">           │ │ └─2409 /usr/trim/bin/accountsrv</span><br></pre></td></tr></table></figure><h3 id="磁盘挂载"><a href="#磁盘挂载" class="headerlink" title="磁盘挂载"></a>磁盘挂载</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">corvo@HomeFN:~$ <span class="built_in">df</span> -Th</span><br><span class="line">Filesystem                                              Type         Size  Used Avail Use% Mounted on</span><br><span class="line">udev                                                    devtmpfs     3.9G     0  3.9G   0% /dev</span><br><span class="line">tmpfs                                                   tmpfs        796M   22M  775M   3% /run</span><br><span class="line">/dev/sda2                                               ext4          63G  5.6G   54G  10% /</span><br><span class="line">tmpfs                                                   tmpfs        3.9G  1.4M  3.9G   1% /dev/shm</span><br><span class="line">tmpfs                                                   tmpfs        5.0M     0  5.0M   0% /run/lock</span><br><span class="line">trimafs                                                 trimafs       52G  1.7G   50G   4% /fs</span><br><span class="line">1000-1-c86c2633&#123;SYtpW&#125;:cloud-storage/v1/dav             fuse.rclone  1.0P     0  1.0P   0% /vol02/1000-1-c86c2633</span><br><span class="line">//192.168.xxx.yyy/Data                                  cifs         1.6G  6.0M  1.6G   1% /vol02/1000-0-cb29116f</span><br><span class="line">1000-1-4a74aa03&#123;2_a9I&#125;:cloud-storage/v1/dav             fuse.rclone  1.0P     0  1.0P   0% /vol02/1000-1-4a74aa03</span><br><span class="line">tmpfs                                                   tmpfs        796M     0  796M   0% /run/user/1000</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        6.0G  5.9M  5.5G   1% /vol2</span><br><span class="line">/dev/mapper/trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 btrfs         52G  1.7G   50G   4% /vol1</span><br></pre></td></tr></table></figure><p>其中, 这两个<code>fuse.rclone</code>的磁盘是百度云盘和阿里云盘, <code>cifs</code>挂载的目录是我自己的smb服务器,另外两个<code>btrfs</code>系统是我自己挂载的虚拟硬盘.</p><p>再看一下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/nginx# ps -aux | grep rclone</span><br><span class="line">root        2944  0.0  0.3 730112 30572 ?        Sl   May12   3:41 /usr/bin/rclone --config /etc/mountmgr/rclone/1000.conf mount --daemon 1000-1-c86c2633:/cloud-storage/v1/dav /vol02/1000-1-c86c2633 --no-check-certificate --allow-other --uid 1000 --gid 1001 --<span class="built_in">umask</span> 000 --default-permissions --dir-cache-time 10s --webdav-vendor baidu --vfs-cache-mode off --<span class="built_in">timeout</span> 600s --contimeout 200s --daemon-timeout 3000s --daemon-wait 30s --poll-interval 10s --low-level-retries 2</span><br><span class="line">root       93267  0.0  0.2 729344 23932 ?        Sl   May17   0:01 /usr/bin/rclone --config /etc/mountmgr/rclone/1000.conf mount --daemon 1000-1-4a74aa03:/cloud-storage/v1/dav /vol02/1000-1-4a74aa03 --no-check-certificate --allow-other --uid 1000 --gid 1001 --<span class="built_in">umask</span> 000 --default-permissions --dir-cache-time 10s --webdav-vendor ali --vfs-cache-mode off --<span class="built_in">timeout</span> 600s --contimeout 200s --daemon-timeout 3000s --daemon-wait 30s --poll-interval 10s --low-level-retries 2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 再看看其中的rclone配置</span></span><br><span class="line">root@HomeFN:/usr/trim/nginx# <span class="built_in">cat</span> /etc/mountmgr/rclone/1000.conf</span><br><span class="line">[1000-1-c86c2633]</span><br><span class="line"><span class="built_in">type</span> = webdav</span><br><span class="line">user = 1000_qxSsjpVcKsVORqoA</span><br><span class="line">pass = xxxxxxxxxxx</span><br><span class="line">url = http://127.0.0.1:15244</span><br><span class="line"></span><br><span class="line">[1000-1-4a74aa03]</span><br><span class="line"><span class="built_in">type</span> = webdav</span><br><span class="line">url = http://127.0.0.1:15244</span><br><span class="line">user = 1000_0XKC8OEuwEaVrUvn</span><br><span class="line">pass = xxxxxxxxxxx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这里的15244是由 `cloud_storage_dav` 监听的, 提供了webdav接口之后, 由rclone挂载成为本地目录,</span></span><br><span class="line"><span class="comment"># 非常符合Linux的使用逻辑.</span></span><br></pre></td></tr></table></figure><h3 id="用户组"><a href="#用户组" class="headerlink" title="用户组"></a>用户组</h3><p>每个应用会有一个属于自己的用户, 看起来也是有权限控制的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">cat</span> /etc/passwd</span><br><span class="line"><span class="comment"># ...</span></span><br><span class="line">trim-media:x:999:901::/home/trim-media:/usr/sbin/nologin</span><br><span class="line">trim.photos:x:996:901::/home/trim.photos:/usr/sbin/nologin</span><br><span class="line">baidu.netdisk:x:994:901::/home/baidu.netdisk:/usr/sbin/nologin</span><br><span class="line">git:x:993:901::/home/git:/usr/sbin/nologin</span><br><span class="line">trim.text-editor:x:992:901::/home/trim.text-editor:/usr/sbin/nologin</span><br></pre></td></tr></table></figure><h3 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h3><p>飞牛使用的是<code>PostgreSQL</code>做数据库的, 有兴趣可以自己研究下里面的数据库和表格, 看起来飞牛对AI相关的内容还是蛮重视的, 单独有一个AI相关的数据库.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:~# ps -aux | grep postgres</span><br><span class="line">postgres    1399  0.0  1.0 239912 86084 ?        Ss   May12   0:58 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# su - postgres</span><br><span class="line">postgres@HomeFN:~$ psql</span><br><span class="line">psql (15.8 (Debian 15.8-0+deb12u1))</span><br><span class="line">Type <span class="string">&quot;help&quot;</span> <span class="keyword">for</span> <span class="built_in">help</span>.</span><br><span class="line"></span><br><span class="line">postgres=# \list</span><br><span class="line">                                                       List of databases</span><br><span class="line">      Name      |     Owner      | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges</span><br><span class="line">----------------+----------------+----------+-------------+-------------+------------+-----------------+-----------------------</span><br><span class="line"> ai_manager     | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> appcenter      | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> dm             | postgres       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |</span><br><span class="line"> <span class="comment">#....</span></span><br></pre></td></tr></table></figure><h3 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h3><p>飞牛NAS里面也提供了<code>Docker</code>的集成, 普通用户是可以通过Docker来启动一部分组件了.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# docker info</span><br><span class="line">Client: Docker Engine - Community</span><br><span class="line"> Version:    26.0.0</span><br><span class="line"> Context:    default</span><br><span class="line"> Debug Mode: <span class="literal">false</span></span><br><span class="line"> Plugins:</span><br><span class="line">  buildx: Docker Buildx (Docker Inc.)</span><br><span class="line">    Version:  v0.13.1</span><br><span class="line">    Path:     /usr/libexec/docker/cli-plugins/docker-buildx</span><br><span class="line">  compose: Docker Compose (Docker Inc.)</span><br><span class="line">    Version:  v2.29.2</span><br><span class="line">    Path:     /usr/libexec/docker/cli-plugins/docker-compose</span><br></pre></td></tr></table></figure><h2 id="虚拟磁盘扩容"><a href="#虚拟磁盘扩容" class="headerlink" title="虚拟磁盘扩容"></a>虚拟磁盘扩容</h2><p>这个部分的是我写这篇文章的原动力, 因为我一开始就是使用<a href="https://pve.proxmox.com/">Proxmox</a>来启动这个系统的, 后续是有可能使用PVE自带的功能增加磁盘大小的,所以我就尝试研究了一下飞牛系统以及它的磁盘管理, 希望对那些同样使用PVE的用户一些帮助. </p><ul><li>数据无价, 请务必在操作之前做好备份!!!</li><li>数据无价, 请务必在操作之前做好备份!!!</li><li>数据无价, 请务必在操作之前做好备份!!!</li></ul><p>有部分内容参考: <a href="https://club.fnnas.com/forum.php?mod=viewthread&tid=12963">关于飞牛在虚拟化下的存储硬盘扩容</a>, 另外一部分我从<code>ChatGPT</code>学习来的,请注意, 这个步骤仅适合单磁盘的用户. 我自己本身仅仅了解RAID的功能, 但是没有任何RAID相关的实际操作.</p><p>这部分的内容不是给小白看的, 是我需要记录一下自己的操作方案, 方便以后进行磁盘管理做的.</p><h3 id="查询当前磁盘信息"><a href="#查询当前磁盘信息" class="headerlink" title="查询当前磁盘信息"></a>查询当前磁盘信息</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">df</span> -Th</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        6.0G  5.9M  5.5G   1% /vol2</span><br><span class="line">/dev/mapper/trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 btrfs         52G  1.7G   50G   4% /vol1</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdb                                                 8:16   0   52G  0 disk</span><br><span class="line">└─sdb1                                              8:17   0   52G  0 part</span><br><span class="line">  └─md0                                             9:0    0   52G  0 raid1</span><br><span class="line">    └─trim_5ab5694e_275a_417b_8f53_88510b630e5f-0 253:0    0   52G  0 lvm   /vol1</span><br><span class="line">sdc                                                 8:32   0    6G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    6G  0 part</span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><p>确定好自己要扩容的磁盘, 我这里会以<code>/vol2</code>这个磁盘做演示, 从<code>6G</code>扩容到<code>8G</code>.</p><h3 id="PVE中调整磁盘"><a href="#PVE中调整磁盘" class="headerlink" title="PVE中调整磁盘"></a>PVE中调整磁盘</h3><p>选择磁盘进行扩容</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747562793690.png" alt="1747562793690.png"></p><p>增加2G的磁盘</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747562847107.png" alt="1747562847107.png"></p><blockquote><p>确认磁盘已经增加</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk  <span class="comment"># 这里已经变成了8G</span></span><br><span class="line">└─sdc1                                              8:33   0    6G  0 part</span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><p>我们的目标其实是要扩容最后的<code>lvm</code>分区, 使其也到<code>8G</code>就完成了.</p><h3 id="卸载磁盘"><a href="#卸载磁盘" class="headerlink" title="卸载磁盘"></a>卸载磁盘</h3><p>在系统设置中先卸载磁盘, 没用命令行是因为飞牛NAS有进程会占用, 不如直接从网页端卸载来的安全.</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747563085795.png" alt="1747563085795.png"></p><h3 id="逐步调整分区大小"><a href="#逐步调整分区大小" class="headerlink" title="逐步调整分区大小"></a>逐步调整分区大小</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装fdisk工具</span></span><br><span class="line">apt update &amp;&amp; apt install fdisk</span><br></pre></td></tr></table></figure><h4 id="调整分区"><a href="#调整分区" class="headerlink" title="调整分区"></a>调整分区</h4><p>这里的核心逻辑是, 删除重建分区, 但是不更改分区表内容.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# fdisk /dev/sdc</span><br><span class="line"></span><br><span class="line">Welcome to fdisk (util-linux 2.38.1).</span><br><span class="line">Changes will remain <span class="keyword">in</span> memory only, <span class="keyword">until</span> you decide to write them.</span><br><span class="line">Be careful before using the write <span class="built_in">command</span>.</span><br><span class="line"></span><br><span class="line">GPT PMBR size mismatch (12582911 != 16777215) will be corrected by write.</span><br><span class="line">The backup GPT table is not on the end of the device. This problem will be corrected by write.</span><br><span class="line">This disk is currently <span class="keyword">in</span> use - repartitioning is probably a bad idea.</span><br><span class="line">It<span class="string">&#x27;s recommended to umount all file systems, and swapoff all swap</span></span><br><span class="line"><span class="string">partitions on this disk.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): p</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Disk /dev/sdc: 8 GiB, 8589934592 bytes, 16777216 sectors</span></span><br><span class="line"><span class="string">Disk model: QEMU HARDDISK</span></span><br><span class="line"><span class="string">Units: sectors of 1 * 512 = 512 bytes</span></span><br><span class="line"><span class="string">Sector size (logical/physical): 512 bytes / 512 bytes</span></span><br><span class="line"><span class="string">I/O size (minimum/optimal): 512 bytes / 512 bytes</span></span><br><span class="line"><span class="string">Disklabel type: gpt</span></span><br><span class="line"><span class="string">Disk identifier: FA6EEB5E-CA1C-4B0D-A7B3-F5CE97C59BC7</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Device     Start      End  Sectors Size Type</span></span><br><span class="line"><span class="string">/dev/sdc1   2048 12580863 12578816   6G Linux RAID</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): d</span></span><br><span class="line"><span class="string">Selected partition 1</span></span><br><span class="line"><span class="string">Partition 1 has been deleted.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): n</span></span><br><span class="line"><span class="string">Partition number (1-128, default 1):</span></span><br><span class="line"><span class="string">First sector (34-16777182, default 2048):</span></span><br><span class="line"><span class="string">Last sector, +/-sectors or +/-size&#123;K,M,G,T,P&#125; (2048-16777182, default 16775167):</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Created a new partition 1 of type &#x27;</span>Linux filesystem<span class="string">&#x27; and of size 8 GiB.</span></span><br><span class="line"><span class="string">Partition #1 contains a linux_raid_member signature.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Do you want to remove the signature? [Y]es/[N]o: N  # 一定要保留当前签名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): t</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Selected partition 1</span></span><br><span class="line"><span class="string">Partition type or alias (type L to list all): 42</span></span><br><span class="line"><span class="string">Changed type of partition &#x27;</span>Linux filesystem<span class="string">&#x27; to &#x27;</span>Linux RAID<span class="string">&#x27;.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Command (m for help): w</span></span><br><span class="line"><span class="string">The partition table has been altered.</span></span><br><span class="line"><span class="string">Syncing disks.</span></span><br></pre></td></tr></table></figure><p>查看调整结果:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part  <span class="comment"># 分区变为了8G</span></span><br><span class="line">  └─md1                                             9:1    0    6G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><h4 id="调整raid"><a href="#调整raid" class="headerlink" title="调整raid"></a>调整raid</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# mdadm --grow /dev/md1 --size=max</span><br><span class="line">mdadm: component size of /dev/md1 has been <span class="built_in">set</span> to 8381440K</span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">NAME                                              MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part</span><br><span class="line">  └─md1                                             9:1    0    8G  0 raid1  <span class="comment"># raid变为了8G</span></span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    6G  0 lvm   /vol2</span><br></pre></td></tr></table></figure><h4 id="调整lvm卷"><a href="#调整lvm卷" class="headerlink" title="调整lvm卷"></a>调整lvm卷</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc#  pvresize /dev/md1</span><br><span class="line">root@HomeFN:/usr/trim/etc# lvresize /dev/trim_fc35013f_f739_4592_942f_d054200d2a3a/0 -l +100%FREE</span><br><span class="line">  Size of logical volume trim_fc35013f_f739_4592_942f_d054200d2a3a/0 changed from 5.99 GiB (1534 extents) to 7.99 GiB (2046 extents).</span><br><span class="line">  Logical volume trim_fc35013f_f739_4592_942f_d054200d2a3a/0 successfully resized.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# lsblk</span><br><span class="line">sdc                                                 8:32   0    8G  0 disk</span><br><span class="line">└─sdc1                                              8:33   0    8G  0 part</span><br><span class="line">  └─md1                                             9:1    0    8G  0 raid1</span><br><span class="line">    └─trim_fc35013f_f739_4592_942f_d054200d2a3a-0 253:1    0    8G  0 lvm   /vol2  <span class="comment"># lvm卷变为了8G</span></span><br></pre></td></tr></table></figure><h4 id="调整文件系统"><a href="#调整文件系统" class="headerlink" title="调整文件系统"></a>调整文件系统</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">root@HomeFN:/usr/trim/etc# btrfs filesystem resize max /vol2/</span><br><span class="line">Resize device <span class="built_in">id</span> 1 (/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0) from 5.99GiB to max</span><br><span class="line"></span><br><span class="line">root@HomeFN:/usr/trim/etc# <span class="built_in">df</span> -Th</span><br><span class="line">/dev/mapper/trim_fc35013f_f739_4592_942f_d054200d2a3a-0 btrfs        8.0G  5.9M  7.5G   1% /vol2  <span class="comment"># 文件系统也变成了8G</span></span><br></pre></td></tr></table></figure><p>我仅仅在单磁盘上做了这个操作, 其他RAID形式我没有操作过, 建议慎重.</p><h2 id="系统更新"><a href="#系统更新" class="headerlink" title="系统更新"></a>系统更新</h2><p>目前我只安装了一个版本, 这个系统的后期更新也是个问题, 包括系统本身, 内部组件, 希望开发团队已经有完整的方案了.</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我觉得飞牛NAS的低层系统以及其技术选型已经非常好了: <code>Debian 12</code>, <code>PostgreSQL</code>, <code>Docker</code>, <code>Rclone</code>, 组件大部分使用<code>Golang</code>编写,自由度拉满, 也方便和我之前的NAS系统做集成, 客户端也多端支持. 我想我没有什么可能拒绝继续使用这个NAS平台.</p><p>另外一点就是我担心他们的目标用户, 如果目标用户是像我一样的NAS使用者, 这个项目怕是要亏到底掉, 我既不想多花钱又不需要技术支持…</p><p>我挺好奇他们的增值服务到底要往什么方向发展, 如果是某个组件收费, 那一个组件的收益怎么负担所有组件的开发, 会不会存在团队间的不平衡?在我看来这个服务一定要走企业化方向的, 类似CentOS的咨询, PVE的授权, 或者是被小米这种厂商收购作为集成系统.</p><p>目前的阶段, 我会尝试使用一部分功能, 但是不会把所有服务都迁移过去. 除非项目组能够在钱烧完之前获得更加稳定的收入流.让用户相信盈利模式可持续比让用户体验一下难太多了, 希望你们能成功吧.</p>]]></content>
    
    
    <summary type="html">上一篇博客介绍了我对于飞牛NAS的一些使用, 这篇博客我就简单分享下我对于这个系统本身的一些研究.</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Linux" scheme="https://corvo.myseu.cn/tags/Linux/"/>
    
    <category term="Debian" scheme="https://corvo.myseu.cn/tags/Debian/"/>
    
    <category term="OpenSSH" scheme="https://corvo.myseu.cn/tags/OpenSSH/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="Proxmox" scheme="https://corvo.myseu.cn/tags/Proxmox/"/>
    
    <category term="LVM" scheme="https://corvo.myseu.cn/tags/LVM/"/>
    
    <category term="PostgreSQL" scheme="https://corvo.myseu.cn/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>飞牛NAS使用体验分享</title>
    <link href="https://corvo.myseu.cn/2025/05/17/2025-05-17-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    <id>https://corvo.myseu.cn/2025/05/17/2025-05-17-%E9%A3%9E%E7%89%9Bnas%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E5%88%86%E4%BA%AB/</id>
    <published>2025-05-17T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>之前一直听说过<a href="https://www.fnnas.com/">飞牛NAS</a>这个系统，最近终于有空体验了一下。试用了几天，感觉相当满意。正好有机会写两篇博客分享我的使用情况，本文将专注于使用体验，另一篇文章会分析其底层系统。</p><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>有些朋友知道，我自己的 NAS 并没有安装定制化的 Linux 系统，而是购买了几块移动硬盘挂载到 <a href="https://www.proxmox.com/en/">Proxmox</a> 中，然后安装 <a href="https://www.debian.org/">Debian</a> 来使用。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747492356082.png" alt="1747492356082.png"></p><p>之后手动启动里面的 Samba, <a href="https://jellyfin.org/">Jellyfin</a> 等服务。因为不止一台机器，也包括云厂商的，所以我使用 <a href="https://k3s.io/">K3s</a> 统一编排这些服务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">(⎈|default:default)➜  BlogSource git:(master) ✗ kubectl get pods</span><br><span class="line">jellyfin-web-b5488b69b-cz69t                1/1     Running   0              15d</span><br><span class="line">timemachine-dbc898585-j4ln8                 1/1     Running   0              42d</span><br><span class="line">uptime-kuma-74b49dd555-qfnvz                1/1     Running   0              22h</span><br><span class="line">samba-7c95544b86-qjj7q                      1/1     Running   0              16d</span><br></pre></td></tr></table></figure><p>我自己额外的服务也有很多，所以只能使用这种形式来组织服务了。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>这次的<a href="https://www.fnnas.com/">飞牛NAS</a>我其实是作为虚拟机安装在<a href="https://www.proxmox.com/en/">Proxmox</a>中的，然后挂了虚拟的硬盘进去：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747492896256.png" alt="1747492896256.png"></p><p>具体过程可以自己尝试下，最后页面大概长这样</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747494483164.png" alt="1747494483164.png"></p><h2 id="我的一些用法"><a href="#我的一些用法" class="headerlink" title="我的一些用法"></a>我的一些用法</h2><h3 id="云盘挂载"><a href="#云盘挂载" class="headerlink" title="云盘挂载"></a>云盘挂载</h3><p>我之前一直开着百度云盘和阿里云盘的会员，这次终于有官方的系统能直接挂载到Linux下面了。另外我还把原有的SMB服务也挂过来了，相当于飞牛NAS做了一个家用NAS的中心</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747495220013.png" alt="1747495220013.png"></p><h3 id="影视照片"><a href="#影视照片" class="headerlink" title="影视照片"></a>影视照片</h3><p>其实我想写篇博客就是因为它的影视功能太好了，我把原来在<a href="https://jellyfin.org/">Jellyfin</a>添加的路径以及网盘保存的电影、电视剧都加到这里了。</p><p>我顺便也给电视和iPad装了客户端，比Plex和Jellyfin使用体验好太多了。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/17/1747495571675.png" alt="1747495571675.png"></p><h3 id="Time-Machine"><a href="#Time-Machine" class="headerlink" title="Time Machine"></a>Time Machine</h3><p>之前我的Time Machine是用容器挂了磁盘来做的，类似这样进行创建的，估计我之后就会把这个功能也放到飞牛里面了。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">timemachine</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">mbentley/timemachine:smb-20250328</span></span><br><span class="line"><span class="attr">hostPath:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">  <span class="attr">hostPath:</span> <span class="string">/run/mount/AppleBackup/timemachine</span></span><br><span class="line">  <span class="attr">podPath:</span> <span class="string">/opt/timemachine</span></span><br></pre></td></tr></table></figure><h3 id="网盘备份"><a href="#网盘备份" class="headerlink" title="网盘备份"></a>网盘备份</h3><p>原来我的备份方案是先用rclone同步到Windows中，再通过Windows虚拟机中的阿里云盘客户端做文件备份的</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">rclone-backup</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">yaml</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">rclone/rclone:1.68</span></span><br><span class="line"><span class="attr">template:</span> <span class="string">rclone</span></span><br><span class="line"><span class="attr">command:</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">/bin/sh</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">while</span> <span class="literal">true</span><span class="string">;</span> <span class="string">do</span> <span class="string">rclone</span> <span class="string">sync</span> <span class="string">/data</span> <span class="string">win-smb:/K3sBackup/$&#123;NODE_NAME&#125;</span> <span class="string">-v;</span> <span class="string">sleep</span> <span class="number">7200</span><span class="string">;</span> <span class="string">done</span></span><br><span class="line"><span class="attr">hostPath:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data-sync</span></span><br><span class="line">  <span class="attr">hostPath:</span> <span class="string">/var/lib/K3sData/</span></span><br><span class="line">  <span class="attr">podPath:</span>  <span class="string">/data</span></span><br></pre></td></tr></table></figure><p>现在可以考虑直接将文件同步到飞牛NAS中，再配置它原生的备份方案来放到网盘了。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747534861771.png" alt="1747534861771.png"></p><h3 id="新加硬盘"><a href="#新加硬盘" class="headerlink" title="新加硬盘"></a>新加硬盘</h3><p>我的另一台NAS上面的硬盘可能不会再动了，但是新买的硬盘估计会用用PVE的USB挂到飞牛这边来了。至于RAID目前我还没有这方面的需求。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/05/18/1747535408666.png" alt="1747535408666.png"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>我挺喜欢它的很多功能的，基本上已经将我心目中的NAS实现了。我甚至想要将部分服务迁移到这里来了(Jellyfin, TimeMachine, alist)。它也增强了很多原来NextCloud的支持不好的功能，如果有一天我开工作室，估计会用它来做内部共享系统，比用很多云服务的SaaS功能提供的都好。</p>]]></content>
    
    
    <summary type="html">之前一直听说飞牛 NAS 系统，最近终于有空体验了一下。试用了几天，感觉相当满意。正好有机会写两篇博客分享我的使用情况，本文将专注于使用体验，另一篇文章会分析其底层系统。</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Linux" scheme="https://corvo.myseu.cn/tags/Linux/"/>
    
    <category term="Debian" scheme="https://corvo.myseu.cn/tags/Debian/"/>
    
    <category term="飞牛" scheme="https://corvo.myseu.cn/tags/%E9%A3%9E%E7%89%9B/"/>
    
    <category term="NAS" scheme="https://corvo.myseu.cn/tags/NAS/"/>
    
    <category term="Proxmox" scheme="https://corvo.myseu.cn/tags/Proxmox/"/>
    
  </entry>
  
  <entry>
    <title>我的半自动化股票交易系统</title>
    <link href="https://corvo.myseu.cn/2025/04/02/2025-04-02-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    <id>https://corvo.myseu.cn/2025/04/02/2025-04-02-%E5%8D%8A%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/</id>
    <published>2025-04-02T23:15:00.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<p>从去年开始，我就逐步在构建自己的交易系统。后来借助 bolt 的支持，我完善了交易系统的前端部分。目前，基本功能已经具备。希望通过这篇文章分享开发流程和交易系统的一些功能，给大家带来启发。不过，本文内容不构成任何投资建议！</p><p>本文内容承接 <a href="https://corvo.myseu.cn/2024/07/17/2024-07-16-InfluxDB%E7%9A%84%E4%BD%BF%E7%94%A8%E4%B8%8E%E4%B8%80%E4%BA%9BA%E8%82%A1%E6%8C%81%E4%BB%93%E5%88%86%E4%BA%AB/">InfluxDB 的使用与一些 A 股持仓分享</a>。当时，我的交易系统已经有了后台任务，定时将部分数据同步到 InfluxDB 并展示出来。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743604757339.png" alt="1743604757339.png"></p><p>去年 11 月，我发现了 <a href="http://bolt.new/">bolt.new</a>，可以使用 AI 快速生成前端代码。我借此机会为交易系统添加了前端页面，对页面效果非常满意。因此，我写下这篇博客，分享我的半自动化股票交易系统。为什么说是半自动化呢？因为我已经设置好了买入卖出的价格和数量，仅使用这个系统执行交易并发送提醒。</p><h2 id="系统界面"><a href="#系统界面" class="headerlink" title="系统界面"></a>系统界面</h2><p>作为游客，你可以直接访问这里：</p><p><a href="https://stock.corvo.fun/">https://stock.corvo.fun/</a></p><p>其中落地页和持仓页面是公开可见的。</p><h3 id="落地页"><a href="#落地页" class="headerlink" title="落地页"></a>落地页</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600093543.png" alt="1743600093543.png"></p><p>这里的图表展示的是上证指数。我问 bolt 有没有更炫酷的落地页，它就生成了这个动态绘图。</p><h3 id="持仓页面"><a href="#持仓页面" class="headerlink" title="持仓页面"></a>持仓页面</h3><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600347451.png" alt="1743600347451.png"></p><p>这里的图表记录了我的仓位分布和操作情况。操作记录中仅显示成功的交易，并支持查看很久以前的交易。</p><hr><h2 id="我的交易计划"><a href="#我的交易计划" class="headerlink" title="我的交易计划"></a>我的交易计划</h2><p><code>Trade Plan</code> 标签页记录了我手动创建的一些条件单。</p><h4 id="上半部分：股票走势"><a href="#上半部分：股票走势" class="headerlink" title="上半部分：股票走势"></a>上半部分：股票走势</h4><p>上半部分展示了选定股票的走势情况：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600539694.png" alt="1743600539694.png"></p><h4 id="下半部分：预期计划"><a href="#下半部分：预期计划" class="headerlink" title="下半部分：预期计划"></a>下半部分：预期计划</h4><p>下半部分是我的预期计划：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743600692668.png" alt="1743600692668.png"></p><p>这些条件单比同花顺或腾讯自选股的条件单更加个性化。我并不纠结程序是否会因故障而错过交易，因为股市从来不缺机会，不是吗？</p><hr><h2 id="一些交易策略"><a href="#一些交易策略" class="headerlink" title="一些交易策略"></a>一些交易策略</h2><p>在上述系统页面中，我记录了一种确定价格和仓位的自动交易策略。此外，这个系统还支持几种其他策略，以下是具体分享。</p><h3 id="1-确定价格和仓位的自动交易"><a href="#1-确定价格和仓位的自动交易" class="headerlink" title="1. 确定价格和仓位的自动交易"></a>1. 确定价格和仓位的自动交易</h3><p>我的仓位图中大约有 20 多只股票。如果每天都要逐一查看这些股票，想想都觉得麻烦。通过程序的自动化，我节省了大量看盘时间。<br>我只需创建股票的交易预期，程序会自动监听并执行操作。例如，对于中远海控，我已经设置好了买卖点对应的价格和数量。</p><h3 id="2-动态止盈的自动交易"><a href="#2-动态止盈的自动交易" class="headerlink" title="2. 动态止盈的自动交易"></a>2. 动态止盈的自动交易</h3><p>对于已经盈利的股票，我会设置一些止盈点来决定何时卖出。<br>以 2500 元为界限，当某只股票的阶段性收益超过 2500 元时，我会考虑卖出接近 2500 元的部分仓位。下一次卖出的点则会递增，比如 2500 × 1.1 &#x3D; 2750 元。<br>我的数据库记录大致如下：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743601874108.png" alt="1743601874108.png"></p><h3 id="3-成功买卖后自动创建未来交易"><a href="#3-成功买卖后自动创建未来交易" class="headerlink" title="3. 成功买卖后自动创建未来交易"></a>3. 成功买卖后自动创建未来交易</h3><p>有些交易策略是以买入和卖出形成闭环的操作逻辑。我实现了一个功能：当每日交易成功后，程序会自动创建未来的交易记录。<br>例如，当我以 1.532 的价格卖出 5000 股某股票时，程序会自动生成一条未来买入记录，价格为卖出价的 0.9 倍（即 1.3788）。同样，买入成功后也会生成未来的卖出记录。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602167758.png" alt="1743602167758.png"></p><hr><h2 id="一些模型和回测的分享"><a href="#一些模型和回测的分享" class="headerlink" title="一些模型和回测的分享"></a>一些模型和回测的分享</h2><p>我认为股票交易在长期来看是一个概率问题，因此会通过模型和回测来量化收益和风险。以下是一些分享：</p><h3 id="盈利与亏损模型"><a href="#盈利与亏损模型" class="headerlink" title="盈利与亏损模型"></a>盈利与亏损模型</h3><p><a href="https://colab.research.google.com/drive/1ZSx6gjOYQBs6Kv3lUFxGAUrbspKn-UKO">查看 Colab Notebook</a></p><p>这个文档并不是告诉你能赚多少钱或亏多少钱，而是帮助你量化预期收益或损失。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602768755.png" alt="1743602768755.png"></p><h3 id="使用-Backtrader-进行回测"><a href="#使用-Backtrader-进行回测" class="headerlink" title="使用 Backtrader 进行回测"></a>使用 Backtrader 进行回测</h3><p><a href="https://colab.research.google.com/drive/10Na4a0COSXyzP6dQbDyjjAn9nerJJY1G">查看 Colab Notebook</a></p><p>这个回测策略是基于某只股票当天价格相较于前一天最高点的跌幅进行买入，再逐步卖出的收益率分析。它可以回测过去几年的数据，标记买卖点并分析最终结果，非常实用。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743602782918.png" alt="1743602782918.png"></p><p>如果你是 Backtrader 的新手，可以参考这个 <a href="https://colab.research.google.com/drive/1a3aKFW656QBf4T3bIWynRWCoogKGlVP7">Notebook</a>，它详细介绍了如何使用 Backtrader 以及展示回测结果。</p><hr><h2 id="bolt-的一些使用技巧"><a href="#bolt-的一些使用技巧" class="headerlink" title="bolt 的一些使用技巧"></a>bolt 的一些使用技巧</h2><h3 id="1-页面分离与项目结构化"><a href="#1-页面分离与项目结构化" class="headerlink" title="1. 页面分离与项目结构化"></a>1. 页面分离与项目结构化</h3><p>在使用 bolt 时，我会要求它将不同的页面或组件进行分离。这不仅方便后续修改，也让项目逻辑更加清晰。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603303831.png" alt="1743603303831.png"></p><h3 id="2-Mock-数据与生产数据分离"><a href="#2-Mock-数据与生产数据分离" class="headerlink" title="2. Mock 数据与生产数据分离"></a>2. Mock 数据与生产数据分离</h3><p>bolt 的后端功能无法完全满足我的需求，因此我要求它规范化接口并提供 Mock 数据功能。以下是实现示例：</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603470481.png" alt="1743603470481.png"></p><p>在开发阶段，页面使用 Mock 数据；而在生产部署时，切换为我自己的接口。这种分离极大提升了开发效率。</p><h3 id="3-客户端集成的痛点"><a href="#3-客户端集成的痛点" class="headerlink" title="3. 客户端集成的痛点"></a>3. 客户端集成的痛点</h3><p>目前，bolt 生成的前端代码需要手动下载并导入到本地项目中。虽然前后端分离已经实现，但这个过程仍然不够高效。希望未来 bolt 能支持远程同步代码到本地的功能。</p><p><img src="https://rawforcorvofeng.cn/blog/2025/04/02/1743603753439.png" alt="1743603753439.png"></p><hr><h2 id="项目部署与自动化"><a href="#项目部署与自动化" class="headerlink" title="项目部署与自动化"></a>项目部署与自动化</h2><p>作为我的老本行，CI&#x2F;CD 流程是我非常熟悉的领域。未来有机会，我会专门写一篇文章分享我的自用 CI&#x2F;CD 流程。</p><hr><h2 id="整理和总结"><a href="#整理和总结" class="headerlink" title="整理和总结"></a>整理和总结</h2><p>虽然我的账户一直是盈利的，但我并不在意这个交易系统能赚多少钱或亏多少钱。对我来说，这个系统的意义在于让交易更加结构化和可追溯化。<br>大多数时候，我们追求的不是赚钱，而是创建一个系统来解决问题。当你解决了足够多的问题，自然会获得一些收益。<br>我并不认为自己是投资者，而是一个拥有自动化工具的交易员。</p><hr>]]></content>
    
    
    <summary type="html">从去年开始, 我就逐步在构建自己的交易系统, 后来借助bolt的支持, 将交易系统的前端部分也进行了完善. 目前基本的功能也已经具备. 希望借这篇文章能把开发流程以及交易系统的部分功能与大家分享一下, 希望有所启发. 此文章分享的内容不构成任何投资建议!!</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="Python" scheme="https://corvo.myseu.cn/tags/Python/"/>
    
    <category term="A股" scheme="https://corvo.myseu.cn/tags/A%E8%82%A1/"/>
    
    <category term="股票" scheme="https://corvo.myseu.cn/tags/%E8%82%A1%E7%A5%A8/"/>
    
    <category term="回测" scheme="https://corvo.myseu.cn/tags/%E5%9B%9E%E6%B5%8B/"/>
    
    <category term="bolt" scheme="https://corvo.myseu.cn/tags/bolt/"/>
    
    <category term="QMT" scheme="https://corvo.myseu.cn/tags/QMT/"/>
    
    <category term="交易系统" scheme="https://corvo.myseu.cn/tags/%E4%BA%A4%E6%98%93%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="Stock" scheme="https://corvo.myseu.cn/tags/Stock/"/>
    
    <category term="Backtrader" scheme="https://corvo.myseu.cn/tags/Backtrader/"/>
    
  </entry>
  
  <entry>
    <title>日本旅游时的井盖</title>
    <link href="https://corvo.myseu.cn/2025/03/04/2025-03-04-%E6%97%A5%E6%9C%AC%E6%97%85%E6%B8%B8%E6%97%B6%E7%9A%84%E4%BA%95%E7%9B%96/"/>
    <id>https://corvo.myseu.cn/2025/03/04/2025-03-04-%E6%97%A5%E6%9C%AC%E6%97%85%E6%B8%B8%E6%97%B6%E7%9A%84%E4%BA%95%E7%9B%96/</id>
    <published>2025-03-04T15:32:41.000Z</published>
    <updated>2026-08-22T01:24:19.480Z</updated>
    
    <content type="html"><![CDATA[<!-- 文档内容部分 --><p>在日本旅行时，我发现日本的井盖设计非常精美，每个城市都有其独特的设计风格。以下是我在不同城市拍摄的井盖照片集。</p><!-- 数据配置部分 --><script type="text/javascript">// 图片 URL 前缀配置const IMAGE_PREFIX = {  RAW: "https://rawforcorvofeng.cn",  BLOG: "https://rawforcorvofeng.cn/blog/2024/10/16",  JAPAN: "https://rawforcorvofeng.cn/JapanManholeCover"};// 图片数据配置const galleryImages = {  "大阪": [    {      path: "/JapanManholeCover/DSC06881.jpeg",      location: "大阪",      description: "已经忘记在哪里拍的了"    },    {      path: "/JapanManholeCover/DSC07062.jpeg",      location: "天王寺",      // description: ""    },    {      path: "/JapanManholeCover/IMG_6894.jpeg",      location: "大阪府",      // description: ""    },    {      path: "/JapanManholeCover/IMG_6951.jpeg",      location: "茶屋町駅",      // description: ""    },  ],  "神户": [    {      path: "/JapanManholeCover/IMG_6902.jpeg",      location: "神户三宫",      description: ""    },    {      path: "/JapanManholeCover/IMG_6910.jpeg",      location: "东川崎町",      description: ""    },    {      path: "/JapanManholeCover/IMG_6913.jpeg",      location: "东川崎町-2",      description: ""    },    {      path: "/JapanManholeCover/IMG_6914.jpeg",      location: "須磨",      description: ""    },  ],  "宇治": [    {      path: "/JapanManholeCover/IMG_6957.jpeg",      location: "宇治",      description: ""    },    {      path: "/JapanManholeCover/IMG_6966.jpeg",      location: "宇治-2",      description: ""    },    {      path: "/JapanManholeCover/IMG_7027.jpeg",      location: "宇治-3",      description: ""    },    {      path: "/JapanManholeCover/IMG_7040.jpeg",      location: "宇治-4",      description: ""    },    {      path: "/JapanManholeCover/IMG_7048.jpeg",      location: "宇治上神社",      description: ""    },  ],  "奈良": [    {      path: "/JapanManholeCover/IMG_7211.jpeg",      location: "奈良",      description: ""    }  ]};// 处理图片数据，添加完整 URLconst galleryData = Object.fromEntries(  Object.entries(galleryImages).map(([city, images]) => [    city,    images.map(img => ({      ...img,      url: `${IMAGE_PREFIX.RAW}${img.path}`    }))  ]));</script><!-- 样式部分 --><style>  .gallery-section {    margin: 2rem -2rem;    padding: 20px;    background: rgba(255, 255, 255, 0.6);    backdrop-filter: blur(10px);    -webkit-backdrop-filter: blur(10px);    border-radius: 20px;    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);  }    .gallery-title {    font-size: 1.8rem;    margin-bottom: 1.5rem;    color: #1d1d1f;    font-weight: 500;    padding-left: 15px;    border-left: 4px solid #007AFF;  }  #images {    display: flex;    flex-direction: column;    gap: 30px;    padding: 0;    width: 100%;  }  .image-group {    position: relative;    width: 100%;  }  .image-group-inner {    display: grid;    gap: 20px;    padding: 0 20px;  }  /* 根据图片数量自动调整网格布局 */  .image-group-inner[data-count="1"] {    grid-template-columns: 1fr;    max-width: 800px;    margin: 0 auto;  }  .image-group-inner[data-count="2"] {    grid-template-columns: repeat(2, 1fr);  }  .image-group-inner[data-count="3"] {    grid-template-columns: repeat(3, 1fr);  }  .image-group-inner[data-count="4"] {    grid-template-columns: repeat(2, 1fr);  }  .image-group-inner[data-count="5"],  .image-group-inner[data-count="6"] {    grid-template-columns: repeat(3, 1fr);  }  .image-container {    width: 100%;    padding-bottom: 100%;    position: relative;    border-radius: 12px;    overflow: hidden;    background: rgba(255, 255, 255, 0.7);    backdrop-filter: blur(10px);    -webkit-backdrop-filter: blur(10px);    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);    transition: transform 0.3s ease, box-shadow 0.3s ease;  }  .image-container:hover {    transform: scale(1.02);    box-shadow: 0 8px 12px rgba(0, 0, 0, 0.15);  }  .image-container img {    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    object-fit: cover;    transition: filter 0.3s ease;    will-change: filter;  /* 优化渲染性能 */    /* transform: translateZ(0);  强制GPU加速 */  }  /* 添加占位符样式 */  .image-container::before {    content: '';    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;    background: #f0f0f0;    border-radius: 12px;  }  .location-label {    position: absolute;    bottom: 0;    left: 0;    right: 0;    padding: 12px;    background: rgba(255, 255, 255, 0.8);    backdrop-filter: blur(5px);    -webkit-backdrop-filter: blur(5px);    font-size: 0.9rem;    color: #1d1d1f;    text-align: center;  }  /* 响应式布局 */  @media (max-width: 1024px) {    .gallery-section {      margin: 1.5rem -1.5rem;      padding: 15px;    }    .gallery-title {      font-size: 1.5rem;      margin-bottom: 1.2rem;    }    .image-group-inner[data-count="3"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: repeat(2, 1fr);    }    .image-group-inner {      gap: 15px;      padding: 0 15px;    }  }  @media (max-width: 640px) {    .gallery-section {      margin: 1rem -1rem;      padding: 12px;      border-radius: 15px;    }    .gallery-title {      font-size: 1.3rem;      margin-bottom: 1rem;      padding-left: 12px;      border-left: 3px solid #007AFF;    }    .image-group-inner {      gap: 12px;      padding: 0 8px;    }    .image-group-inner[data-count="2"],    .image-group-inner[data-count="3"],    .image-group-inner[data-count="4"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: repeat(2, 1fr);      gap: 8px;    }    .image-container {      border-radius: 8px;    }    .location-label {      padding: 8px;      font-size: 0.85rem;    }  }  @media (max-width: 380px) {    .gallery-section {      margin: 0.8rem -0.8rem;      padding: 10px;    }    .image-group-inner {      padding: 0 6px;    }    .image-group-inner[data-count="2"],    .image-group-inner[data-count="3"],    .image-group-inner[data-count="4"],    .image-group-inner[data-count="5"],    .image-group-inner[data-count="6"] {      grid-template-columns: 1fr;      gap: 10px;    }    .location-label {      padding: 6px;      font-size: 0.8rem;    }  }</style><!-- 图片展示容器 --><div id='images'></div><!-- 脚本部分 --><script type="module">  document.addEventListener("DOMContentLoaded", function() {    const container = document.getElementById('images');    // 创建图片组    for (const [city, images] of Object.entries(galleryData)) {      const groupSection = document.createElement('div');      groupSection.classList.add('gallery-section');            const groupTitle = document.createElement('h2');      groupTitle.classList.add('gallery-title');      groupTitle.textContent = city;            const groupContainer = document.createElement('div');      groupContainer.classList.add('image-group');      const groupInner = document.createElement('div');      groupInner.classList.add('image-group-inner');      groupInner.setAttribute('data-count', images.length);      images.forEach(imageData => {        const anchor = document.createElement('a');        anchor.setAttribute('data-fancybox', city);        anchor.setAttribute('data-src', imageData.url);        const caption = `${city} · ${imageData.location}${imageData.description ? ` - ${imageData.description}` : ''}`;        anchor.setAttribute('data-caption', caption);        anchor.setAttribute('data-slug', imageData.location);        const imgContainer = document.createElement('div');        imgContainer.classList.add('image-container');        const img = document.createElement('img');        // 添加原生懒加载和异步解码        img.setAttribute('loading', 'lazy');        img.setAttribute('decoding', 'async');        // 使用较小的缩略图作为预览        const thumbnailUrl = imageData.url.replace('/JapanManholeCoverCompressed/', '/JapanManholeCoverCompressed/thumbnails/');        img.setAttribute('data-src', thumbnailUrl);        img.style.cssText = 'position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;';        // 添加渐进式加载效果        const fullImg = new Image();        fullImg.src = imageData.url;        fullImg.onload = () => {          img.src = imageData.url;          img.style.transition = 'filter 0.3s ease';          img.style.filter = 'none';        };        img.style.filter = 'blur(10px)';        const locationLabel = document.createElement('div');        locationLabel.classList.add('location-label');        locationLabel.textContent = imageData.location;        imgContainer.appendChild(img);        imgContainer.appendChild(locationLabel);        anchor.appendChild(imgContainer);        groupInner.appendChild(anchor);      });      groupContainer.appendChild(groupInner);      groupSection.appendChild(groupTitle);      groupSection.appendChild(groupContainer);      container.appendChild(groupSection);    }    // 懒加载实现    const lazyImages = document.querySelectorAll('img.lazy');    const imageObserver = new IntersectionObserver((entries, observer) => {      entries.forEach(entry => {        if (entry.isIntersecting) {          const img = entry.target;          img.src = img.getAttribute('data-src');          img.addEventListener('load', () => {            img.classList.add('loaded');          });          img.classList.remove('lazy');          observer.unobserve(img);        }      });    }, {      rootMargin: '50px 0px',      threshold: 0.1    });    lazyImages.forEach(img => {      imageObserver.observe(img);    });  });</script><p>这里图片的布局相关都是使用cursor实现的, 强大啊!</p>]]></content>
    
    
    <summary type="html">这里记录了我在日本时拍到的一些漂亮的井盖</summary>
    
    
    
    <category term="Docs" scheme="https://corvo.myseu.cn/categories/Docs/"/>
    
    
    <category term="日本" scheme="https://corvo.myseu.cn/tags/%E6%97%A5%E6%9C%AC/"/>
    
    <category term="旅游" scheme="https://corvo.myseu.cn/tags/%E6%97%85%E6%B8%B8/"/>
    
  </entry>
  
</feed>
