{"id":4994,"date":"2026-10-08T07:05:00","date_gmt":"2026-10-07T23:05:00","guid":{"rendered":"https:\/\/laoyulaoyu.com\/?p=4994"},"modified":"2026-09-21T23:06:22","modified_gmt":"2026-09-21T15:06:22","slug":"%e8%b6%85%e5%8d%96%e6%8c%89%e9%92%ae%e7%be%8e%e8%82%a125%e5%b9%b4%e6%9c%89%e6%95%88%ef%bc%8ca%e8%82%a133%e5%b9%b4%e5%8f%aa%e5%89%a9%e5%b9%b4%e5%8c%961-3","status":"publish","type":"post","link":"https:\/\/laoyulaoyu.com\/index.php\/2026\/10\/08\/%e8%b6%85%e5%8d%96%e6%8c%89%e9%92%ae%e7%be%8e%e8%82%a125%e5%b9%b4%e6%9c%89%e6%95%88%ef%bc%8ca%e8%82%a133%e5%b9%b4%e5%8f%aa%e5%89%a9%e5%b9%b4%e5%8c%961-3\/","title":{"rendered":"\u8d85\u5356\u6309\u94ae\u7f8e\u80a125\u5e74\u6709\u6548\uff0cA\u80a133\u5e74\u53ea\u5269\u5e74\u53161.3%"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u4f5c \u8005\uff1a<a href=\"https:\/\/www.laoyulaoyu.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u8001\u4f59\u635e\u9c7c<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">\u539f\u521b\u4e0d\u6613\uff0c\u8f6c\u8f7d\u8bf7\u6807\u660e\u51fa\u5904\u53ca\u539f\u4f5c\u8005\u3002<\/mark><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"900\" height=\"383\" src=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/10\/cover.png\" alt=\"\" class=\"wp-image-4999\" srcset=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/10\/cover.png 900w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/10\/cover-300x128.png 300w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/10\/cover-766x326.png 766w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6587\u4e2d\u793a\u4f8b\u4ec5\u7528\u4e8e\u6280\u672f\u8ba8\u8bba\uff0c\u4e0d\u6784\u6210\u4efb\u4f55\u64cd\u4f5c\u5efa\u8bae\u3002<br>\u91cf\u5316\u7b56\u7565\u5f00\u53d1\u5e94\u4ee5\u5b66\u4e60\u548c\u6280\u672f\u4ea4\u6d41\u4e3a\u76ee\u7684\u3002<br>\u672c\u53f7\u4e0d\u8350\u80a1\u3001\u4e0d\u5356\u8bfe\u3001\u4e0d\u627f\u8bfa\u6536\u76ca\u3002<br>\u5e02\u573a\u6709\u98ce\u9669\uff0c\u8bf7\u5408\u6cd5\u5408\u89c4\u6295\u8d44\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">\u672c\u6587\u7ea6 2500 \u5b57 | \u9884\u8ba1\u9605\u8bfb 6 \u5206\u949f\uff0c\u540e\u6709\u5b8c\u6574\u4ee3\u7801\uff0c\u5efa\u8bae\u5148\u6536\u85cf\u3002<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">\u00b7 \u00b7 \u00b7<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5148\u770b\u4e00\u7ec4\u6570\u5b57\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u4e00\u5957\u89c4\u5219\uff0c\u5728\u7f8e\u80a1\u8dd1\u4e86 25 \u5e74\uff0c223 \u7b14\uff0c\u80dc\u7387 67.3%\uff0c\u6700\u5927\u56de\u64a4 27.54%\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u4e00\u5957\u89c4\u5219\uff0c\u5728 A \u80a1\u8dd1\u4e86 33 \u5e74\uff0c351 \u7b14\uff0c\u5e74\u5316 1.31%\uff0c33 \u5e74\u603b\u5171\u6512\u4e86 55%\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u518d\u540c\u4e00\u5957\u89c4\u5219\uff0c\u5728\u6caa\u6df1300ETF \u4e0a\u8dd1\u4e86 14 \u5e74\uff0c142 \u7b14\uff0c\u5e74\u5316\u8d1f 1.02%\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2a\u6307\u6807\uff0c\u4e24\u6761\u89c4\u5219\uff0c\u4e09\u4e2a\u5e02\u573a\uff0c\u4e09\u5f20\u6210\u7ee9\u5355\u3002\u8dd1\u5b8c\u8fd9\u7ec4\u5bf9\u7167\uff0c\u6211\u628a\u4e09\u5f20\u8868\u7ffb\u6765\u8986\u53bb\u770b\u4e86\u5f88\u4e45\u3002\u5b83\u56de\u7b54\u4e86\u4e00\u4e2a\u6211\u60e6\u8bb0\u5f88\u4e45\u7684\u95ee\u9898\uff0c\u90a3\u4e9b\u5728\u522b\u4eba\u624b\u91cc\u7075\u5149\u7684\u8d85\u5356\u7b56\u7565\uff0c\u642c\u5230 A \u80a1\u8fd8\u5269\u51e0\u6210\u529f\u529b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6587\u4e2d\u793a\u4f8b\u4ec5\u7528\u4e8e\u6280\u672f\u8ba8\u8bba\uff0c\u4e0d\u6784\u6210\u4efb\u4f55\u64cd\u4f5c\u5efa\u8bae\u3002<br>\u91cf\u5316\u7b56\u7565\u5f00\u53d1\u5e94\u4ee5\u5b66\u4e60\u548c\u6280\u672f\u4ea4\u6d41\u4e3a\u76ee\u7684\u3002<br>\u672c\u516c\u4f17\u53f7\u4e0d\u8350\u80a1\u3001\u4e0d\u5356\u8bfe\u3001\u4e0d\u627f\u8bfa\u6536\u76ca\u3002<br>\u5e02\u573a\u6709\u98ce\u9669\uff0c\u8bf7\u5408\u6cd5\u5408\u89c4\u6295\u8d44\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e00\u3001\u6309\u94ae\u662f\u4e2a\u4ec0\u4e48\u96f6\u4ef6<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u6309\u94ae\u53eb DeMarker\uff0c\u8bfb\u97f3\u63a5\u8fd1&#8221;\u5fb7\u9a6c\u514b&#8221;\uff0c\u4e3b\u6d41\u884c\u60c5\u8f6f\u4ef6\u91cc\u90fd\u80fd\u7ffb\u5230\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u5e72\u7684\u6d3b\u5f88\u7b80\u5355\u3002\u7ed9\u5e02\u573a\u8fd1\u51e0\u5929\u7684\u72b6\u6001\u91cf\u4e2a\u4f53\u6e29\uff0c\u8bfb\u6570\u4ece 0 \u5230 100\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b97\u6cd5\u53ea\u6709\u4e24\u6b65\u3002\u7b2c\u4e00\u6b65\uff0c\u6bcf\u5929\u6536\u76d8\u540e\u770b\u4e24\u4ef6\u4e8b\u3002\u4eca\u5929\u7684\u9ad8\u70b9\u6bd4\u6628\u5929\u9ad8\u51fa\u591a\u5c11\uff0c\u8fd9\u662f\u4e0a\u653b\u7684\u529b\u91cf\u3002\u4eca\u5929\u7684\u4f4e\u70b9\u6bd4\u6628\u5929\u7838\u4f4e\u591a\u5c11\uff0c\u8fd9\u662f\u8ba9\u6b65\u7684\u529b\u91cf\u3002\u7b2c\u4e8c\u6b65\uff0c\u4e24\u80a1\u529b\u91cf\u5404\u53d6 5 \u5929\u5e73\u5747\uff0c\u518d\u505a\u4e2a\u9664\u6cd5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u653b\u5360\u4e0a\u98ce\uff0c\u8bfb\u6570\u9760\u8fd1 100\u3002\u8ba9\u6b65\u5360\u4e0a\u98ce\uff0c\u8bfb\u6570\u5f80 0 \u6389\u3002\u4f4e\u4e8e 10 \u7684\u610f\u601d\u5f88\u76f4\u767d\uff0c\u6700\u8fd1 5 \u5929\u8fd9\u4e2a\u5e02\u573a\u51e0\u4e4e\u5929\u5929\u5728\u8ba9\u6b65\uff0c\u9ad8\u70b9\u4e0d\u518d\u62ac\u9ad8\uff0c\u4f4e\u70b9\u4e0d\u65ad\u88ab\u7838\u7a7f\u3002\u8fd9\u79cd\u8bfb\u6570\u5f88\u5c11\u89c1\uff0c\u7f8e\u80a1\u4e00\u5e74\u91cc\u53ea\u6709 20 \u591a\u5929\u4f1a\u6389\u5230 10 \u4ee5\u4e0b\u3002\u8bb0\u4f4f\u8fd9\u4e2a\u9891\u7387\uff0c\u540e\u9762\u6709\u4e2a\u6570\u5b57\u4f1a\u8ddf\u5b83\u5bf9\u4e0d\u4e0a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b56\u7565\u5c31\u5728\u8fd9\u79cd\u65f6\u523b\u8fdb\u573a\uff0c\u8d4c\u6050\u614c\u91ca\u653e\u5f97\u5dee\u4e0d\u591a\uff0c\u4ef7\u683c\u8981\u5598\u53e3\u6c14\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u6709\u4e2a\u5929\u7136\u7f3a\u9677\uff0c\u53ea\u6d4b\u91cf\uff0c\u4e0d\u89e3\u91ca\u3002\u4f4e\u70b9\u4e3a\u4ec0\u4e48\u88ab\u7838\u7a7f\uff0c\u662f\u8d44\u91d1\u64a4\u79bb\u8fd8\u662f\u6280\u672f\u6027\u56de\u8e29\uff0c\u5b83\u4e00\u6982\u4e0d\u77e5\u3002\u6211\u559c\u6b22\u6d4b\u8fd9\u79cd\u7b28\u6307\u6807\uff0c\u89c4\u5219\u7b28\u5230\u6ca1\u6cd5\u4f5c\u5f0a\uff0c\u7ed3\u679c\u662f\u4ec0\u4e48\u5c31\u662f\u4ec0\u4e48\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2460 DeMarker \u6307\u6807\uff0c\u6838\u5fc3\u5c31\u516d\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def demarker(high, low, window=5):\n    demax = (high - high.shift(1)).clip(lower=0)   # \u4e0a\u653b\u529b\u91cf\n    demin = (low.shift(1) - low).clip(lower=0)     # \u8ba9\u6b65\u529b\u91cf\n    demax_sma = demax.rolling(window).mean()\n    demin_sma = demin.rolling(window).mean()\n    return 100 * demax_sma \/ (demax_sma + demin_sma).replace(0, np.nan)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e8c\u3001\u89c4\u5219\u5c31\u4e24\u6761<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fdb\u573a\uff0cDeMarker(5) \u4f4e\u4e8e 10 \u7684\u90a3\u5929\uff0c\u6536\u76d8\u8bb0\u4e00\u7b14\u4fe1\u53f7\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u79bb\u573a\uff0c\u54ea\u5929\u6536\u76d8\u4ef7\u91cd\u65b0\u7ad9\u4e0a\u524d\u4e00\u65e5\u9ad8\u70b9\uff0c\u8bf4\u660e\u5356\u538b\u505c\u4e86\uff0c\u7b2c\u4e8c\u5929\u5f00\u76d8\u79bb\u573a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ca1\u6709\u76ee\u6807\u4ef7\uff0c\u6ca1\u6709\u6b62\u635f\u7ebf\uff0c\u4e0d\u52a0\u7801\uff0c\u5355\u5411\u505a\u591a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6210\u4ea4\u53e3\u5f84\u5355\u72ec\u4ea4\u4ee3\u4e00\u4e0b\u3002\u4fe1\u53f7\u5728\u6536\u76d8\u786e\u8ba4\uff0c\u6210\u4ea4\u653e\u5728\u4e0b\u4e00\u6839 K \u7ebf\u7684\u5f00\u76d8\uff0c\u4e2d\u95f4\u9694\u4e00\u6839 K \u7ebf\u3002\u4e0d\u5c11\u56de\u6d4b\u7684\u5751\u5c31\u5751\u5728\u770b\u5230\u4fe1\u53f7\u7acb\u523b\u6309\u6536\u76d8\u4ef7\u6210\u4ea4\uff0c\u7b49\u4e8e\u5077\u770b\u4e86\u672a\u6765\u3002\u8fd9\u7b14\u8d26\u6211\u4e0d\u5077\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8d39\u7528\u6309\u53cc\u8fb9\u4e07\u5206\u4e4b\u4e00\u52a0\u6ed1\u70b9\u4e07\u5206\u4e4b\u4e8c\u8ba1\uff0c\u4fe1\u53f7\u548c\u7ed3\u7b97\u90fd\u7528\u672a\u590d\u6743\u4ef7\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2461 \u4fe1\u53f7\u72b6\u6001\u673a\uff0c\u51b3\u7b56\u4e0e\u6210\u4ea4\u5206\u79bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def build_signals(df):\n    n = len(df)\n    close = df&#91;\"close\"].to_numpy()\n    dm = demarker(df&#91;\"high\"], df&#91;\"low\"]).to_numpy()\n    signal = dm &lt; 10    # NaN \u6bd4\u8f83\u8fd4\u56de False\uff0c\u5929\u7136\u5b89\u5168\n\n    decision_entries = np.zeros(n, dtype=bool)\n    decision_exits = np.zeros(n, dtype=bool)\n    in_position = False\n    for i in range(n):\n        if not in_position:\n            if signal&#91;i]:\n                decision_entries&#91;i] = True   # \u6536\u76d8\u51b3\u7b56\n                in_position = True\n        elif i &gt; 0 and close&#91;i] &gt; df&#91;\"high\"].iloc&#91;i - 1]:\n            decision_exits&#91;i] = True         # \u7ad9\u4e0a\u6628\u65e5\u9ad8\u70b9\n            in_position = False\n    # \u51b3\u7b56\u6574\u4f53\u540e\u79fb\u4e00\u6839\uff0c\u6210\u4ea4\u843d\u5728\u4e0b\u4e00\u6839\u5f00\u76d8\n    entries = np.zeros(n, dtype=bool)\n    exits = np.zeros(n, dtype=bool)\n    entries&#91;1:] = decision_entries&#91;:-1]\n    exits&#91;1:] = decision_exits&#91;:-1]\n    return entries, exits<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e09\u3001\u5148\u770b SPY 25 \u5e74<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f8e\u80a1\u8fd9\u8fb9\u6211\u7528 SPY\uff0c2001 \u5e74 1 \u6708\u5230\u4eca\u5e74 9 \u6708\uff0c6465 \u6839\u65e5\u7ebf\u3002\u8868\u5148\u4e0a\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\u6307\u6807<\/th><th>\u6050\u614c\u6309\u94ae<\/th><th>\u4e00\u76f4\u6301\u6709<\/th><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u4ea4\u6613\u7b14\u6570<\/td><td class=\"has-text-align-center\" data-align=\"center\">223<\/td><td class=\"has-text-align-center\" data-align=\"center\">223<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u80dc\u7387<\/td><td class=\"has-text-align-center\" data-align=\"center\">67.3%<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u65e0<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u76c8\u4e8f\u6bd4<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.45<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u65e0<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u5e74\u5316\u6536\u76ca<\/td><td class=\"has-text-align-center\" data-align=\"center\">2.27%<\/td><td class=\"has-text-align-center\" data-align=\"center\">7.16%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u6700\u5927\u56de\u64a4<\/td><td class=\"has-text-align-center\" data-align=\"center\">27.54%<\/td><td class=\"has-text-align-center\" data-align=\"center\">56.47%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u5728\u573a\u65f6\u95f4<\/td><td class=\"has-text-align-center\" data-align=\"center\">12.4%<\/td><td class=\"has-text-align-center\" data-align=\"center\">100%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5355\u770b\u6536\u76ca\uff0c\u8fd9\u7b56\u7565\u4e0d\u53ca\u683c\uff0c\u5e74\u5316 2.27% \u8fde\u6301\u6709\u7684\u4e00\u534a\u90fd\u4e0d\u5230\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u503c\u94b1\u7684\u5730\u65b9\u5728\u53f3\u534a\u8fb9\u3002\u56de\u64a4 27.54%\uff0c\u6301\u6709\u8981\u625b 56.47%\uff0c\u76f4\u63a5\u780d\u6389\u4e00\u534a\u3002\u4e00\u5e74 87.6% \u7684\u65e5\u5b50\u662f\u7a7a\u4ed3\u7684\uff0c\u94b1\u5927\u90e8\u5206\u65f6\u95f4\u8eba\u5728\u573a\u5916\uff0c\u7a81\u53d1\u7684\u9ed1\u5929\u9e45\u5927\u90e8\u5206\u90fd\u4e0d\u5728\u573a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8d62\u4e8f\u7684\u5f62\u72b6\u4e5f\u8bb0\u4e00\u4e0b\u3002\u5e73\u5747\u6bcf\u7b14\u8d62 1.39%\uff0c\u5e73\u5747\u6bcf\u7b14\u4e8f 1.97%\uff0c\u4e8f\u5355\u6bd4\u8d62\u5355\u91cd\uff0c\u9760 67.3% \u7684\u80dc\u7387\u628a\u8d26\u505a\u5e73\u3002\u4e2d\u4f4d\u6301\u4ed3\u53ea\u6709 4 \u5929\uff0c\u6700\u4e45\u7684\u4e00\u7b14\u62ff\u4e86 23 \u5929\uff0c\u4e00\u5e74\u51fa\u624b\u4e0d\u5230 9 \u6b21\uff0c\u8c08\u4e0d\u4e0a\u4ec0\u4e48\u957f\u7ebf\u529f\u592b\uff0c\u66f4\u50cf\u9ad8\u9891\u77ed\u8dd1\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7edf\u8ba1\u68c0\u9a8c\u4e5f\u505a\u4e86\u3002223 \u7b14\u7684\u5355\u7b14\u5747\u503c 0.29%\uff0c\u91cd\u62bd 5000 \u6b21\uff0c95% \u533a\u95f4\u843d\u5728\u8d1f 0.04% \u4e0e 0.61% \u4e4b\u95f4\uff0c\u5747\u503c\u4f4e\u4e8e\u96f6\u7684\u6982\u7387 4.5%\u3002\u8e29\u7740\u53ca\u683c\u7ebf\u8fc7\uff0c\u4e0d\u7b97\u6f02\u4eae\uff0c\u4f46\u786e\u5b9e\u7ad9\u5728\u96f6\u7684\u53f3\u8fb9\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u590f\u666e\u6bd4\u4e00\u6bd4\u66f4\u624e\u5fc3\uff0c\u7b56\u7565 0.28\uff0c\u6301\u6709 0.46\uff0c\u5355\u4f4d\u98ce\u9669\u7684\u56de\u62a5\u4e5f\u4e0d\u5360\u4f18\u3002\u5b83\u7684\u4ef7\u503c\u5168\u538b\u5728\u56de\u64a4\u548c\u7a7a\u4ed3\u8fd9\u4e24\u4ef6\u4e8b\u4e0a\uff0c\u56fe\u6536\u76ca\u7684\u4eba\u770b\u4e0d\u4e0a\u5b83\uff0c\u56fe\u7761\u5f97\u7740\u7684\u4eba\u624d\u4f1a\u591a\u770b\u4e24\u773c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2462 \u56de\u6d4b\u4e3b\u5faa\u73af\uff0c\u51c0\u503c\u5c31\u662f\u5355\u7b14\u7684\u8fde\u4e58<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def run_backtest(df):\n    entries, exits = build_signals(df)\n    n = len(df)\n    open_ = df&#91;\"open\"].to_numpy()\n    trades = &#91;]\n    i = 1\n    while i &lt; n:\n        if entries&#91;i]:\n            j = next((k for k in range(i + 1, n) if exits&#91;k]), None)\n            if j is None:\n                break\n            entry_eff = open_&#91;i] * (1 + SLIPPAGE + FEES)\n            exit_eff = open_&#91;j] * (1 - SLIPPAGE - FEES)\n            trades.append(exit_eff \/ entry_eff - 1)\n            i = j\n        i += 1\n    tr = np.array(trades)\n    eq = INIT_CASH\n    for r in tr:\n        eq *= 1 + r    # \u7a7a\u4ed3\u65e5\u51c0\u503c\u51bb\u7ed3\uff0c\u7ec8\u503c\u5c31\u662f\u5355\u7b14\u7684\u8fde\u4e58\n    return tr, eq \/ INIT_CASH - 1<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u56db\u3001\u4f46\u771f\u6b63\u8be5\u76ef\u7740\u770b\u7684\u5728\u4e0b\u9762<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a 223 \u7b14\u6309\u65f6\u95f4\u6492\u5230\u56fe\u4e0a\uff0c\u6545\u4e8b\u7684\u53e6\u4e00\u9762\u5c31\u9732\u51fa\u6765\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2008 \u5e74 9 \u6708\u5230 2009 \u5e74 3 \u6708\u90a3\u4e00\u6bb5\uff0c\u6700\u8d5a\u548c\u6700\u4e8f\u6324\u5728\u4e00\u8d77\u30022008 \u5e74 11 \u6708 21 \u65e5\u8fdb\u573a\u90a3\u7b14\u8d5a\u4e86 12.64%\uff0c\u662f 25 \u5e74\u91cc\u6700\u5927\u7684\u4e00\u7b14\u3002\u4e24\u4e2a\u591a\u6708\u540e\uff0c2009 \u5e74 2 \u6708 18 \u65e5\u8fdb\u573a\u90a3\u7b14\u4e8f\u4e86 12.2%\uff0c\u6210\u4e86 25 \u5e74\u91cc\u6700\u60e8\u7684\u4e00\u7b14\u3002\u540c\u4e00\u573a\u5371\u673a\uff0c\u65e2\u662f\u8fd9\u7b56\u7565\u7684\u5dc5\u5cf0\uff0c\u4e5f\u662f\u5b83\u7684\u6df1\u5751\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"320\" src=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl-1024x320.png\" alt=\"\" class=\"wp-image-4995\" srcset=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl-1024x320.png 1024w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl-300x94.png 300w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl-766x239.png 766w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl-1536x479.png 1536w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/02-trade-pnl.png 1964w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u7ea2\u76c8\u7eff\u4e8f\uff0c\u6700\u8d5a\u4e0e\u6700\u4e8f\u7684\u5355\u7b14\u6324\u5728\u540c\u4e00\u6bb5\u6050\u614c\u91cc<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5371\u673a\u540e\u6bb5\u7684\u8d26\u5355\u4e5f\u5f97\u8ba4\u30022009 \u5e74\u5269\u4e0b\u7684 7 \u7b14\u5408\u8ba1\u4e8f 8.5%\uff0c2020 \u5e74 3 \u6708\u7194\u65ad\u5468\u524d\u540e\u8fdb\u573a 6 \u7b14\uff0c\u6700\u75bc\u4e00\u7b14\u8d1f 8.38%\uff0c\u5408\u8ba1\u5c0f\u4e8f 1.8%\u3002\u518d\u5f80\u524d\u6570\uff0c2001 \u5e74 9 \u6708 4 \u65e5\u90a3\u7b14\u4e8f\u4e86 11.56%\uff0c\u8fdb\u573a\u65f6 911 \u4e8b\u4ef6\u540e\u7684\u4f59\u9707\u8fd8\u6ca1\u6563\u5b8c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u662f\u63a5\u98de\u5200\u7b56\u7565\u7684\u8bda\u5b9e\u5f62\u72b6\uff0c\u63a5\u4f4f\u7684\u662f\u9ec4\u91d1\u8fd8\u662f\u5200\u67c4\uff0c\u6309\u4e0b\u53bb\u90a3\u4e00\u523b\u6ca1\u4eba\u77e5\u9053\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u53c8\u52a0\u4e86\u4e00\u9053\u5bf9\u7167\u3002\u540c\u6837 223 \u4e2a\u8fdb\u573a\u540d\u989d\uff0c\u968f\u673a\u6492\u5230 25 \u5e74\u7684\u65e5\u5386\u4e0a\uff0c\u79bb\u573a\u89c4\u5219\u4e0d\u53d8\uff0c\u8dd1 200 \u904d\u3002\u7ed3\u679c\u6709\u70b9\u5413\u4eba\uff0c\u968f\u673a\u7ec4\u5408\u7684\u603b\u6536\u76ca\u4e2d\u4f4d\u6570\u662f\u8d1f 70%\uff0c\u6700\u60e8\u7684\u4e8f\u6389 83%\u3002\u6211\u8fd9 223 \u7b14\u6392\u5728 200 \u904d\u91cc\u7684\u7b2c\u4e00\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u4e00\u628a\u79bb\u573a\u7684\u5c3a\u5b50\uff0c\u968f\u673a\u8fdb\u573a\u4e8f\u6210\u8fd9\u6837\uff0c\u6311\u8fdb\u573a\u65f6\u673a\u7684\u4ef7\u503c\u4e00\u4e0b\u5c31\u91cf\u51fa\u6765\u4e86\u3002\u8fd9\u628a\u5c3a\u5b50\u81ea\u5df1\u4e0d\u8d5a\u94b1\uff0cDeMarker \u6311\u7684\u4f4d\u7f6e\u624d\u662f\u5168\u90e8\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2463 \u968f\u673a\u57fa\u7ebf\uff0c\u540c\u540d\u989d\u968f\u673a\u6492\u70b9<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def random_baseline(df, n_entries, n_sims=200):\n    rng = np.random.default_rng(42)\n    totals = &#91;]\n    for _ in range(n_sims):\n        mask = np.zeros(len(df), dtype=bool)\n        days = rng.choice(np.arange(1, len(df) - 1), size=n_entries, replace=False)\n        mask&#91;days] = True\n        eq, shares, in_pos = INIT_CASH, 0.0, False\n        i = 1\n        while i &lt; len(df):\n            if not in_pos and mask&#91;i - 1]:          # \u524d\u4e00\u65e5\u51b3\u7b56\uff0c\u5f53\u65e5\u5f00\u76d8\u6210\u4ea4\n                in_pos = True\n                shares = eq \/ (df&#91;\"open\"].iloc&#91;i] * (1 + SLIPPAGE + FEES))\n                eq = shares * df&#91;\"close\"].iloc&#91;i]\n            elif in_pos:\n                eq = shares * df&#91;\"close\"].iloc&#91;i]\n                if df&#91;\"close\"].iloc&#91;i] &gt; df&#91;\"high\"].iloc&#91;i - 1]:\n                    eq = shares * df&#91;\"open\"].iloc&#91;i] * (1 - SLIPPAGE - FEES)\n                    in_pos = False\n            i += 1\n        totals.append(eq \/ INIT_CASH - 1)\n    return np.array(totals)   # 25 \u5e74\u91cc\uff0c200 \u6b21\u968f\u673a\u7684\u4e2d\u4f4d\u6570\u662f -70%<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e94\u3001\u642c\u8fdbA\u80a1\uff0c\u6309\u94ae\u54d1\u706b\u4e86<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u6211\u628a\u540c\u4e00\u5957\u4ee3\u7801\u539f\u5c01\u4e0d\u52a8\u6307\u5411 A \u80a1\uff0c\u5148\u8dd1\u4e0a\u8bc1\u6307\u6570\uff0c\u4ece 1993 \u5e74\u5f00\u59cb\uff0c\u548c\u7f8e\u80a1\u90a3\u4e2a\u7ecf\u5178\u7a97\u53e3\u4e00\u6837\u957f\uff0c33.7 \u5e74\u3002\u4e09\u4e2a\u5e02\u573a\u7684\u51c0\u503c\u653e\u5728\u4e00\u8d77\uff0c\u5dee\u8ddd\u4e0d\u7528\u6211\u591a\u8bf4\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"339\" src=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves-1024x339.png\" alt=\"\" class=\"wp-image-4996\" srcset=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves-1024x339.png 1024w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves-300x99.png 300w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves-768x254.png 768w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves-1536x508.png 1536w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/01-equity-curves.png 1965w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u6a59\u7ea2\u7ebf\u662f\u7b56\u7565\uff0c\u7070\u865a\u7ebf\u662f\u6301\u6709\uff0c\u540c\u4e00\u6309\u94ae\u7684\u4e24\u79cd\u547d\u8fd0<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\u6307\u6807<\/th><th>SPY<\/th><th>\u4e0a\u8bc1\u6307\u6570<\/th><th>\u6caa\u6df1300ETF<\/th><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u7b14\u6570<\/td><td class=\"has-text-align-center\" data-align=\"center\">223<\/td><td class=\"has-text-align-center\" data-align=\"center\">351<\/td><td class=\"has-text-align-center\" data-align=\"center\">142<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u80dc\u7387<\/td><td class=\"has-text-align-center\" data-align=\"center\">67.3%<\/td><td class=\"has-text-align-center\" data-align=\"center\">63.5%<\/td><td class=\"has-text-align-center\" data-align=\"center\">63.4%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u76c8\u4e8f\u6bd4<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.45<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.18<\/td><td class=\"has-text-align-center\" data-align=\"center\">0.94<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u5355\u7b14\u5747\u503c<\/td><td class=\"has-text-align-center\" data-align=\"center\">+0.29%<\/td><td class=\"has-text-align-center\" data-align=\"center\">+0.18%<\/td><td>-0.06%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u5e74\u5316\u6536\u76ca<\/td><td class=\"has-text-align-center\" data-align=\"center\">2.27%<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.31%<\/td><td>-1.02%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u6700\u5927\u56de\u64a4<\/td><td class=\"has-text-align-center\" data-align=\"center\">27.54%<\/td><td class=\"has-text-align-center\" data-align=\"center\">34.19%<\/td><td class=\"has-text-align-center\" data-align=\"center\">37.02%<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">\u6301\u6709\u5e74\u5316<\/td><td class=\"has-text-align-center\" data-align=\"center\">7.16%<\/td><td class=\"has-text-align-center\" data-align=\"center\">4.77%<\/td><td class=\"has-text-align-center\" data-align=\"center\">4.03%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6210\u672c\u4e24\u8fb9\u4e00\u4e2a\u6837\uff0c\u8d39\u7528\u548c\u6ed1\u70b9\u7528\u7684\u662f\u540c\u4e00\u5957\u53c2\u6570\uff0c\u8fd9\u4e2a\u5dee\u8ddd\u8d56\u4e0d\u5230\u6210\u672c\u5934\u4e0a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u8bc1 351 \u7b14\uff0c\u80dc\u7387\u8fd8\u6709 63.5%\u3002\u53ef\u5e74\u5316\u53ea\u5269 1.31%\uff0c33 \u5e74\u6512\u4e86 55%\uff0c\u540c\u671f\u6307\u6570\u672c\u8eab\u5e74\u5316 4.77%\u3002\u7edf\u8ba1\u68c0\u9a8c\u4e5f\u8fc7\u4e0d\u53bb\u4e86\u3002\u5355\u7b14\u5747\u503c\u7684 95% \u533a\u95f4\uff0c\u5de6\u7aef\u63a2\u5230\u8d1f 0.16%\uff0c\u53f3\u7aef\u4e5f\u53ea\u591f\u5230 0.52%\uff0c\u5747\u503c\u4f4e\u4e8e\u96f6\u7684\u6982\u7387 14.8%\u3002\u6362\u4e2a\u8bf4\u6cd5\uff0c\u6ca1\u6cd5\u6392\u9664\u767d\u5fd9\u4e00\u573a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6caa\u6df1300ETF \u66f4\u5e72\u8106\u3002\u76c8\u4e8f\u6bd4 0.94\uff0c\u8dcc\u7834 1\uff0c\u5e73\u5747\u6bcf\u7b14\u4e8f 0.06%\uff0c14 \u5e74\u4e0b\u6765\u8d1f 13.7%\u30022015 \u5e74\u79cb\u5929\u90a3 9 \u7b14\u5408\u8ba1 -17.4%\uff0c2018 \u5e74 12 \u7b14\u53c8\u642d\u8fdb\u53bb 7.7%\u300263.4% \u7684\u80dc\u7387\u770b\u7740\u4e0d\u5dee\uff0c\u8f93\u5728\u8d62\u7684\u592a\u5c0f\u3001\u4e8f\u7684\u592a\u91cd\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u75bc\u7684\u4e00\u7b14\u5728 1994 \u5e74\u6625\u5929\u3002\u8fdb\u573a\u4e4b\u540e\u8fde\u7eed 28 \u5929\u6ca1\u7b49\u5230\u6536\u76d8\u7ad9\u4e0a\u6628\u65e5\u9ad8\u70b9\u8fd9\u4e2a\u79bb\u573a\u6761\u4ef6\uff0c\u4e00\u7b14 -19.95%\u3002\u90a3\u662f\u6ca1\u6709\u6da8\u8dcc\u505c\u9650\u5236\u7684\u5e74\u4ee3\uff0c\u6307\u6570\u53ef\u4ee5\u4e0d\u5e26\u5598\u5730\u8fde\u8dcc\u4e00\u4e2a\u6708\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u4e2a\u7ec6\u8282\u8ddf\u76f4\u89c9\u76f8\u53cd\uff0c\u5d29\u76d8\u5e74\u53cd\u800c\u7b97\u4e0d\u4e0a\u6700\u5927\u7684\u5751\u3002\u4e0a\u8bc1 2008 \u5e74\u8fdb\u573a 17 \u7b14\uff0c\u5408\u8ba1\u8fd8\u8d5a 2.2%\uff0c2015 \u5e74 10 \u7b14\u57fa\u672c\u6253\u5e73\uff0c2016 \u5e74 13 \u7b14\u8d5a 5.3%\u3002\u771f\u6b63\u653e\u8840\u7684\u662f\u9634\u8dcc\u78e8\u4eba\u7684\u5e74\u4efd\u30022018 \u5e74\u7684 ETF \u8fdb\u573a 12 \u7b14\uff0c\u4e8f\u6389 7.7%\u30022015 \u5e74\u79cb\u5929 9 \u7b14\uff0c\u4e8f 17.4%\u3002\u6025\u8dcc\u5b83\u63a5\u5f97\u4f4f\uff0c\u9634\u8dcc\u5b83\u63a5\u4e0d\u4f4f\u3002\u7f8e\u80a1\u90a3\u8fb9\u5371\u673a\u8fc7\u540e\u4e00\u4e24\u5e74\u5c31\u7ffb\u7bc7\uff0cA \u80a1\u7684\u718a\u5e02\u62d6\u7740\u957f\u5c3e\uff0c\u78e8\u5e95\u671f\u7684\u5c0f\u4e8f\u4e00\u5e74\u4e00\u5e74\u53e0\u4e0a\u6765\uff0c\u8fd9\u624d\u662f\u5dee\u8ddd\u62c9\u5f00\u7684\u5730\u65b9\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u516d\u3001\u4e3a\u4ec0\u4e48\u540c\u4e00\u4e2a\u6309\u94ae\uff0c\u4e24\u4e2a\u5e02\u573a\u4e0d\u4e00\u4e2a\u58f0<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u7740\u4e09\u5f20\u8868\u770b\u4e86\u4e00\u665a\u4e0a\uff0c\u6211\u7684\u89e3\u91ca\u6709\u56db\u6761\uff0c\u6309\u53ef\u4fe1\u5ea6\u6392\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e00\u6761\uff0cA \u80a1\u7684\u6050\u614c\u4e0d\u5c16\u3002\u4fe1\u53f7\u65e5 SPY \u5e73\u5747\u6bcf\u5e74\u51fa\u73b0 22 \u5929\uff0c\u4e0a\u8bc1 31.8 \u5929\uff0cETF 30.3 \u5929\u3002\u540c\u6837\u7684\u523b\u5ea6\uff0cA \u80a1\u66f4\u5bb9\u6613\u8dcc\u8fdb\u6050\u614c\u533a\uff0c\u8fd9\u4e48\u5bb9\u6613\u89e6\u53d1\u7684\u6050\u614c\u8c08\u4e0d\u4e0a\u6050\u614c\uff0c\u66f4\u50cf\u5e38\u6001\u3002\u7f8e\u80a1\u7684\u6df1\u8dcc\u662f\u63d2\u4e0b\u53bb\u5c31\u5f39\u7684 V \u578b\uff0cA \u80a1\u7684\u6df1\u8dcc\u5e38\u662f\u8db4\u7740\u78e8\u7684 L \u578b\u3002\u8fd9\u4e2a\u6309\u94ae\u60f3\u6293\u7684\u662f\u524d\u4e00\u79cd\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"322\" src=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals-1024x322.png\" alt=\"\" class=\"wp-image-4997\" srcset=\"https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals-1024x322.png 1024w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals-300x94.png 300w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals-768x241.png 768w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals-1536x482.png 1536w, https:\/\/laoyulaoyu.com\/wp-content\/uploads\/2026\/09\/03-annual-signals.png 1965w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u84dd\u67f1\uff08\u4e0a\u8bc1\uff09\u51e0\u4e4e\u5168\u7ebf\u9ad8\u8fc7\u7ea2\u67f1\uff08SPY\uff09<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u6761\uff0c\u79bb\u573a\u7684\u5c3a\u5b50\u5728 A \u80a1\u53cd\u5e94\u6162\u3002\u6536\u76d8\u7ad9\u4e0a\u6628\u65e5\u9ad8\u70b9\u8fd9\u4e2a\u6761\u4ef6\uff0c\u5728\u9634\u8dcc\u91cc\u80fd\u8fde\u7eed\u51e0\u5468\u7b49\u4e0d\u5230\u3002\u7b49\u4e0d\u5230\uff0c\u5c31\u53ea\u80fd\u625b\u7740\u3002\u4e24\u8fb9\u7684\u4e2d\u4f4d\u6301\u4ed3\u90fd\u662f 4 \u5929\uff0c\u4f46 A \u80a1\u6700\u957f\u88ab\u62d6\u5230 28 \u5929\uff0cSPY \u53ea\u6709 23 \u5929\u3002\u591a\u625b\u7684\u6bcf\u4e00\u5929\u90fd\u5728\u653e\u5927\u4e8f\u635f\u3002\u5e73\u5747\u6bcf\u7b14\u4e8f\u635f\uff0cA \u80a1 2.72%\uff0cSPY \u53ea\u6709 1.97%\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e09\u6761\uff0c\u8d54\u7387\u5012\u6302\u3002\u4e0a\u8bc1\u5e73\u5747\u6bcf\u7b14\u8d62 1.85%\uff0c\u4e8f 2.72%\uff0c\u8d62\u5c0f\u4e8f\u5927\uff0c63.5% \u7684\u80dc\u7387\u586b\u4e0d\u5e73\u8fd9\u4e2a\u5751\u3002SPY \u90a3\u8fb9\u662f\u8d62 1.39% \u4e8f 1.97%\uff0c\u9760\u66f4\u9ad8\u7684\u80dc\u7387\u628a\u8d26\u505a\u5e73\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u56db\u6761\u5e26\u63a8\u6d4b\u6210\u5206\u3002\u7f8e\u80a1\u4e0b\u8dcc\u65f6\uff0c\u957f\u671f\u5b9a\u6295\u8d44\u91d1\u771f\u7684\u5728\u627f\u63a5\u3002\u6050\u614c\u8bfb\u6570\u89c1\u5e95\u7684\u4f4d\u7f6e\uff0c\u5e38\u6709\u94b1\u7b49\u7740\u3002A \u80a1\u4e0b\u8dcc\u65f6\u5927\u5bb6\u90fd\u5728\u7b49\u66f4\u4fbf\u5b9c\u7684\u7b79\u7801\uff0c\u627f\u63a5\u6765\u5f97\u665a\uff0c\u5e95\u5c31\u78e8\u5f97\u4e45\u3002\u8fd9\u6761\u6211\u6ca1\u6709\u76f4\u63a5\u8bc1\u636e\uff0c\u662f\u62ff\u884c\u4e3a\u903b\u8f91\u5012\u63a8\u7684\uff0c\u542c\u4e2a\u65b9\u5411\u5c31\u597d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u987a\u624b\u8865\u4e00\u53e5\u968f\u673a\u57fa\u7ebf\u7684\u4e8b\u3002\u968f\u673a\u8fdb\u573a\u5728 A \u80a1\u66f4\u60e8\uff0c\u4e0a\u8bc1\u7684 200 \u4e2a\u968f\u673a\u7ec4\u5408\u603b\u6536\u76ca\u4e2d\u4f4d\u6570\u4e8f 98.6%\uff0c\u7b49\u4e8e\u51e0\u4e4e\u5f52\u96f6\u3002\u4e5f\u5c31\u662f\u8bf4\u5c31\u7b97\u5728 A \u80a1\uff0cDeMarker \u6311\u7684\u4f4d\u7f6e\u4e5f\u6bd4\u778e\u9009\u5f3a\u5f97\u591a\uff0c\u53ea\u662f\u8fd9\u4efd\u5f3a\uff0c\u4e0d\u591f\u628a 1.31% \u7684\u5e74\u5316\u62ac\u5230\u80fd\u770b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u56db\u6761\u51d1\u5728\u4e00\u8d77\uff0c\u7ed3\u8bba\u5f88\u6536\u655b\u3002\u6309\u94ae\u6ca1\u574f\uff0c\u662f\u5899\u7684\u6750\u8d28\u53d8\u4e86\uff0c\u7f8e\u80a1\u90a3\u9762\u5899\u91cc\u57cb\u7740\u56de\u5f39\u7684\u94a2\u4e1d\uff0cA \u80a1\u8fd9\u9762\u5899\u662f\u5b9e\u5fc3\u7684\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u4e03\u3001\u60f3\u81ea\u5df1\u6309\u4e00\u904d\u7684\u4eba\uff0c\u4ece\u8fd9\u91cc\u5f00\u59cb<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u6761\u5efa\u8bae\uff0c\u7167\u7740\u505a\u80fd\u5c11\u8d70\u5f2f\u8def\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e00\uff0c\u6210\u4ea4\u53e3\u5f84\u522b\u5077\u61d2\u3002\u6536\u76d8\u51b3\u7b56\u3001\u6b21\u65e5\u5f00\u76d8\u6210\u4ea4\u3001\u53cc\u8fb9\u6210\u672c\u4e00\u4e07\u5206\u4e4b\u4e09\uff0c\u8fd9\u4e09\u5904\u4efb\u4f55\u4e00\u5904\u653e\u5bbd\uff0c\u6570\u5b57\u90fd\u4f1a\u53d8\u597d\u770b\uff0c\u53d8\u597d\u770b\u7684\u90a3\u90e8\u5206\u5168\u662f\u5047\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\uff0c\u5148\u8dd1\u968f\u673a\u57fa\u7ebf\u518d\u770b\u6536\u76ca\u3002\u540c\u6837\u540d\u989d\u968f\u673a\u6492\u70b9\uff0c\u4f60\u7684\u7b56\u7565\u8dd1\u4e0d\u8d62 200 \u4e2a\u968f\u673a\u7ec4\u5408\uff0c\u540e\u9762\u7684\u8ba8\u8bba\u90fd\u53ef\u4ee5\u7701\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e09\uff0c\u80dc\u7387\u5355\u72ec\u770b\u6ca1\u6709\u610f\u4e49\u3002\u6caa\u6df1300ETF 63.4% \u7684\u80dc\u7387\u914d 0.94 \u7684\u76c8\u4e8f\u6bd4\uff0c\u7167\u6837\u662f\u4e8f\u3002\u5148\u770b\u76c8\u4e8f\u6bd4\u80fd\u4e0d\u80fd\u7ad9\u4e0a 1\uff0c\u518d\u770b\u80dc\u7387\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b8c\u6574\u811a\u672c\u5728\u4e0b\u9762\uff0c\u4e09\u4e2a\u6807\u7684\u3001\u6307\u6807\u3001Bootstrap\u3001\u968f\u673a\u57fa\u7ebf\u5168\u5728\u91cc\u9762\uff0c\u6362\u4e2a\u4ee3\u7801\u5c31\u80fd\u8dd1\u4f60\u81ea\u5df1\u7684\u6807\u7684\u3002\u8dd1\u4e4b\u524d\u5148\u88c5\u4f9d\u8d56\uff0c\u4e00\u884c pip install akshare pandas numpy\u3002\u6570\u636e\u8d70\u65b0\u6d6a\u8d22\u7ecf\u7684\u514d\u8d39\u63a5\u53e3\uff0c\u4e0d\u7528\u6ce8\u518c\uff0c\u4e0d\u7528 token\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0a\u662f\u7ed3\u8bba\u548c\u7528\u6cd5\uff0c\u5f80\u4e0b\u662f\u53ef\u4ee5\u76f4\u63a5\u6284\u7684\u5b8c\u6574\u4ee3\u7801<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2464 \u5b8c\u6574\u811a\u672c\uff08\u53ef\u6574\u4f53\u590d\u5236\u8fd0\u884c\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -*- coding: utf-8 -*-\n\"\"\"\n\u6050\u614c\u6309\u94ae\u7b56\u7565\u5b9e\u6d4b\uff08\u6700\u5c0f\u53ef\u8dd1\u7248\uff09\n\u89c4\u5219\uff1aDeMarker(5) &lt; 10 \u6536\u76d8\u51b3\u7b56\u8fdb\u573a\uff0c\u6536\u76d8\u91cd\u65b0\u7ad9\u4e0a\u524d\u4e00\u65e5\u9ad8\u70b9\u540e\u6b21\u65e5\u5f00\u76d8\u79bb\u573a\n\u53e3\u5f84\uff1a\u51b3\u7b56\u5728\u6536\u76d8\u3001\u6210\u4ea4\u5728\u4e0b\u4e00\u6839\u5f00\u76d8\uff0c\u53cc\u8fb9\u8d39\u7528 0.01% + \u6ed1\u70b9 0.02%\uff0c\u5168\u7a0b\u672a\u590d\u6743\n\u6807\u7684\uff1aSPY\uff082001 \u8d77\uff09\u3001\u4e0a\u8bc1\u6307\u6570\uff081993 \u8d77\uff09\u3001\u6caa\u6df1300ETF 510300\uff082012 \u8d77\uff09\n\u4f9d\u8d56\uff1apip install akshare pandas numpy\n\"\"\"\nimport warnings\n\nimport akshare as ak\nimport numpy as np\nimport pandas as pd\n\nwarnings.filterwarnings(\"ignore\")\n\nDEMARKER_WINDOW = 5\nDEMARKER_ENTRY_MAX = 10\nINIT_CASH = 100_000.0\nFEES = 0.0001\nSLIPPAGE = 0.0002\nN_BOOTSTRAP = 5_000\nN_SIMS = 200\nSEED = 42\n\nMARKETS = {\n    \"SPY\": (\"us\", \"2001-01-01\", \"2026-09-18\"),\n    \"\u4e0a\u8bc1\u6307\u6570\": (\"index\", \"1993-01-01\", \"2026-09-18\"),\n    \"\u6caa\u6df1300ETF\": (\"etf\", \"2012-05-28\", \"2026-09-18\"),\n}\n\n\ndef fetch(kind):\n    if kind == \"us\":\n        df = ak.stock_us_daily(symbol=\"SPY\", adjust=\"\")\n    elif kind == \"index\":\n        df = ak.stock_zh_index_daily(symbol=\"sh000001\")\n    else:\n        df = ak.fund_etf_hist_sina(symbol=\"sh510300\")\n    df&#91;\"date\"] = pd.to_datetime(df&#91;\"date\"])\n    df = df.sort_values(\"date\").drop_duplicates(\"date\").set_index(\"date\")\n    return df&#91;&#91;\"open\", \"high\", \"low\", \"close\"]].dropna()\n\n\ndef demarker(high, low, window=DEMARKER_WINDOW):\n    demax = (high - high.shift(1)).clip(lower=0)\n    demin = (low.shift(1) - low).clip(lower=0)\n    demax_sma = demax.rolling(window).mean()\n    demin_sma = demin.rolling(window).mean()\n    return 100 * demax_sma \/ (demax_sma + demin_sma).replace(0, np.nan)\n\n\ndef build_signals(df):\n    n = len(df)\n    close = df&#91;\"close\"].to_numpy()\n    dm = demarker(df&#91;\"high\"], df&#91;\"low\"]).to_numpy()\n    signal = dm &lt; DEMARKER_ENTRY_MAX\n    decision_entries = np.zeros(n, dtype=bool)\n    decision_exits = np.zeros(n, dtype=bool)\n    in_position = False\n    for i in range(n):\n        if not in_position:\n            if signal&#91;i]:\n                decision_entries&#91;i] = True\n                in_position = True\n        elif i &gt; 0 and close&#91;i] &gt; df&#91;\"high\"].iloc&#91;i - 1]:\n            decision_exits&#91;i] = True\n            in_position = False\n    entries = np.zeros(n, dtype=bool)\n    exits = np.zeros(n, dtype=bool)\n    entries&#91;1:] = decision_entries&#91;:-1]\n    exits&#91;1:] = decision_exits&#91;:-1]\n    return entries, exits\n\n\ndef run_backtest(df, n_boot=N_BOOTSTRAP):\n    entries, exits = build_signals(df)\n    n = len(df)\n    open_ = df&#91;\"open\"].to_numpy()\n    trades = &#91;]\n    i = 1\n    while i &lt; n:\n        if entries&#91;i]:\n            j = next((k for k in range(i + 1, n) if exits&#91;k]), None)\n            if j is None:\n                break\n            entry_eff = open_&#91;i] * (1 + SLIPPAGE + FEES)\n            exit_eff = open_&#91;j] * (1 - SLIPPAGE - FEES)\n            trades.append(dict(entry=df.index&#91;i], exit=df.index&#91;j],\n                               ret=exit_eff \/ entry_eff - 1))\n            i = j\n        i += 1\n    tr = np.array(&#91;t&#91;\"ret\"] for t in trades])\n\n    eq = INIT_CASH\n    for r in tr:\n        eq *= 1 + r\n    n_years = (df.index&#91;-1] - df.index&#91;0]).days \/ 365.25\n    total = eq \/ INIT_CASH - 1\n    bh = INIT_CASH * df&#91;\"close\"] \/ df&#91;\"close\"].iloc&#91;0]\n    bh_total = bh.iloc&#91;-1] \/ INIT_CASH - 1\n\n    rng = np.random.default_rng(SEED)\n    boot = rng.choice(tr, size=(n_boot, len(tr)), replace=True).mean(axis=1)\n    lo_ci, hi_ci = np.percentile(boot, &#91;2.5, 97.5])\n    return dict(trades=len(tr),\n                win_rate=(tr &gt; 0).mean() * 100,\n                profit_factor=tr&#91;tr &gt; 0].sum() \/ abs(tr&#91;tr &lt; 0].sum()),\n                avg_trade=tr.mean() * 100,\n                cagr=((1 + total) ** (1 \/ n_years) - 1) * 100,\n                total=total * 100,\n                bh_cagr=((1 + bh_total) ** (1 \/ n_years) - 1) * 100,\n                boot_mean=tr.mean() * 100,\n                boot_lo=lo_ci * 100, boot_hi=hi_ci * 100,\n                boot_p_le0=(boot &lt;= 0).mean())\n\n\ndef random_baseline(df, n_entries, n_sims=N_SIMS):\n    n = len(df)\n    open_ = df&#91;\"open\"].to_numpy()\n    close = df&#91;\"close\"].to_numpy()\n    high_prev = df&#91;\"high\"].shift(1).to_numpy()\n    rng = np.random.default_rng(SEED)\n    totals = &#91;]\n    for _ in range(n_sims):\n        mask = np.zeros(n, dtype=bool)\n        mask&#91;rng.choice(np.arange(1, n - 1), size=n_entries, replace=False)] = True\n        eq, shares, in_pos = INIT_CASH, 0.0, False\n        i = 1\n        while i &lt; n:\n            if not in_pos and mask&#91;i - 1]:\n                in_pos = True\n                shares = eq \/ (open_&#91;i] * (1 + SLIPPAGE + FEES))\n                eq = shares * close&#91;i]\n            elif in_pos:\n                eq = shares * close&#91;i]\n                if close&#91;i] &gt; high_prev&#91;i]:\n                    eq = shares * open_&#91;i] * (1 - SLIPPAGE - FEES)\n                    in_pos = False\n            i += 1\n        totals.append(eq \/ INIT_CASH - 1)\n    return np.array(totals)\n\n\ndef main():\n    for name, (kind, start, end) in MARKETS.items():\n        df = fetch(kind).loc&#91;start:end]\n        m = run_backtest(df)\n        rand = random_baseline(df, m&#91;\"trades\"])\n        print(f\"===== {name}  {df.index&#91;0].date()} ~ {df.index&#91;-1].date()} =====\")\n        print(f\"  \u4ea4\u6613\u7b14\u6570 {m&#91;'trades']}   \u80dc\u7387 {m&#91;'win_rate']:.1f}%   \u76c8\u4e8f\u6bd4 {m&#91;'profit_factor']:.2f}\")\n        print(f\"  \u5355\u7b14\u5747\u503c {m&#91;'avg_trade']:.3f}%   \u5e74\u5316 {m&#91;'cagr']:.2f}%   \u533a\u95f4\u603b\u6536\u76ca {m&#91;'total']:.1f}%\")\n        print(f\"  \u4e00\u76f4\u6301\u6709\uff0c\u5e74\u5316 {m&#91;'bh_cagr']:.2f}%\")\n        print(f\"  Bootstrap 95% \u533a\u95f4 &#91;{m&#91;'boot_lo']:.3f}%, {m&#91;'boot_hi']:.3f}%]\uff0cP(\u5747\u503c&lt;=0)={m&#91;'boot_p_le0']:.3f}\")\n        print(f\"  \u968f\u673a\u57fa\u7ebf\u4e2d\u4f4d {np.median(rand) * 100:.1f}%\uff0c\u7b56\u7565\u8dd1\u8d62 {(rand &lt; m&#91;'total'] \/ 100).mean() * 100:.0f}% \u7684\u968f\u673a\u7ec4\u5408\")\n\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u540e\u7559\u4e2a\u95ee\u9898\u3002\u4f60\u76ef\u7740\u7684\u5e02\u573a\uff0c\u6050\u614c\u662f\u5c16\u5e95\u8fd8\u662f\u78e8\u5e95\uff1f\u4e00\u53e5\u8bdd\u8bf4\u8bf4\uff0c\u6211\u6311\u51e0\u4e2a\u6807\u7684\u628a\u540c\u6837\u7684\u5bf9\u7167\u8dd1\u7ed9\u4f60\u4eec\u770b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u89c9\u5f97\u6709\u7528\u7684\u8bdd\uff0c\u628a\u8fd9\u7bc7\u8f6c\u7ed9\u540c\u6837\u5728\u641e\u56de\u6d4b\u7684\u670b\u53cb\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u91cf\u5316\u56de\u6d4b #DeMarker #\u8d85\u5356\u53cd\u5f39 #\u7b56\u7565\u5bf9\u7167 #\u4e0a\u8bc1\u6307\u6570 #\u6caa\u6df1300ETF #SPY #\u4ea4\u6613\u7cfb\u7edf #\u968f\u673a\u57fa\u7ebf #\u56de\u64a4\u63a7\u5236<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6587\u5168\u90e8\u6570\u636e\u4e3a\u4f5c\u8005\u81ea\u884c\u5b9e\u6d4b\uff0c\u6570\u636e\u6e90\u4e3a\u65b0\u6d6a\u8d22\u7ecf\u516c\u5f00\u63a5\u53e3\uff08akshare\uff09\uff0c\u533a\u95f4\u622a\u81f3 2026-09-18\uff0c\u53e3\u5f84\u4e0e\u6210\u672c\u8bbe\u5b9a\u89c1\u6587\u5185\u8bf4\u660e\u3002\u6307\u6570\u4e0e ETF \u672a\u542b\u5206\u7ea2\uff0cSPY \u672a\u542b\u80a1\u606f\u3002\u672c\u6587\u4e0d\u6784\u6210\u4efb\u4f55\u6295\u8d44\u5efa\u8bae\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f5c \u8005\uff1a\u8001\u4f59\u635e\u9c7c \u539f\u521b\u4e0d\u6613\uff0c\u8f6c\u8f7d\u8bf7\u6807\u660e\u51fa\u5904\u53ca\u539f\u4f5c\u8005&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/laoyulaoyu.com\/index.php\/2026\/10\/08\/%e8%b6%85%e5%8d%96%e6%8c%89%e9%92%ae%e7%be%8e%e8%82%a125%e5%b9%b4%e6%9c%89%e6%95%88%ef%bc%8ca%e8%82%a133%e5%b9%b4%e5%8f%aa%e5%89%a9%e5%b9%b4%e5%8c%961-3\/\">Continue reading<span class=\"screen-reader-text\">\u8d85\u5356\u6309\u94ae\u7f8e\u80a125\u5e74\u6709\u6548\uff0cA\u80a133\u5e74\u53ea\u5269\u5e74\u53161.3%<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[17,4,5,6],"class_list":["post-4994","post","type-post","status-publish","format-standard","hentry","category-aiinvest","tag-ai","tag-6","entry"],"_links":{"self":[{"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/posts\/4994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/comments?post=4994"}],"version-history":[{"count":2,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/posts\/4994\/revisions"}],"predecessor-version":[{"id":5000,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/posts\/4994\/revisions\/5000"}],"wp:attachment":[{"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/media?parent=4994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/categories?post=4994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/laoyulaoyu.com\/index.php\/wp-json\/wp\/v2\/tags?post=4994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}