{"id":6128,"date":"2026-04-13T14:02:04","date_gmt":"2026-04-13T06:02:04","guid":{"rendered":"https:\/\/fangyuanfh.site\/?page_id=6128"},"modified":"2026-04-13T14:16:00","modified_gmt":"2026-04-13T06:16:00","slug":"%e6%96%b9%e5%9c%93%e5%a4%9a%e7%ad%96%e7%95%a5%e5%82%b5%e5%88%b8%e5%9f%ba%e9%87%91","status":"publish","type":"page","link":"https:\/\/fangyuanfh.site\/zh\/%e6%96%b9%e5%9c%93%e5%a4%9a%e7%ad%96%e7%95%a5%e5%82%b5%e5%88%b8%e5%9f%ba%e9%87%91\/","title":{"rendered":"\u65b9\u5706\u591a\u7b56\u7565\u503a\u5238\u57fa\u91d1"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"6128\" class=\"elementor elementor-6128\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-583c14f5 elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"583c14f5\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-75d4ae7b\" data-id=\"75d4ae7b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-70c2d3c1 elementor-widget elementor-widget-spacer\" data-id=\"70c2d3c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-94d6b53 elementor-widget elementor-widget-heading\" data-id=\"94d6b53\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-xxl\"><b>\u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1<\/b><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-2bf0ee14 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2bf0ee14\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-d5b8169\" data-id=\"d5b8169\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f0e30db elementor-widget elementor-widget-spacer\" data-id=\"f0e30db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-89cc530 elementor-widget elementor-widget-shortcode\" data-id=\"89cc530\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><style>\n    .fund-chart-container {\n        background: white;\n        padding: 20px;\n        border-radius: 8px;\n        box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n        margin: 20px 0;\n    }\n\n    .chart-header {\n        text-align: center;\n        margin-bottom: 20px;\n    }\n\n    .chart-header h2 {\n        margin: 0 0 15px 0;\n        font-size: 20px;\n        color: #333;\n    }\n\n    .time-period-buttons {\n        display: flex;\n        justify-content: center;\n        gap: 10px;\n        margin: 15px 0;\n        flex-wrap: wrap;\n    }\n\n    .period-btn {\n        padding: 8px 16px;\n        border: 1px solid #ddd;\n        background: white;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 14px;\n        transition: all 0.3s ease;\n        min-width: 60px;\n    }\n\n    .period-btn:hover {\n        background: #f0f0f0;\n        border-color: #1890ff;\n    }\n\n    .period-btn.active {\n        background: #1890ff;\n        color: white;\n        border-color: #1890ff;\n    }\n\n    .chart-content {\n        display: flex;\n        align-items: flex-start;\n        gap: 20px;\n    }\n\n    .chart-sidebar {\n        width: 25%;\n        background: #f8f9fa;\n        padding: 20px;\n        border-radius: 8px;\n        border: 1px solid #e9ecef;\n        min-height: 200px;\n    }\n\n    .chart-main {\n        width: 70%;\n        position: relative;\n    }\n\n    #navChart {\n        width: 100%;\n        height: 500px;\n    }\n\n    .datazoom-instruction {\n        margin-top: 2px;\n        margin-bottom: 15px;\n        font-size: 12px;\n        color: #666;\n        text-align: center;\n    }\n\n    .yield-display {\n        margin-bottom: 25px;\n    }\n\n    .yield-display:last-child {\n        margin-bottom: 0;\n    }\n\n    .yield-display h3 {\n        margin: 0 0 15px 0;\n        color: #333;\n        font-size: 16px;\n        font-weight: 600;\n    }\n\n    .yield-value {\n        font-size: 24px;\n        font-weight: bold;\n        color: #1890ff;\n        text-align: center;\n        padding: 10px;\n        background: white;\n        border-radius: 4px;\n        border: 1px solid #e9ecef;\n    }\n\n    .yield-value.positive {\n        color: #52c41a;\n    }\n\n    .yield-value.negative {\n        color: #ff4d4f;\n    }\n\n    \/* \u54cd\u5e94\u5f0f\u8bbe\u8ba1 *\/\n    @media (max-width: 768px) {\n        .chart-content {\n            flex-direction: column;\n        }\n\n        .chart-sidebar {\n            width: 100%;\n            order: 2;\n        }\n\n        .chart-main {\n            width: 100%;\n        }\n\n        #navChart {\n            width: 100% !important;\n            height: 400px !important;\n        }\n\n        .datazoom-instruction {\n            margin-bottom: 15px;\n        }\n\n        .time-period-buttons {\n            gap: 5px;\n        }\n\n        .period-btn {\n            padding: 6px 12px;\n            font-size: 12px;\n            min-width: 50px;\n        }\n    }\n\n    @media (max-width: 480px) {\n        .fund-chart-container {\n            padding: 15px;\n        }\n\n        .time-period-buttons {\n            gap: 3px;\n        }\n\n        .period-btn {\n            padding: 5px 8px;\n            font-size: 11px;\n            min-width: 40px;\n        }\n    }\n\n    @media (prefers-color-scheme: dark) {\n        .datazoom-instruction {\n            color: #ccc;\n        }\n    }\n<\/style>\n\n<section style=\"padding-top: 120px;\">\n    <!-- <h1 style=\"text-align: center;\"><\/h1> -->\n    <div class=\"container\">\n        <!-- \u57fa\u91d1\u51c0\u503c\u8d70\u52bf\u56fe -->\n        <div class=\"fund-chart-container\">\n            <div class=\"chart-header\">\n                <!-- <h2 id=\"chartTitle\">\u65b9\u5706\u591a\u7b56\u7565\u503a\u5238\u57fa\u91d1\u5e73\u5c42\u7ea7\u51c0\u503c\u8d70\u52bf\u56fe<\/h2> -->\n                <div class=\"time-period-buttons\">\n                    <button class=\"period-btn active\" data-period=\"all\">\u5168\u90e8<\/button>\n                    <button class=\"period-btn\" data-period=\"1m\">1\u6708<\/button>\n                    <button class=\"period-btn\" data-period=\"3m\">3\u6708<\/button>\n                    <button class=\"period-btn\" data-period=\"6m\">6\u6708<\/button>\n                    <button class=\"period-btn\" data-period=\"1y\">1\u5e74<\/button>\n                    <button class=\"period-btn\" data-period=\"3y\">3\u5e74<\/button>\n                    <button class=\"period-btn\" data-period=\"5y\">5\u5e74<\/button>\n                    <button class=\"period-btn\" data-period=\"ytd\">\u4eca\u5e74<\/button>\n                <\/div>\n            <\/div>\n            <div class=\"chart-content\">\n                <div class=\"chart-main\">\n                    <div id=\"navChart\"><\/div>\n                    <div class=\"datazoom-instruction\">*\u8bf7\u62d6\u52a8\u5e76\u9009\u62e9\u60a8\u8981\u67e5\u770b\u7684\u6536\u76ca\u7387\u533a\u95f4\u3002<\/div>\n                <\/div>\n                <div class=\"chart-sidebar\">\n                    <div class=\"yield-display\">\n                        <h3>\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387<\/h3>\n                        <div id=\"inceptionYield\" class=\"yield-value\">--<\/div>\n                    <\/div>\n                    <div class=\"yield-display\">\n                        <h3>\u533a\u95f4\u6536\u76ca\u7387<\/h3>\n                        <div id=\"periodYield\" class=\"yield-value\">--<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div id=\"noDataMessage\" class=\"no-data\" style=\"display: none; text-align: center; padding: 60px 0; color: #999; font-size: 18px;\">\n            \u6682\u65e0\u51c0\u503c\u6570\u636e\n        <\/div>\n    <\/div>\n<\/section>\n\n<!-- ECharts CDN -->\n<script type=\"text\/javascript\" src=\"https:\/\/cdn.jsdelivr.net\/npm\/echarts@5.4.3\/dist\/echarts.min.js\"><\/script>\n\n<script type=\"text\/javascript\">\n    \/\/ \u5c06 shortcode \u4e0a\u4e0b\u6587\u6570\u636e\u6ce8\u5165\u5230\u539f\u59cb\u8be6\u60c5\u9875\u9762\u811a\u672c\n    var fund_values = [{\"date\":\"2021-01-31\",\"display_date\":\"202101\",\"value\":1000},{\"date\":\"2021-02-28\",\"display_date\":\"202102\",\"value\":1065.73},{\"date\":\"2021-03-31\",\"display_date\":\"202103\",\"value\":1070.16},{\"date\":\"2021-04-30\",\"display_date\":\"202104\",\"value\":1134.31},{\"date\":\"2021-05-31\",\"display_date\":\"202105\",\"value\":1229.35},{\"date\":\"2021-06-30\",\"display_date\":\"202106\",\"value\":1272.3},{\"date\":\"2021-07-31\",\"display_date\":\"202107\",\"value\":1302.21},{\"date\":\"2021-08-31\",\"display_date\":\"202108\",\"value\":1317.63},{\"date\":\"2021-09-30\",\"display_date\":\"202109\",\"value\":1325.01},{\"date\":\"2021-10-31\",\"display_date\":\"202110\",\"value\":1349.55},{\"date\":\"2021-11-30\",\"display_date\":\"202111\",\"value\":1324.39},{\"date\":\"2021-12-31\",\"display_date\":\"202112\",\"value\":1304.5},{\"date\":\"2022-01-31\",\"display_date\":\"202201\",\"value\":1313.29},{\"date\":\"2022-02-28\",\"display_date\":\"202202\",\"value\":1333.64},{\"date\":\"2022-03-31\",\"display_date\":\"202203\",\"value\":1337.21},{\"date\":\"2022-04-30\",\"display_date\":\"202204\",\"value\":1324.4},{\"date\":\"2022-05-31\",\"display_date\":\"202205\",\"value\":1325.24},{\"date\":\"2022-06-30\",\"display_date\":\"202206\",\"value\":1321.28},{\"date\":\"2022-07-30\",\"display_date\":\"202207\",\"value\":1312.45},{\"date\":\"2022-08-31\",\"display_date\":\"202208\",\"value\":1330.44},{\"date\":\"2022-09-30\",\"display_date\":\"202209\",\"value\":1331.89},{\"date\":\"2022-10-31\",\"display_date\":\"202210\",\"value\":1313.81},{\"date\":\"2022-11-30\",\"display_date\":\"202211\",\"value\":1350.6},{\"date\":\"2022-12-30\",\"display_date\":\"202212\",\"value\":1395.52},{\"date\":\"2023-01-30\",\"display_date\":\"202301\",\"value\":1426.36},{\"date\":\"2023-02-28\",\"display_date\":\"202302\",\"value\":1443.66},{\"date\":\"2023-03-31\",\"display_date\":\"202303\",\"value\":1440.08},{\"date\":\"2023-04-30\",\"display_date\":\"202304\",\"value\":1454.66},{\"date\":\"2023-05-31\",\"display_date\":\"202305\",\"value\":1444.48},{\"date\":\"2023-06-30\",\"display_date\":\"202306\",\"value\":1458.32},{\"date\":\"2023-07-31\",\"display_date\":\"202307\",\"value\":1468.18},{\"date\":\"2023-08-31\",\"display_date\":\"202308\",\"value\":1438.26},{\"date\":\"2023-09-29\",\"display_date\":\"202309\",\"value\":1444.25},{\"date\":\"2023-10-31\",\"display_date\":\"202310\",\"value\":1436.12},{\"date\":\"2023-11-30\",\"display_date\":\"202311\",\"value\":1484.47},{\"date\":\"2023-12-29\",\"display_date\":\"202312\",\"value\":1500.53},{\"date\":\"2024-01-31\",\"display_date\":\"202401\",\"value\":1529.57},{\"date\":\"2024-02-29\",\"display_date\":\"202402\",\"value\":1550.34},{\"date\":\"2024-03-28\",\"display_date\":\"202403\",\"value\":1558.85},{\"date\":\"2024-04-30\",\"display_date\":\"202404\",\"value\":1587.49},{\"date\":\"2024-05-31\",\"display_date\":\"202405\",\"value\":1604.66},{\"date\":\"2024-06-30\",\"display_date\":\"202406\",\"value\":1627.92},{\"date\":\"2024-07-31\",\"display_date\":\"202407\",\"value\":1638.73},{\"date\":\"2024-08-30\",\"display_date\":\"202408\",\"value\":1652.4},{\"date\":\"2024-09-30\",\"display_date\":\"202409\",\"value\":1662.94},{\"date\":\"2024-10-31\",\"display_date\":\"202410\",\"value\":1686.1},{\"date\":\"2024-11-30\",\"display_date\":\"202411\",\"value\":1685.25},{\"date\":\"2024-12-31\",\"display_date\":\"202412\",\"value\":1704.14},{\"date\":\"2025-01-31\",\"display_date\":\"202501\",\"value\":1719.21},{\"date\":\"2025-02-28\",\"display_date\":\"202502\",\"value\":1745.33},{\"date\":\"2025-03-31\",\"display_date\":\"202503\",\"value\":1768.05},{\"date\":\"2025-04-30\",\"display_date\":\"202504\",\"value\":1783.4},{\"date\":\"2025-05-31\",\"display_date\":\"202505\",\"value\":1803.67},{\"date\":\"2025-06-30\",\"display_date\":\"202506\",\"value\":1836.68},{\"date\":\"2025-07-31\",\"display_date\":\"202507\",\"value\":1880.82},{\"date\":\"2025-08-31\",\"display_date\":\"202508\",\"value\":1900.97},{\"date\":\"2025-09-30\",\"display_date\":\"202509\",\"value\":1910.24},{\"date\":\"2025-10-31\",\"display_date\":\"202510\",\"value\":1912.54},{\"date\":\"2025-11-30\",\"display_date\":\"202511\",\"value\":1920.05},{\"date\":\"2025-12-31\",\"display_date\":\"202512\",\"value\":1937.72},{\"date\":\"2026-01-31\",\"display_date\":\"202601\",\"value\":1967.24},{\"date\":\"2026-02-27\",\"display_date\":\"202602\",\"value\":1984.89}];\n    var fund_returns = [null,6.57,0.42,5.99,8.38,3.49,2.35,1.18,0.56,1.85,-1.86,-1.5,0.67,1.55,0.27,-0.96,0.06,-0.3,-0.67,1.37,0.11,-1.36,2.8,3.33,2.21,1.21,-0.25,1.01,-0.7,0.96,0.68,-2.04,0.42,-0.56,3.37,1.08,1.94,1.36,0.55,1.84,1.08,1.45,0.66,0.83,0.64,1.39,-0.05,1.12,0.88,1.52,1.3,0.87,1.14,1.83,2.4,1.07,0.49,0.12,0.39,0.92,1.52,0.9];\n    var fund_name = \"\\u65B9\\u5706\\u591A\\u7B56\\u7565\\u503A\\u5238\\u57FA\\u91D1\\u5E73\\u5C42\\u7EA7\";\n\n    \/\/ Y\u8f74\u52a8\u6001\u8ba1\u7b97\u51fd\u6570 - \u786e\u4fdd\u59cb\u7ec8\u53ea\u663e\u793a6\u6761\u523b\u5ea6\u7ebf\n    function calculateYAxisRange(data) {\n        if (!data || data.length === 0) {\n            return { min: 1.0, max: 2.0, interval: 0.2 };\n        }\n        \n        \/\/ \u627e\u5230\u6570\u636e\u7684\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\n        const validData = data.filter(val => val !== null && val !== undefined && !isNaN(val));\n        if (validData.length === 0) {\n            return { min: 1.0, max: 2.0, interval: 0.2 };\n        }\n        \n        const dataMin = Math.min(...validData);\n        const dataMax = Math.max(...validData);\n        \n        \/\/ \u5904\u7406\u5355\u6570\u636e\u70b9\u60c5\u51b5\n        if (validData.length === 1) {\n            \/\/ \u5bf9\u4e8e\u5355\u4e2a\u6570\u636e\u70b9\uff0c\u8bbe\u7f6e\u4e00\u4e2a\u5408\u7406\u7684\u8303\u56f4\n            let min = dataMin - 0.5;\n            let max = dataMax + 0.5;\n            \n            \/\/ \u786e\u4fdd\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\u4e0d\u76f8\u7b49\n            if (min === max) {\n                min -= 0.1;\n                max += 0.1;\n            }\n            \n            min = parseFloat(min.toFixed(1));\n            max = parseFloat(max.toFixed(1));\n            \n            const range = max - min;\n            const interval = range \/ 5;\n            \n            return {\n                min,\n                max,\n                interval: parseFloat(interval.toFixed(6))\n            };\n        }\n        \n        \/\/ \u7eb5\u5750\u6807\u6700\u5c0f\u503c\u53d6\u5c0f\u4e8e\u6570\u636e\u6700\u5c0f\u503c\u7684\u4fdd\u7559\u4e00\u4f4d\u5c0f\u6570\uff08\u4fdd\u8bc1\u4e25\u683c\u66f4\u5c0f\uff09\n        let min = Math.floor(dataMin * 10) \/ 10;\n        if (min >= dataMin) {\n            min -= 0.1;\n        }\n        \/\/ \u7eb5\u5750\u6807\u6700\u5927\u503c\u53d6\u5927\u4e8e\u6570\u636e\u6700\u5927\u503c\u7684\u4fdd\u7559\u4e00\u4f4d\u5c0f\u6570\uff08\u4fdd\u8bc1\u4e25\u683c\u66f4\u5927\uff09\n        let max = Math.ceil(dataMax * 10) \/ 10;\n        if (max <= dataMax) {\n            max += 0.1;\n        }\n        \n        min = parseFloat(min.toFixed(1));\n        max = parseFloat(max.toFixed(1));\n        \n        \/\/ \u5f53\u533a\u95f4\u8fc7\u5c0f\u65f6\uff0c\u5411\u4e24\u4fa7\u6269\u5c55\uff0c\u907f\u514d\u4e0a\u4e0b\u9650\u4e00\u81f4\n        if (min === max) {\n            min = parseFloat((min - 0.1).toFixed(1));\n            max = parseFloat((max + 0.1).toFixed(1));\n        }\n        \n        const range = max - min;\n        const interval = range \/ 5;\n        \n        return {\n            min,\n            max,\n            interval: parseFloat(interval.toFixed(6))\n        };\n    }\n\n    \/\/ \u6838\u5fc3\u8ba1\u7b97\u51fd\u6570\n    function calculateMonthlyReturns(navValues) {\n        if (!navValues || navValues.length === 0) return [];\n\n        var returns = [];\n        for (var i = 0; i < navValues.length; i++) {\n            if (i === 0) {\n                returns.push(null); \/\/ \u7b2c\u4e00\u4e2a\u6708\u65e0\u6536\u76ca\u7387\n            } else {\n                var currentNav = navValues[i];\n                var previousNav = navValues[i - 1];\n\n                \/\/ \u907f\u514d\u9664\u96f6\u9519\u8bef\n                if (previousNav === 0 || isNaN(previousNav) || isNaN(currentNav)) {\n                    returns.push(null);\n                } else {\n                    var monthlyReturn = ((currentNav - previousNav) \/ previousNav) * 100;\n                    returns.push(parseFloat(monthlyReturn.toFixed(2)));\n                }\n            }\n        }\n        return returns;\n    }\n\n    \/\/ \u65b0\u589e\u51fd\u6570\uff1a\u8ba1\u7b97\u7d2f\u8ba1\u51c0\u503c\n    function calculateCumulativeNavValues(returns) {\n        if (!returns || returns.length === 0) return [];\n\n        var cumulativeValues = [];\n        cumulativeValues[0] = 1.00; \/\/ \u7b2c\u4e00\u4e2a\u6708\u8bbe\u4e3a1.00\n\n        for (var i = 1; i < returns.length; i++) {\n            if (returns[i] === null || isNaN(returns[i])) {\n                cumulativeValues[i] = cumulativeValues[i - 1]; \/\/ \u4fdd\u7559\u4e0a\u6708\u503c\n            } else {\n                cumulativeValues[i] = cumulativeValues[i - 1] * (1 + returns[i] \/ 100);\n            }\n        }\n        return cumulativeValues;\n    }\n\n    \/\/ \u6708\u4efd\u683c\u5f0f\u7edf\u4e00\u5de5\u5177\u51fd\u6570\n    function normalizeMonthStr(monthStr) {\n        if (!monthStr) return null;\n        \/\/ \u7edf\u4e00 \"YYYY.MM\" \u6216 \"YYYY-MM\" \u683c\u5f0f\u4e3a \"YYYY-MM\"\n        return monthStr.toString().replace(\/\\.\/g, '-');\n    }\n\n    function parseMonth(monthStr) {\n        if (!monthStr) return null;\n        var normalized = normalizeMonthStr(monthStr);\n        if (normalized.length === 6) {\n            \/\/ YYYYMM \u683c\u5f0f\n            var year = parseInt(normalized.substring(0, 4));\n            var month = parseInt(normalized.substring(4, 6)) - 1; \/\/ Date\u6708\u4efd\u4ece0\u5f00\u59cb\n            return new Date(year, month, 1);\n        } else if (normalized.indexOf('-') !== -1) {\n            \/\/ YYYY-MM \u683c\u5f0f\n            var parts = normalized.split('-');\n            var year = parseInt(parts[0]);\n            var month = parseInt(parts[1]) - 1; \/\/ Date\u6708\u4efd\u4ece0\u5f00\u59cb\n            return new Date(year, month, 1);\n        }\n        return null;\n    }\n\n    function formatMonth(date, separator) {\n        if (!date) return null;\n        separator = separator || '.';\n        var year = date.getFullYear();\n        var month = (date.getMonth() + 1).toString().padStart(2, '0');\n        return year + separator + month;\n    }\n\n    function addMonths(date, months) {\n        if (!date) return null;\n        var result = new Date(date.getFullYear(), date.getMonth() + months, 1);\n        return result;\n    }\n\n    function compareMonth(date1, date2) {\n        if (!date1 || !date2) return 0;\n        var year1 = date1.getFullYear();\n        var month1 = date1.getMonth();\n        var year2 = date2.getFullYear();\n        var month2 = date2.getMonth();\n\n        if (year1 !== year2) {\n            return year1 - year2;\n        }\n        return month1 - month2;\n    }\n\n    function clampToAxis(startMonth, endMonth, axisLabels) {\n        if (!axisLabels || axisLabels.length === 0) {\n            return { startIndex: 0, endIndex: 0 };\n        }\n\n        var startIndex = 0;\n        var endIndex = axisLabels.length - 1;\n\n        \/\/ \u627e\u5230\u7b2c\u4e00\u4e2a >= startMonth \u7684\u7d22\u5f15\n        for (var i = 0; i < axisLabels.length; i++) {\n            var axisMonth = parseMonth(axisLabels[i]);\n            if (axisMonth && compareMonth(axisMonth, startMonth) >= 0) {\n                startIndex = i;\n                break;\n            }\n        }\n\n        \/\/ \u627e\u5230\u6700\u540e\u4e00\u4e2a <= endMonth \u7684\u7d22\u5f15\n        for (var i = axisLabels.length - 1; i >= 0; i--) {\n            var axisMonth = parseMonth(axisLabels[i]);\n            if (axisMonth && compareMonth(axisMonth, endMonth) <= 0) {\n                endIndex = i;\n                break;\n            }\n        }\n\n        return { startIndex: startIndex, endIndex: endIndex };\n    }\n\n    function getDateRange(period, lastDataDateStr, xAxisLabels) {\n        \/\/ \u6708\u4efd\u6620\u5c04\u8868\n        var monthsMap = {\n            '1m': 1,\n            '3m': 3,\n            '6m': 6,\n            '1y': 12,\n            '3y': 36,\n            '5y': 60\n        };\n\n        if (period === 'all') {\n            if (xAxisLabels && xAxisLabels.length > 0) {\n                return {\n                    startIndex: 0,\n                    endIndex: xAxisLabels.length - 1,\n                    startLabel: formatMonth(parseMonth(xAxisLabels[0]), '.'),\n                    endLabel: formatMonth(parseMonth(xAxisLabels[xAxisLabels.length - 1]), '.')\n                };\n            }\n            return { startIndex: 0, endIndex: 0, startLabel: null, endLabel: null };\n        }\n\n        if (period === 'ytd') {\n            var now = new Date();\n            var currentYear = now.getFullYear();\n            \/\/ \u4eca\u5e74\u7684\u6536\u76ca\u533a\u95f4\u5e94\u4ece\u4e0a\u4e00\u5e74\u5e74\u672b\u5f00\u59cb\uff0c\u4ee5\u4fdd\u8bc1\u8ba1\u7b97\u57fa\u51c6\u5305\u542b\u5b8c\u6574\u6708\u4efd\n            var previousYearEnd = new Date(currentYear - 1, 11, 31);\n            var lastDataMonth = parseMonth(normalizeMonthStr(lastDataDateStr));\n            var endMonth = lastDataMonth || new Date(currentYear, now.getMonth(), 1);\n\n            if (xAxisLabels && xAxisLabels.length > 0) {\n                var range = clampToAxis(previousYearEnd, endMonth, xAxisLabels);\n                var startIndex = Math.max(0, Math.min(range.startIndex, xAxisLabels.length - 1));\n                var endIndex = Math.max(startIndex, Math.min(range.endIndex, xAxisLabels.length - 1));\n                var startAxisDate = parseMonth(xAxisLabels[startIndex]) || previousYearEnd;\n                var endAxisDate = parseMonth(xAxisLabels[endIndex]) || endMonth;\n\n                return {\n                    startIndex: startIndex,\n                    endIndex: endIndex,\n                    startLabel: formatMonth(startAxisDate, '.'),\n                    endLabel: formatMonth(endAxisDate, '.')\n                };\n            }\n\n            return {\n                startIndex: 0,\n                endIndex: 0,\n                startLabel: formatMonth(previousYearEnd, '.'),\n                endLabel: formatMonth(endMonth, '.')\n            };\n        }\n\n        var monthsCount = monthsMap[period] || 3;\n        var now = new Date();\n        var fallbackCurrentMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n        var lastDataMonth = parseMonth(normalizeMonthStr(lastDataDateStr));\n\n        \/\/ \u7ec8\u70b9\u6708\u4efd\u4f18\u5148\u4f7f\u7528\u6700\u65b0\u6570\u636e\u6708\u4efd\uff0c\u82e5\u4e0d\u5b58\u5728\u6216\u672a\u6765\u6708\u4efd\u5219\u56de\u9000\u5230\u5f53\u524d\u6708\u4efd\n        var endMonth = lastDataMonth;\n        if (!endMonth) {\n            endMonth = fallbackCurrentMonth;\n        } else if (compareMonth(lastDataMonth, fallbackCurrentMonth) > 0) {\n            endMonth = fallbackCurrentMonth;\n        }\n\n        \/\/ \u8d77\u70b9\u6708\u4efd\uff1a\u4ece\u7ec8\u70b9\u6708\u4efd\u5f80\u524d\u63a8\u7b97\u6307\u5b9a\u6708\u6570\uff08\u5305\u542b\u7ec8\u70b9\u5f53\u6708\uff0c\u56e0\u6b64\u51cf\u53bb monthsCount-1\uff09\n        \/\/ \u8fd9\u6837\u786e\u4fdd\u56fe\u8868\u663e\u793a\u6b63\u786e\u7684\u671f\u95f4\uff0c\u4f46\u6536\u76ca\u7387\u8ba1\u7b97\u65f6\u4f1a\u989d\u5916\u5305\u542b\u57fa\u51c6\u6708\u4efd\n        var startMonth = addMonths(endMonth, -(monthsCount - 1));\n\n        if (xAxisLabels && xAxisLabels.length > 0) {\n            var range = clampToAxis(startMonth, endMonth, xAxisLabels);\n            var startIndex = range.startIndex;\n            var endIndex = range.endIndex;\n\n            \/\/ \u4ec5\u5bf9\u591a\u4e2a\u6708\u4efd\u7684\u60c5\u51b5\u4e14\u4ec5\u5339\u914d\u5230\u5355\u4e2a\u6570\u636e\u70b9\u65f6\uff0c\u5411\u524d\u6269\u5c55\u4e00\u4e2a\u7d22\u5f15\u4ee5\u4fdd\u8bc1\u6536\u76ca\u7387\u57fa\u51c6\n            if (startIndex === endIndex && startIndex > 0 && monthsCount > 1) {\n                startIndex = startIndex - 1;\n            }\n           \n            \/\/ 1\u6708\u6309\u94ae\u7279\u6b8a\u5904\u7406\uff1a\u53ea\u663e\u793a\u6700\u65b0\u4e00\u4e2a\u6708\u7684\u6570\u636e\u70b9\uff0c\u4f46\u6536\u76ca\u7387\u8ba1\u7b97\u65f6\u4f7f\u7528\u524d\u4e00\u4e2a\u6708\u4f5c\u4e3a\u57fa\u51c6\n            \/\/ \u8fd9\u91cc\u4e0d\u4fee\u6539startIndex\uff0c\u786e\u4fdd\u53ea\u663e\u793a\u4e00\u4e2a\u6570\u636e\u70b9\n\n            startIndex = Math.max(0, Math.min(startIndex, xAxisLabels.length - 1));\n            endIndex = Math.max(startIndex, Math.min(endIndex, xAxisLabels.length - 1));\n\n            \/\/ \u8ba1\u7b97\u6536\u76ca\u7387\u65f6\u9700\u8981\u989d\u5916\u5305\u542b\u57fa\u51c6\u6708\u4efd\u7684\u7d22\u5f15\n            var calculationStartIndex = startIndex;\n            if (monthsCount > 0) {\n                calculationStartIndex = Math.max(0, startIndex - 1);\n            }\n\n            return {\n                startIndex: startIndex,\n                endIndex: endIndex,\n                calculationStartIndex: calculationStartIndex,\n                startLabel: formatMonth(parseMonth(xAxisLabels[startIndex]), '.'),\n                endLabel: formatMonth(parseMonth(xAxisLabels[endIndex]), '.')\n            };\n        }\n\n        return {\n            startIndex: 0,\n            endIndex: 0,\n            startLabel: formatMonth(startMonth, '.'),\n            endLabel: formatMonth(endMonth, '.')\n        };\n    }\n\n    function filterDataByPeriod(dates, navValues, period, lastDataDateStr, xAxisLabels) {\n        if (period === 'all' || !dates || dates.length === 0) {\n            return { dates: dates, navValues: navValues };\n        }\n\n        \/\/ \u4f7f\u7528\u65b0\u7684 getDateRange \u51fd\u6570\u83b7\u53d6\u7d22\u5f15\u8303\u56f4\n        var dateRange = getDateRange(period, lastDataDateStr, xAxisLabels || dates);\n        if (dateRange.startIndex === undefined || dateRange.endIndex === undefined) {\n            return { dates: dates, navValues: navValues };\n        }\n\n        \/\/ \u6839\u636e\u7d22\u5f15\u8303\u56f4\u8fc7\u6ee4\u6570\u636e\n        var filteredDates = dates.slice(dateRange.startIndex, dateRange.endIndex + 1);\n        var filteredNavValues = navValues.slice(dateRange.startIndex, dateRange.endIndex + 1);\n\n        return {\n            dates: filteredDates,\n            navValues: filteredNavValues,\n            startIndex: dateRange.startIndex,\n            endIndex: dateRange.endIndex\n        };\n    }\n\n    \/\/ \u8ba1\u7b97\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\uff08\u6574\u6570\u767e\u5206\u6bd4\uff09\n    function calculateInceptionReturn(originalNavValues) {\n        if (!originalNavValues || originalNavValues.length < 2) {\n            return null;\n        }\n\n        var firstValue = originalNavValues[0]; \/\/ \u6700\u65e9\u6708\u4efd\u51c0\u503c\n        var lastValue = originalNavValues[originalNavValues.length - 1]; \/\/ \u6700\u65b0\u6708\u4efd\u51c0\u503c\n\n        if (firstValue === 0 || firstValue === null || firstValue === undefined || isNaN(firstValue) ||\n            lastValue === null || lastValue === undefined || isNaN(lastValue)) {\n            return null;\n        }\n\n        var inceptionReturn = ((lastValue - firstValue) \/ firstValue) * 100;\n        if (console && console.log) {\n            console.log('\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\u8ba1\u7b97\u7ed3\u679c:', inceptionReturn);\n        }\n        return Math.round(inceptionReturn); \/\/ \u4fdd\u7559\u6574\u6570\n    }\n\n    \/\/ \u65b0\u589e\u51fd\u6570\uff1a\u57fa\u4e8e\u7d2f\u8ba1\u51c0\u503c\u8ba1\u7b97\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\n    function calculateInceptionReturnFromCumulative(cumulativeValues) {\n        \/\/ \u4f7f\u7528\u539f\u59cb\u51c0\u503c\u6570\u636e\u8ba1\u7b97\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\n        if (!chartDataContext.originalNavValues || chartDataContext.originalNavValues.length < 2) {\n            return null;\n        }\n        \n        var firstValue = chartDataContext.originalNavValues[0]; \/\/ \u6700\u65e9\u6708\u4efd\u51c0\u503c\n        var lastValue = chartDataContext.originalNavValues[chartDataContext.originalNavValues.length - 1]; \/\/ \u6700\u65b0\u6708\u4efd\u51c0\u503c\n        \n        if (firstValue === 0 || firstValue === null || firstValue === undefined || isNaN(firstValue) ||\n            lastValue === null || lastValue === undefined || isNaN(lastValue)) {\n            return null;\n        }\n        \n        \/\/ \u6536\u76ca\u7387=(\u6240\u9009\u65f6\u95f4\u671f\u672b\u51c0\u503c-\u6240\u9009\u533a\u95f4\u671f\u521d\u51c0\u503c\uff09\/\u6240\u9009\u533a\u95f4\u671f\u521d\u51c0\u503c\uff08\u767e\u5206\u6bd4\u4fdd\u7559\u4e24\u4f4d\u5c0f\u6570\uff09\n        var inceptionReturn = ((lastValue - firstValue) \/ firstValue) * 100;\n        return parseFloat(inceptionReturn.toFixed(2)); \/\/ \u4fdd\u7559\u4e24\u4f4d\u5c0f\u6570\n    }\n\n    \/\/ \u8ba1\u7b97\u533a\u95f4\u6536\u76ca\u7387\uff08\u4fdd\u7559\u4e24\u4f4d\u5c0f\u6570\uff09- \u57fa\u4e8e\u51c0\u503c\u6570\u636e\n    function calculatePeriodReturnNew(originalNavValues, startIndex, endIndex) {\n        if (!originalNavValues || startIndex === undefined || endIndex === undefined) {\n            return null;\n        }\n\n        \/\/ \u5982\u679c\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\uff0c\u8fd4\u56denull\n        if (startIndex < 0 || endIndex >= originalNavValues.length || startIndex > endIndex) {\n            return null;\n        }\n\n        \/\/ \u67e5\u627e\u6709\u6548\u7684\u8d77\u59cb\u503c\uff08\u8df3\u8fc7 null \u503c\uff09\n        var startValue = null;\n        var actualStartIndex = startIndex;\n        for (var i = startIndex; i <= endIndex; i++) {\n            if (originalNavValues[i] !== null && originalNavValues[i] !== undefined && !isNaN(originalNavValues[i])) {\n                startValue = originalNavValues[i];\n                actualStartIndex = i;\n                break;\n            }\n        }\n\n        \/\/ \u67e5\u627e\u6709\u6548\u7684\u7ec8\u6b62\u503c\uff08\u4ece\u540e\u5f80\u524d\u67e5\u627e\uff09\n        var endValue = null;\n        var actualEndIndex = endIndex;\n        for (var i = endIndex; i >= startIndex; i--) {\n            if (originalNavValues[i] !== null && originalNavValues[i] !== undefined && !isNaN(originalNavValues[i])) {\n                endValue = originalNavValues[i];\n                actualEndIndex = i;\n                break;\n            }\n        }\n\n        console.log('\u51c0\u503c\u6570\u636e:', {\n            startValue: startValue,\n            endValue: endValue,\n            startIndex: startIndex,\n            endIndex: endIndex\n        });\n\n        if (startValue === 0 || startValue === null || startValue === undefined || isNaN(startValue) ||\n            endValue === null || endValue === undefined || isNaN(endValue)) {\n            return null;\n        }\n\n        var periodReturn = ((endValue - startValue) \/ startValue) * 100;\n        return parseFloat(periodReturn.toFixed(2)); \/\/ \u4fdd\u7559\u4e24\u4f4d\u5c0f\u6570\n    }\n\n    \/\/ \u7edf\u4e00\u7684\u533a\u95f4\u6536\u76ca\u7387\u8ba1\u7b97\u51fd\u6570\n    function calculatePeriodReturnUnified(dataType, data, startIndex, endIndex, source = 'unknown') {\n        if (!data || startIndex === undefined || endIndex === undefined) {\n            return null;\n        }\n\n        \/\/ \u5982\u679c\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\uff0c\u8fd4\u56denull\n        if (startIndex < 0 || endIndex >= data.length || startIndex > endIndex) {\n            return null;\n        }\n\n        \/\/ \u5904\u7406\u5355\u6708\u60c5\u51b5\uff08startIndex === endIndex\uff09\n        if (startIndex === endIndex) {\n            if (dataType === 'nav') {\n                \/\/ \u5355\u6708\u6536\u76ca\u7387\u76f4\u63a5\u8fd4\u56de0\uff0c\u56e0\u4e3a\u65e0\u6cd5\u8ba1\u7b97\u76f8\u5bf9\u4e8e\u524d\u4e00\u4e2a\u6708\u7684\u6536\u76ca\n                return 0.00;\n            }\n        }\n\n        if (dataType === 'returns') {\n            \/\/ \u57fa\u4e8e\u6536\u76ca\u7387\u6570\u636e\u8ba1\u7b97\n            var validReturns = [];\n            for (var i = startIndex; i <= endIndex; i++) {\n                if (data[i] !== null && data[i] !== undefined && !isNaN(data[i])) {\n                    validReturns.push(data[i]);\n                }\n            }\n\n            if (validReturns.length === 0) {\n                return null;\n            }\n\n            \/\/ \u8ba1\u7b97\u5e73\u5747\u6536\u76ca\u7387\u4f5c\u4e3a\u533a\u95f4\u6536\u76ca\u7387\n            var sum = validReturns.reduce(function (a, b) { return a + b; }, 0);\n            var periodReturn = sum \/ validReturns.length;\n            console.log('\u6536\u76ca\u7387\u6570\u636e\u533a\u95f4\u8ba1\u7b97\u7ed3\u679c:', periodReturn);\n            return parseFloat(periodReturn.toFixed(2));\n        } else if (dataType === 'nav') {\n            \/\/ \u57fa\u4e8e\u51c0\u503c\u6570\u636e\u8ba1\u7b97\uff08\u539f\u59cb\u903b\u8f91\uff09\n            var startValue = null;\n            for (var i = startIndex; i <= endIndex; i++) {\n                if (data[i] !== null && data[i] !== undefined && !isNaN(data[i]) && data[i] !== 0) {\n                    startValue = data[i];\n                    break;\n                }\n            }\n\n            var endValue = null;\n            for (var i = endIndex; i >= startIndex; i--) {\n                if (data[i] !== null && data[i] !== undefined && !isNaN(data[i])) {\n                    endValue = data[i];\n                    break;\n                }\n            }\n\n            if (startValue === null || endValue === null) {\n                return null;\n            }\n\n            var periodReturn = ((endValue - startValue) \/ startValue) * 100;\n            return parseFloat(periodReturn.toFixed(2));\n        }\n\n        return null;\n    }\n\n    \/\/ \u517c\u5bb9\u6027\u51fd\u6570 - \u57fa\u4e8e\u6536\u76ca\u7387\u6570\u636e\n    function calculatePeriodReturnFromReturns(returnsData, startIndex, endIndex) {\n        return calculatePeriodReturnUnified('returns', returnsData, startIndex, endIndex, 'returns-function');\n    }\n\n    \/\/ \u517c\u5bb9\u6027\u51fd\u6570 - \u57fa\u4e8e\u51c0\u503c\u6570\u636e\n    function calculatePeriodReturnNew(originalNavValues, startIndex, endIndex) {\n        return calculatePeriodReturnUnified('nav', originalNavValues, startIndex, endIndex, 'nav-function');\n    }\n\n    \/\/ \u65b0\u589e\u51fd\u6570\uff1a\u57fa\u4e8e\u7d2f\u8ba1\u51c0\u503c\u8ba1\u7b97\u533a\u95f4\u6536\u76ca\u7387\n    function calculatePeriodReturnFromCumulative(cumulativeValues, startIndex, endIndex, source = 'cumulative') {\n        if (!cumulativeValues || startIndex === undefined || endIndex === undefined) {\n            return null;\n        }\n\n        \/\/ \u5982\u679c\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\uff0c\u8fd4\u56denull\n        if (startIndex < 0 || endIndex >= cumulativeValues.length || startIndex > endIndex) {\n            return null;\n        }\n\n        \/\/ \u5904\u7406\u5355\u6708\u60c5\u51b5\uff08startIndex === endIndex\uff09\n        if (startIndex === endIndex) {\n            \/\/ \u5bf9\u4e8e\u6240\u6709\u5355\u6708\u6309\u94ae\uff0c\u4f7f\u7528\u524d\u4e00\u4e2a\u6708\u7684\u51c0\u503c\u4f5c\u4e3a\u57fa\u51c6\u8ba1\u7b97\u6536\u76ca\u7387\n            if (startIndex > 0) {\n                \/\/ \u4f7f\u7528\u539f\u59cb\u51c0\u503c\u6570\u636e\u800c\u4e0d\u662f\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\u8ba1\u7b97\u6536\u76ca\u7387\n                var prevNavValue = chartDataContext.originalNavValues[startIndex - 1];\n                var currentNavValue = chartDataContext.originalNavValues[startIndex];\n                   \n                if (prevNavValue !== null && prevNavValue !== undefined && !isNaN(prevNavValue) &&\n                    currentNavValue !== null && currentNavValue !== undefined && !isNaN(currentNavValue) &&\n                    prevNavValue !== 0) {\n                    var periodReturn = ((currentNavValue - prevNavValue) \/ prevNavValue) * 100;\n                    console.log('\u5355\u6708\u6309\u94ae\u7edf\u4e00\u5904\u7406\u6536\u76ca\u7387\u8ba1\u7b97 (' + source + '):', {\n                        prevNavValue: prevNavValue,\n                        currentNavValue: currentNavValue,\n                        periodReturn: periodReturn\n                    });\n                    return parseFloat(periodReturn.toFixed(2));\n                }\n            }\n            \/\/ \u5982\u679c\u6ca1\u6709\u524d\u4e00\u4e2a\u6708\u6570\u636e\uff0c\u8fd4\u56de0\n            return 0.00;\n        }\n        \n        \/\/ \u5904\u7406\u62d6\u62fd\u64cd\u4f5c\u7684\u7279\u6b8a\u60c5\u51b5\uff1a\u5f53startIndex\u6bd4\u663e\u793a\u7684\u8d77\u59cb\u7d22\u5f15\u5c0f1\u65f6\uff08\u5305\u542b\u57fa\u51c6\u6708\u4efd\uff09\n        if (source === 'datazoom-drag' && startIndex >= 0 && endIndex >= startIndex) {\n            \/\/ \u68c0\u67e5\u662f\u5426\u6709\u6709\u6548\u7684\u57fa\u51c6\u6708\u4efd\u6570\u636e\n            var baseNavValue = chartDataContext.originalNavValues[startIndex];\n            var endNavValue = chartDataContext.originalNavValues[endIndex];\n            \n            \/\/ \u5982\u679c\u57fa\u51c6\u6708\u4efd\u6570\u636e\u65e0\u6548\uff0c\u5c1d\u8bd5\u4f7f\u7528\u4e0b\u4e00\u4e2a\u6709\u6548\u6708\u4efd\u4f5c\u4e3a\u57fa\u51c6\n            if (baseNavValue === null || baseNavValue === undefined || isNaN(baseNavValue) || baseNavValue === 0) {\n                var validBaseIndex = -1;\n                for (var i = startIndex + 1; i <= endIndex; i++) {\n                    if (chartDataContext.originalNavValues[i] !== null &&\n                        chartDataContext.originalNavValues[i] !== undefined &&\n                        !isNaN(chartDataContext.originalNavValues[i]) &&\n                        chartDataContext.originalNavValues[i] !== 0) {\n                        validBaseIndex = i;\n                        break;\n                    }\n                }\n                \n                if (validBaseIndex !== -1) {\n                    console.log('\u62d6\u62fd\u64cd\u4f5c\u57fa\u51c6\u6708\u4efd\u65e0\u6548\uff0c\u4f7f\u7528\u6709\u6548\u57fa\u51c6\u7d22\u5f15 (' + source + '):', {\n                        originalStartIndex: startIndex,\n                        validBaseIndex: validBaseIndex\n                    });\n                    startIndex = validBaseIndex;\n                    baseNavValue = chartDataContext.originalNavValues[startIndex];\n                }\n            }\n            \n            \/\/ \u5982\u679c\u8c03\u6574\u540e\u7684\u57fa\u51c6\u6708\u4efd\u6570\u636e\u4ecd\u7136\u65e0\u6548\uff0c\u8fd4\u56denull\n            if (baseNavValue === null || baseNavValue === undefined || isNaN(baseNavValue) || baseNavValue === 0) {\n                console.warn('\u62d6\u62fd\u64cd\u4f5c\u65e0\u6cd5\u627e\u5230\u6709\u6548\u57fa\u51c6\u6570\u636e (' + source + '):', {\n                    startIndex: startIndex,\n                    endIndex: endIndex,\n                    baseNavValue: baseNavValue\n                });\n                return null;\n            }\n        }\n\n        \/\/ \u591a\u6708\u60c5\u51b5\uff1a\u76f4\u63a5\u4f7f\u7528\u539f\u59cb\u51c0\u503c\u8ba1\u7b97\u533a\u95f4\u6536\u76ca\u7387\n        var startValue = null;\n        var endValue = null;\n\n        \/\/ \u67e5\u627e\u8d77\u59cb\u6709\u6548\u51c0\u503c\uff08\u4ecestartIndex\u5f00\u59cb\u67e5\u627e\uff09\n        for (var i = startIndex; i <= endIndex; i++) {\n            if (chartDataContext.originalNavValues[i] !== null &&\n                chartDataContext.originalNavValues[i] !== undefined &&\n                !isNaN(chartDataContext.originalNavValues[i]) &&\n                chartDataContext.originalNavValues[i] !== 0) {\n                startValue = chartDataContext.originalNavValues[i];\n                break;\n            }\n        }\n\n        \/\/ \u67e5\u627e\u7ec8\u6b62\u6709\u6548\u51c0\u503c\uff08\u4eceendIndex\u5f80\u524d\u67e5\u627e\uff09\n        for (var i = endIndex; i >= startIndex; i--) {\n            if (chartDataContext.originalNavValues[i] !== null &&\n                chartDataContext.originalNavValues[i] !== undefined &&\n                !isNaN(chartDataContext.originalNavValues[i])) {\n                endValue = chartDataContext.originalNavValues[i];\n                break;\n            }\n        }\n\n        if (startValue === null || endValue === null) {\n            console.log('\u533a\u95f4\u6536\u76ca\u7387\u8ba1\u7b97\u5931\u8d25 (' + source + '):', {\n                startIndex: startIndex,\n                endIndex: endIndex,\n                startValue: startValue,\n                endValue: endValue\n            });\n            return null;\n        }\n\n        var periodReturn = ((endValue - startValue) \/ startValue) * 100;\n        console.log('\u533a\u95f4\u6536\u76ca\u7387\u8ba1\u7b97\u7ed3\u679c (' + source + '):', {\n            startIndex: startIndex,\n            endIndex: endIndex,\n            startValue: startValue,\n            endValue: endValue,\n            periodReturn: periodReturn\n        });\n        return parseFloat(periodReturn.toFixed(2));\n    }\n\n    \/\/ \u66f4\u65b0\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\u663e\u793a\n    function updateInceptionYieldDisplay(returnValue) {\n        var yieldElement = document.getElementById('inceptionYield');\n        if (!yieldElement) return;\n\n        if (returnValue === null || returnValue === undefined) {\n            yieldElement.textContent = '--';\n            yieldElement.className = 'yield-value';\n            return;\n        }\n\n        \/\/ returnValue \u73b0\u5728\u662f\u6570\u503c\u7c7b\u578b\uff0c\u9700\u8981\u683c\u5f0f\u5316\n        var formattedValue = returnValue.toFixed(2) + '%'; \/\/ \u4fdd\u75592\u4f4d\u5c0f\u6570\n        if (returnValue > 0) {\n            formattedValue = '+' + formattedValue;\n            yieldElement.className = 'yield-value positive';\n        } else if (returnValue < 0) {\n            yieldElement.className = 'yield-value negative';\n        } else {\n            yieldElement.className = 'yield-value';\n        }\n\n        yieldElement.textContent = formattedValue;\n    }\n\n    \/\/ \u66f4\u65b0\u533a\u95f4\u6536\u76ca\u7387\u663e\u793a\n    function updatePeriodYieldDisplay(returnValue) {\n        var yieldElement = document.getElementById('periodYield');\n        if (!yieldElement) return;\n\n        if (returnValue === null || returnValue === undefined) {\n            yieldElement.textContent = '--';\n            yieldElement.className = 'yield-value';\n            return;\n        }\n\n        var formattedValue = returnValue.toFixed(2) + '%'; \/\/ \u4fdd\u7559\u4e24\u4f4d\u5c0f\u6570\n        if (returnValue > 0) {\n            formattedValue = '+' + formattedValue;\n            yieldElement.className = 'yield-value positive';\n        } else if (returnValue < 0) {\n            yieldElement.className = 'yield-value negative';\n        } else {\n            yieldElement.className = 'yield-value';\n        }\n\n        yieldElement.textContent = formattedValue;\n    }\n\n    \/\/ \u7edf\u4e00\u91c7\u6837\u6570\u636e\u6620\u5c04\u51fd\u6570 - \u6838\u5fc3\u91cd\u6784\n    function createSampledDataWithMapping(chartDataMap, maxDataPoints) {\n        var originalDates = chartDataMap.originalDates;\n        var originalNavValues = chartDataMap.originalNavValues;\n        var displayDates = chartDataMap.displayDates;\n        var returns = chartDataMap.returns;\n        var cumulativeValues = chartDataMap.cumulativeValues; \/\/ \u65b0\u589e\n        var dataLength = chartDataMap.dataLength;\n\n        console.log('\u521b\u5efa\u91c7\u6837\u6570\u636e\u6620\u5c04:', { dataLength, maxDataPoints });\n\n        \/\/ \u5982\u679c\u6ca1\u6709\u8d85\u8fc7\u6700\u5927\u6570\u636e\u70b9\u9650\u5236\uff0c\u76f4\u63a5\u8fd4\u56de\u539f\u59cb\u6570\u636e\n        if (dataLength <= maxDataPoints) {\n            console.log('\u65e0\u9700\u91c7\u6837\uff0c\u4f7f\u7528\u539f\u59cb\u6570\u636e');\n            return {\n                dates: displayDates,\n                navValues: originalNavValues,\n                returns: returns,\n                cumulativeValues: cumulativeValues, \/\/ \u65b0\u589e\n                indexMapping: null, \/\/ \u65e0\u91c7\u6837\uff0c\u65e0\u9700\u6620\u5c04\n                reverseMapping: null\n            };\n        }\n\n        \/\/ \u9700\u8981\u91c7\u6837\u7684\u60c5\u51b5\n        var step = Math.ceil(dataLength \/ maxDataPoints);\n        console.log('\u91c7\u6837\u6b65\u957f\u8ba1\u7b97:', { step, originalLength: dataLength, targetLength: maxDataPoints });\n\n        var sampledDates = [];\n        var sampledNavValues = [];\n        var sampledReturns = [];\n        var sampledCumulativeValues = []; \/\/ \u65b0\u589e\n        var indexMapping = []; \/\/ \u91c7\u6837\u7d22\u5f15 -> \u539f\u59cb\u7d22\u5f15\n        var reverseMapping = new Array(dataLength).fill(-1); \/\/ \u539f\u59cb\u7d22\u5f15 -> \u91c7\u6837\u7d22\u5f15\n\n        var sampledIndex = 0;\n        for (var i = 0; i < dataLength; i += step) {\n            sampledDates.push(displayDates[i]);\n            sampledNavValues.push(originalNavValues[i]);\n            sampledReturns.push(returns[i]);\n            sampledCumulativeValues.push(cumulativeValues[i]); \/\/ \u65b0\u589e\uff1a\u76f4\u63a5\u4ece\u539f\u6570\u7ec4\u53d6\u7d2f\u8ba1\u503c\n            indexMapping.push(i); \/\/ \u8bb0\u5f55\u91c7\u6837\u7d22\u5f15\u5bf9\u5e94\u7684\u539f\u59cb\u7d22\u5f15\n            reverseMapping[i] = sampledIndex; \/\/ \u8bb0\u5f55\u539f\u59cb\u7d22\u5f15\u5bf9\u5e94\u7684\u91c7\u6837\u7d22\u5f15\n            sampledIndex++;\n        }\n\n        console.log('\u91c7\u6837\u6570\u636e\u6620\u5c04\u521b\u5efa\u5b8c\u6210:', {\n            sampledLength: sampledDates.length,\n            indexMappingLength: indexMapping.length,\n            mappingSample: indexMapping.slice(0, 5),\n            reverseMappingSample: reverseMapping.slice(0, 10)\n        });\n\n        return {\n            dates: sampledDates,\n            navValues: sampledNavValues,\n            returns: sampledReturns,\n            cumulativeValues: sampledCumulativeValues, \/\/ \u65b0\u589e\n            indexMapping: indexMapping,\n            reverseMapping: reverseMapping\n        };\n    }\n\n    \/\/ \u7edf\u4e00\u7d22\u5f15\u8f6c\u6362\u51fd\u6570 - \u6309\u94ae\u548c\u62d6\u62c9\u64cd\u4f5c\u5171\u7528\n    function convertAnyIndexToOriginalIndex(index, dataMap, sampledData) {\n        if (index < 0 || index >= dataMap.dataLength) return -1;\n\n        \/\/ \u5982\u679c\u6ca1\u6709\u91c7\u6837\uff0c\u76f4\u63a5\u8fd4\u56de\u539f\u7d22\u5f15\n        if (!sampledData.indexMapping) {\n            return index;\n        }\n\n        \/\/ \u5982\u679c\u6709\u91c7\u6837\uff0c\u4f7f\u7528\u53cd\u5411\u6620\u5c04\u627e\u5230\u5bf9\u5e94\u7684\u539f\u59cb\u7d22\u5f15\n        var sampledIndex = sampledData.reverseMapping[index];\n        if (sampledIndex !== -1) {\n            return sampledData.indexMapping[sampledIndex];\n        }\n\n        \/\/ \u5982\u679c\u53cd\u5411\u6620\u5c04\u5931\u8d25\uff0c\u4f7f\u7528\u6700\u63a5\u8fd1\u7684\u7d22\u5f15\n        console.warn('\u53cd\u5411\u6620\u5c04\u5931\u8d25\uff0c\u4f7f\u7528\u6700\u63a5\u8fd1\u7d22\u5f15:', index);\n        return findClosestSampledIndex(index, sampledData.indexMapping, dataMap.dataLength);\n    }\n\n    \/\/ \u627e\u5230\u6700\u63a5\u8fd1\u7684\u91c7\u6837\u7d22\u5f15\n    function findClosestSampledIndex(originalIndex, indexMapping, totalLength) {\n        var closestIndex = 0;\n        var minDistance = Math.abs(originalIndex - indexMapping[0]);\n\n        for (var i = 1; i < indexMapping.length; i++) {\n            var distance = Math.abs(originalIndex - indexMapping[i]);\n            if (distance < minDistance) {\n                minDistance = distance;\n                closestIndex = i;\n            }\n        }\n\n        return indexMapping[closestIndex];\n    }\n\n    \/\/ \u91c7\u6837\u7d22\u5f15\u6620\u5c04\u51fd\u6570 - \u89e3\u51b3\u6570\u636e\u91c7\u6837\u5bfc\u81f4\u7684\u7d22\u5f15\u6620\u5c04\u95ee\u9898\n    function mapDisplayIndexToOriginalIndex(displayIndex, displayDates, originalDates, maxDataPoints, dataLength) {\n        if (displayIndex < 0 || displayIndex >= displayDates.length) return -1;\n\n        var targetDisplayDate = displayDates[displayIndex];\n        console.log('\u91c7\u6837\u7d22\u5f15\u6620\u5c04:', {\n            displayIndex: displayIndex,\n            targetDisplayDate: targetDisplayDate,\n            displayDatesLength: displayDates.length,\n            originalDatesLength: originalDates.length,\n            maxDataPoints: maxDataPoints,\n            dataLength: dataLength\n        });\n\n        \/\/ \u5982\u679c\u6ca1\u6709\u91c7\u6837\uff0c\u76f4\u63a5\u8fd4\u56de\u76f8\u540c\u7d22\u5f15\n        if (dataLength <= maxDataPoints) {\n            console.log('\u65e0\u91c7\u6837\uff0c\u76f4\u63a5\u6620\u5c04:', displayIndex);\n            return displayIndex;\n        }\n\n        \/\/ \u6709\u91c7\u6837\u7684\u60c5\u51b5\uff0c\u9700\u8981\u901a\u8fc7\u65e5\u671f\u503c\u627e\u5230\u5bf9\u5e94\u7684\u539f\u59cb\u7d22\u5f15\n        var originalIndex = findIndexByDateValue(targetDisplayDate, originalDates);\n        console.log('\u91c7\u6837\u6620\u5c04\u7ed3\u679c:', { displayIndex, targetDisplayDate, originalIndex });\n\n        \/\/ \u5982\u679c\u8fd8\u662f\u627e\u4e0d\u5230\uff0c\u4f7f\u7528\u6bd4\u4f8b\u4f30\u7b97\n        if (originalIndex === -1) {\n            var estimatedIndex = Math.floor(displayIndex * (dataLength \/ displayDates.length));\n            console.log('\u65e5\u671f\u67e5\u627e\u5931\u8d25\uff0c\u4f7f\u7528\u6bd4\u4f8b\u4f30\u7b97:', { displayIndex, estimatedIndex, ratio: dataLength \/ displayDates.length });\n            return Math.min(estimatedIndex, originalDates.length - 1);\n        }\n\n        return originalIndex;\n    }\n\n    \/\/ \u6839\u636e\u65e5\u671f\u503c\u67e5\u627e\u5bf9\u5e94\u7684\u6570\u636e\u7d22\u5f15\uff08\u589e\u5f3a\u7248\u672c\uff09\n    function findIndexByDateValue(dateValue, dateArray) {\n        if (!dateArray || !dateValue || dateArray.length === 0) return -1;\n\n        \/\/ \u6807\u51c6\u5316\u65e5\u671f\u503c\uff08\u5904\u7406\u4e0d\u540c\u683c\u5f0f\uff09\n        var normalizedValue = normalizeMonthStr(dateValue.toString());\n\n        \/\/ \u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u63d0\u9ad8\u6548\u7387\uff08\u5047\u8bbe\u6570\u636e\u662f\u6709\u5e8f\u7684\uff09\n        var left = 0;\n        var right = dateArray.length - 1;\n\n        while (left <= right) {\n            var mid = Math.floor((left + right) \/ 2);\n            var normalizedDate = normalizeMonthStr(dateArray[mid].toString());\n\n            if (normalizedDate === normalizedValue) {\n                return mid;\n            } else if (normalizedDate < normalizedValue) {\n                left = mid + 1;\n            } else {\n                right = mid - 1;\n            }\n        }\n\n        \/\/ \u5982\u679c\u6ca1\u627e\u5230\u5b8c\u5168\u5339\u914d\uff0c\u627e\u6700\u63a5\u8fd1\u7684\u65e5\u671f\n        return findClosestDateIndex(normalizedValue, dateArray);\n    }\n\n    \/\/ \u627e\u5230\u6700\u63a5\u8fd1\u7684\u65e5\u671f\u7d22\u5f15\n    function findClosestDateIndex(targetDate, dateArray) {\n        var minDiff = Infinity;\n        var closestIndex = -1;\n\n        try {\n            var target = parseMonth(targetDate);\n            if (!target) return -1;\n\n            for (var i = 0; i < dateArray.length; i++) {\n                var current = parseMonth(dateArray[i]);\n                if (!current) continue;\n\n                var diff = Math.abs(target.getTime() - current.getTime());\n                if (diff < minDiff) {\n                    minDiff = diff;\n                    closestIndex = i;\n                }\n            }\n        } catch (e) {\n            console.warn('\u65e5\u671f\u6bd4\u8f83\u5931\u8d25:', e);\n        }\n\n        return closestIndex;\n    }\n\n    \/\/ \u9632\u6296\u51fd\u6570\uff0c\u7528\u4e8e\u6027\u80fd\u4f18\u5316\n    function debounce(func, wait) {\n        var timeout;\n        return function executedFunction(...args) {\n            var later = function () {\n                clearTimeout(timeout);\n                func(...args);\n            };\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n        };\n    }\n\n    \/\/ \u5168\u5c40\u6807\u5fd7\uff0c\u7528\u4e8e\u533a\u5206\u6309\u94ae\u89e6\u53d1\u8fd8\u662f\u7528\u6237\u62d6\u62fd\n    var isButtonTriggeredZoom = false;\n    var currentButtonPeriod = null;\n\n    \/\/ ===== \u7edf\u4e00\u6570\u636e\u57fa\u7840\u7684\u91cd\u6784\uff1a\u6309\u94ae\u548c\u62d6\u62c9\u64cd\u4f5c\u4f7f\u7528\u76f8\u540c\u7684\u6570\u636e\u57fa\u7840 =====\n    var chartDataContext = {\n        originalDates: [],\n        originalNavValues: [],\n        displayDates: [],\n        returns: [],\n        cumulativeValues: [], \/\/ \u65b0\u589e\uff1a\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\n        dataLength: 0,\n        sampledData: null,\n        indexMapping: null,\n        reverseMapping: null\n    };\n\n    \/\/ \u521d\u59cb\u5316\u6570\u636e\u4e0a\u4e0b\u6587\n    function initializeChartDataContext(originalDates, originalNavValues, displayDates, returns, cumulativeValues) {\n        chartDataContext.originalDates = originalDates;\n        chartDataContext.originalNavValues = originalNavValues;\n        chartDataContext.displayDates = displayDates;\n        chartDataContext.returns = returns;\n        chartDataContext.cumulativeValues = cumulativeValues; \/\/ \u65b0\u589e\n        chartDataContext.dataLength = originalDates.length;\n\n        console.log('\u6570\u636e\u4e0a\u4e0b\u6587\u521d\u59cb\u5316\u5b8c\u6210:', {\n            originalLength: chartDataContext.dataLength,\n            firstDate: chartDataContext.originalDates[0],\n            lastDate: chartDataContext.originalDates[chartDataContext.dataLength - 1],\n            firstCumulativeValue: cumulativeValues[0],\n            lastCumulativeValue: cumulativeValues[cumulativeValues.length - 1]\n        });\n    }\n\n    \/\/ \u7edf\u4e00\u7684\u6570\u636e\u91c7\u6837\u5904\u7406\n    function processDataSampling(maxDataPoints) {\n        if (chartDataContext.dataLength <= maxDataPoints) {\n            console.log('\u65e0\u9700\u91c7\u6837\uff0c\u4f7f\u7528\u539f\u59cb\u6570\u636e');\n            chartDataContext.sampledData = {\n                dates: chartDataContext.displayDates,\n                navValues: chartDataContext.originalNavValues,\n                returns: chartDataContext.returns,\n                cumulativeValues: chartDataContext.cumulativeValues, \/\/ \u65b0\u589e\uff1a\u5305\u542b\u7d2f\u8ba1\u51c0\u503c\n                indexMapping: null,\n                reverseMapping: null\n            };\n        } else {\n            console.log('\u9700\u8981\u91c7\u6837\uff0c\u521b\u5efa\u6620\u5c04\u5173\u7cfb');\n            var chartDataMap = {\n                originalDates: chartDataContext.originalDates,\n                originalNavValues: chartDataContext.originalNavValues,\n                displayDates: chartDataContext.displayDates,\n                returns: chartDataContext.returns,\n                cumulativeValues: chartDataContext.cumulativeValues, \/\/ \u65b0\u589e\n                dataLength: chartDataContext.dataLength\n            };\n            chartDataContext.sampledData = createSampledDataWithMapping(chartDataMap, maxDataPoints);\n        }\n\n        chartDataContext.indexMapping = chartDataContext.sampledData.indexMapping;\n        chartDataContext.reverseMapping = chartDataContext.sampledData.reverseMapping;\n\n        return chartDataContext.sampledData;\n    }\n\n    \/\/ \u6570\u636e\u70b9\u63d0\u793a\u66f4\u65b0\uff08\u4f9b\u6309\u94ae\u4e0e\u521d\u59cb\u5316\u5171\u4eab\uff09\n    function updateDataStatusTip(sampledDataOverride) {\n        var chartElement = document.getElementById('navChart');\n        if (!chartElement || !chartElement.parentNode) {\n            return;\n        }\n\n        var dataRef = sampledDataOverride || chartDataContext.sampledData;\n        var chartContainer = chartElement.parentNode;\n        var existingTip = chartContainer.querySelector('.data-status-tip');\n\n        if (existingTip) {\n            existingTip.remove();\n        }\n\n        if (!dataRef || !dataRef.dates || dataRef.dates.length === undefined) {\n            return;\n        }\n\n        if (dataRef.dates.length <= 3) {\n            var tip = document.createElement('div');\n            tip.className = 'data-status-tip';\n            tip.style.cssText = 'text-align: center; padding: 10px; color: #666; font-size: 14px; margin-top: 10px;';\n\n            if (dataRef.dates.length === 1) {\n                tip.innerHTML = '\ud83d\udccd \u5f53\u524d\u5468\u671f\u4ec5\u663e\u793a 1 \u4e2a\u6570\u636e\u70b9\uff0c\u8bf7\u9009\u62e9\u66f4\u957f\u65f6\u95f4\u5468\u671f\u67e5\u770b\u5b8c\u6574\u8d70\u52bf';\n            } else {\n                tip.innerHTML = '\ud83d\udcca \u5f53\u524d\u5468\u671f\u663e\u793a ' + dataRef.dates.length + ' \u4e2a\u6570\u636e\u70b9';\n            }\n\n            chartContainer.appendChild(tip);\n        }\n    }\n\n    \/\/ \u7edf\u4e00\u7d22\u5f15\u8f6c\u6362\u51fd\u6570 - \u6838\u5fc3\u91cd\u6784\n    function convertToOriginalIndex(anyIndex, sourceType) {\n        if (anyIndex < 0 || anyIndex >= chartDataContext.dataLength) return -1;\n\n        \/\/ \u5982\u679c\u6ca1\u6709\u91c7\u6837\uff0c\u76f4\u63a5\u8fd4\u56de\u539f\u7d22\u5f15\n        if (!chartDataContext.indexMapping) {\n            return anyIndex;\n        }\n\n        \/\/ \u6839\u636e\u6765\u6e90\u7c7b\u578b\u8fdb\u884c\u8f6c\u6362\n        if (sourceType === 'sampled') {\n            \/\/ \u91c7\u6837\u7d22\u5f15 -> \u539f\u59cb\u7d22\u5f15\n            if (anyIndex < chartDataContext.indexMapping.length) {\n                return chartDataContext.indexMapping[anyIndex];\n            }\n        } else if (sourceType === 'original') {\n            \/\/ \u539f\u59cb\u7d22\u5f15\u4fdd\u6301\u4e0d\u53d8\n            return anyIndex;\n        }\n\n        \/\/ \u5982\u679c\u8f6c\u6362\u5931\u8d25\uff0c\u4f7f\u7528\u6700\u63a5\u8fd1\u7684\u7d22\u5f15\n        console.warn('\u7d22\u5f15\u8f6c\u6362\u5931\u8d25\uff0c\u4f7f\u7528\u6700\u63a5\u8fd1\u7d22\u5f15:', { anyIndex, sourceType });\n        return findClosestOriginalIndex(anyIndex);\n    }\n\n    \/\/ \u627e\u5230\u6700\u63a5\u8fd1\u7684\u539f\u59cb\u7d22\u5f15\n    function findClosestOriginalIndex(targetIndex) {\n        if (!chartDataContext.indexMapping || chartDataContext.indexMapping.length === 0) {\n            return Math.max(0, Math.min(targetIndex, chartDataContext.dataLength - 1));\n        }\n\n        var closestIndex = chartDataContext.indexMapping[0];\n        var minDistance = Math.abs(targetIndex - closestIndex);\n\n        for (var i = 1; i < chartDataContext.indexMapping.length; i++) {\n            var distance = Math.abs(targetIndex - chartDataContext.indexMapping[i]);\n            if (distance < minDistance) {\n                minDistance = distance;\n                closestIndex = chartDataContext.indexMapping[i];\n            }\n        }\n\n        return closestIndex;\n    }\n\n    \/\/ \u7edf\u4e00\u56fe\u8868\u663e\u793a\u533a\u57df\u66f4\u65b0\u51fd\u6570 - \u91cd\u6784\u7248\u672c\n    var debouncedUpdateChartDisplay = debounce(function (chart, period, lastDataDateStr) {\n        \/\/ \u4f7f\u7528\u4f20\u5165\u7684chart\u53c2\u6570\u4ee3\u66ff\u5168\u5c40myChart\u53d8\u91cf\n        var chartInstance = chart;\n        \n        \/\/ \u8bbe\u7f6e\u6309\u94ae\u89e6\u53d1\u6807\u5fd7\n        isButtonTriggeredZoom = true;\n        currentButtonPeriod = period;\n\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u7684\u6570\u636e\u57fa\u7840\u8fdb\u884c\u8ba1\u7b97\n        var dateRange = getDateRange(period, lastDataDateStr, chartDataContext.originalDates);\n\n        \/\/ \u59cb\u7ec8\u66f4\u65b0\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\uff08\u4e0d\u968f\u65f6\u95f4\u5468\u671f\u53d8\u5316\uff09\n        var inceptionReturn = calculateInceptionReturnFromCumulative(chartDataContext.cumulativeValues);\n        updateInceptionYieldDisplay(inceptionReturn);\n\n        if (period === 'all') {\n            \/\/ \u8ba1\u7b97\u5168\u90e8\u6570\u636e\u7684Y\u8f74\u8303\u56f4\n            var yAxisRange = calculateYAxisRange(chartDataContext.cumulativeValues);\n            \n            \/\/ \u663e\u793a\u5168\u90e8\u6570\u636e\n            chartInstance.setOption({\n                dataZoom: [\n                    {\n                        type: 'inside',\n                        start: 0,\n                        end: 100\n                    },\n                    {\n                        type: 'slider',\n                        start: 0,\n                        end: 100,\n                        height: 20,\n                        bottom: 40,\n                        fillerColor: 'rgba(24, 144, 255, 0.35)',\n                        borderColor: '#1890ff',\n                        backgroundColor: '#edf5ff',\n                        handleStyle: {\n                            color: '#fff',\n                            borderColor: '#1890ff'\n                        },\n                        \/\/ \u52a0\u6df1\u9009\u62e9\u533a\u95f4\u7684\u989c\u8272\n                        selectedDataBackground: {\n                            lineStyle: {\n                                color: '#1890ff',\n                                opacity: 0.8\n                            },\n                            areaStyle: {\n                                color: '#1890ff',\n                                opacity: 0.3\n                            }\n                        },\n                        showDetail: false,\n                        showDataShadow: false\n                    }\n                ],\n                yAxis: {\n                    min: yAxisRange.min, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5c0f\u503c\n                    max: yAxisRange.max, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5927\u503c\n                    splitNumber: 5, \/\/ \u56fa\u5b9a\u5206\u62105\u6bb5\uff0c\u786e\u4fdd\u663e\u793a6\u6761\u523b\u5ea6\u7ebf\n                    interval: yAxisRange.interval, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u95f4\u9694\uff0c\u786e\u4fdd\u663e\u793a6\u6761\u523b\u5ea6\u7ebf\n                    axisLabel: {\n                        formatter: function (value) {\n                            if (value === null || value === undefined || isNaN(value)) {\n                                return '--';\n                            }\n                            \/\/ \u4fdd\u75591\u4f4d\u5c0f\u6570\u70b9\u663e\u793a\n                            return value.toFixed(1);\n                        }\n                    }\n                }\n            }, false);\n\n            \/\/ \u8ba1\u7b97\u5168\u90e8\u6570\u636e\u7684\u533a\u95f4\u6536\u76ca\u7387\uff08\u4f7f\u7528\u539f\u59cb\u6570\u636e\uff09\n            var allPeriodReturn = calculatePeriodReturnFromCumulative(chartDataContext.cumulativeValues, 0, chartDataContext.dataLength - 1, 'button-all');\n            updatePeriodYieldDisplay(allPeriodReturn);\n\n            \/\/ \u66f4\u65b0\u6570\u636e\u72b6\u6001\u63d0\u793a\n            updateDataStatusTip();\n        } else if (dateRange.startIndex !== undefined && dateRange.endIndex !== undefined) {\n            \/\/ \u7edf\u4e00\u4f7f\u7528\u663e\u793a\u65e5\u671f\u8fdb\u884cdataZoom\u64cd\u4f5c\n            var startDisplayIndex = dateRange.startIndex;\n            var endDisplayIndex = dateRange.endIndex;\n\n            \/\/ \u8f6c\u6362\u4e3a\u91c7\u6837\u7d22\u5f15\uff08\u5982\u679c\u6709\u91c7\u6837\uff09\n            var startSampledIndex = startDisplayIndex;\n            var endSampledIndex = endDisplayIndex;\n\n            if (chartDataContext.reverseMapping) {\n                startSampledIndex = chartDataContext.reverseMapping[startDisplayIndex];\n                endSampledIndex = chartDataContext.reverseMapping[endDisplayIndex];\n\n                \/\/ \u5982\u679c\u53cd\u5411\u6620\u5c04\u5931\u8d25\uff0c\u4f7f\u7528\u6700\u63a5\u8fd1\u7684\u7d22\u5f15\n                if (startSampledIndex === -1) startSampledIndex = 0;\n                if (endSampledIndex === -1) endSampledIndex = chartDataContext.sampledData.dates.length - 1;\n            }\n\n            \/\/ \u786e\u4fdd\u7d22\u5f15\u5728\u6709\u6548\u8303\u56f4\u5185\n            startSampledIndex = Math.max(0, Math.min(startSampledIndex, chartDataContext.sampledData.dates.length - 1));\n            endSampledIndex = Math.max(startSampledIndex, Math.min(endSampledIndex, chartDataContext.sampledData.dates.length - 1));\n\n            var startValue = chartDataContext.sampledData.dates[startSampledIndex];\n            var endValue = chartDataContext.sampledData.dates[endSampledIndex];\n\n            console.log('\u6309\u94ae\u64cd\u4f5c - dataZoom\u53c2\u6570:', {\n                startDisplayIndex: startDisplayIndex,\n                endDisplayIndex: endDisplayIndex,\n                startSampledIndex: startSampledIndex,\n                endSampledIndex: endSampledIndex,\n                startValue: startValue,\n                endValue: endValue,\n                hasReverseMapping: !!chartDataContext.reverseMapping\n            });\n\n            chartInstance.dispatchAction({\n                type: 'dataZoom',\n                dataZoomIndex: 0,\n                startValue: startValue,\n                endValue: endValue\n            });\n\n            chartInstance.dispatchAction({\n                type: 'dataZoom',\n                dataZoomIndex: 1,\n                startValue: startValue,\n                endValue: endValue\n            });\n\n            \/\/ \u8ba1\u7b97\u5f53\u524d\u65f6\u95f4\u5468\u671f\u6570\u636e\u7684Y\u8f74\u8303\u56f4\n            var periodData = chartDataContext.cumulativeValues.slice(dateRange.startIndex, dateRange.endIndex + 1);\n            var yAxisRange = calculateYAxisRange(periodData);\n            \n            \/\/ \u5176\u4ed6\u65f6\u95f4\u5468\u671f\u6309\u94ae\u70b9\u51fb\u65f6\uff0c\u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684Y\u8f74\u8303\u56f4\n            chartInstance.setOption({\n                yAxis: {\n                    min: yAxisRange.min, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5c0f\u503c\n                    max: yAxisRange.max, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5927\u503c\n                    splitNumber: 5, \/\/ \u56fa\u5b9a\u5206\u62105\u6bb5\uff0c\u786e\u4fdd\u663e\u793a6\u6761\u523b\u5ea6\u7ebf\n                    interval: yAxisRange.interval, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u95f4\u9694\n                    axisLabel: {\n                        formatter: function (value) {\n                            if (value === null || value === undefined || isNaN(value)) {\n                                return '--';\n                            }\n                            \/\/ \u4fdd\u75591\u4f4d\u5c0f\u6570\u70b9\u663e\u793a\n                            return value.toFixed(1);\n                        }\n                    }\n                }\n            }, false);\n\n            \/\/ \u8ba1\u7b97\u5e76\u66f4\u65b0\u533a\u95f4\u6536\u76ca\u7387\uff08\u4f7f\u7528\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\u4fdd\u6301\u4e00\u81f4\u6027\uff09\n            var calculationStartIndex = dateRange.calculationStartIndex !== undefined ? dateRange.calculationStartIndex : dateRange.startIndex;\n            var periodReturn = calculatePeriodReturnFromCumulative(chartDataContext.cumulativeValues, calculationStartIndex, dateRange.endIndex, 'button-' + period);\n            updatePeriodYieldDisplay(periodReturn);\n\n            \/\/ \u66f4\u65b0\u6570\u636e\u72b6\u6001\u63d0\u793a\n            updateDataStatusTip();\n        }\n\n        \/\/ \u91cd\u7f6e\u6309\u94ae\u89e6\u53d1\u6807\u5fd7\uff08\u5ef6\u8fdf\u91cd\u7f6e\uff0c\u907f\u514ddataZoom\u4e8b\u4ef6\u7acb\u5373\u8986\u76d6\uff09\n        setTimeout(function () {\n            isButtonTriggeredZoom = false;\n        }, 500);\n    }, 300); \/\/ 300ms \u9632\u6296\u5ef6\u8fdf\n\n    function updateChartWithPeriod(chart, period, lastDataDateStr) {\n        \/\/ \u4f7f\u7528\u7edf\u4e00\u6570\u636e\u57fa\u7840\u66f4\u65b0\u56fe\u8868\n        debouncedUpdateChartDisplay(chart, period, lastDataDateStr);\n    }\n\n    function setupPeriodButtons(chart, lastDataDateStr) {\n        var buttons = document.querySelectorAll('.period-btn');\n        buttons.forEach(function (button) {\n            button.addEventListener('click', function () {\n                \/\/ \u79fb\u9664\u6240\u6709\u6309\u94ae\u7684active\u7c7b\n                buttons.forEach(function (btn) {\n                    btn.classList.remove('active');\n                });\n\n                \/\/ \u6dfb\u52a0\u5f53\u524d\u6309\u94ae\u7684active\u7c7b\n                this.classList.add('active');\n\n                \/\/ \u83b7\u53d6\u9009\u62e9\u7684\u65f6\u95f4\u5468\u671f\n                var period = this.getAttribute('data-period');\n\n                \/\/ \u66f4\u65b0\u56fe\u8868\uff08\u4f7f\u7528\u7edf\u4e00\u6570\u636e\u57fa\u7840\uff09\n                updateChartWithPeriod(chart, period, lastDataDateStr);\n            });\n        });\n    }\n\n    \/\/ \u7b49\u5f85\u9875\u9762\u52a0\u8f7d\u5b8c\u6210\u548c\u6570\u636e\u51c6\u5907\u5c31\u7eea\n    document.addEventListener('DOMContentLoaded', function () {\n        \/\/ \u68c0\u67e5\u6570\u636e\u662f\u5426\u5b58\u5728\n        if (typeof fund_values === 'undefined' || !fund_values || fund_values.length === 0) {\n            document.getElementById('navChart').style.display = 'none';\n            document.getElementById('noDataMessage').style.display = 'block';\n            return;\n        }\n\n        \/\/ \u5927\u6570\u636e\u96c6\u6e10\u8fdb\u52a0\u8f7d\u4f18\u5316\n        var veryLargeDataset = fund_values.length > 5000;\n        if (veryLargeDataset) {\n            \/\/ \u663e\u793a\u52a0\u8f7d\u63d0\u793a\n            var loadingTip = document.createElement('div');\n            loadingTip.style.cssText = 'text-align: center; padding: 20px; color: #666;';\n            loadingTip.innerHTML = '\u6570\u636e\u91cf\u8f83\u5927\uff0c\u6b63\u5728\u4f18\u5316\u52a0\u8f7d...';\n            document.getElementById('navChart').parentNode.insertBefore(loadingTip, document.getElementById('navChart'));\n        }\n\n        \/\/ \u521d\u59cb\u5316\u56fe\u8868\n        var dom = document.getElementById('navChart');\n        var myChart = echarts.init(dom, null, {\n            renderer: 'canvas',\n            useDirtyRect: false\n        });\n\n        \/\/ ===== \u7edf\u4e00\u6570\u636e\u57fa\u7840\u91cd\u6784 - \u89e3\u51b3\u6309\u94ae\u4e0e\u62d6\u62c9\u64cd\u4f5c\u5dee\u5f02 =====\n        console.log('=== \u5f00\u59cb\u7edf\u4e00\u6570\u636e\u57fa\u7840\u91cd\u6784 ===');\n\n        \/\/ \u5904\u7406\u6570\u636e\uff08\u6027\u80fd\u4f18\u5316\uff1a\u9884\u5206\u914d\u6570\u7ec4\u5927\u5c0f\uff09\n        var dataLength = fund_values.length;\n        var originalDates = new Array(dataLength);\n        var originalNavValues = new Array(dataLength);\n        var displayDates = new Array(dataLength); \/\/ \u663e\u793a\u65e5\u671f\u6570\u7ec4\n\n        \/\/ \u6027\u80fd\u4f18\u5316\uff1a\u4f7f\u7528\u4f20\u7edf\u7684for\u5faa\u73af\u5904\u7406\u5927\u6570\u636e\u91cf\n        for (var i = 0; i < dataLength; i++) {\n            originalDates[i] = fund_values[i].date; \/\/ \u539f\u59cb\u65e5\u671f\u7528\u4e8e\u8ba1\u7b97\n            displayDates[i] = fund_values[i].display_date || fund_values[i].date; \/\/ \u663e\u793a\u65e5\u671f\uff0c\u4f18\u5148\u4f7f\u7528display_date\n\n            \/\/ \u6539\u8fdb\u6570\u636e\u89e3\u6790\uff0c\u5904\u7406 null\/undefined \u503c\n            var rawValue = fund_values[i].value;\n            if (rawValue === null || rawValue === undefined || rawValue === '') {\n                originalNavValues[i] = null;\n            } else {\n                var parsedValue = parseFloat(rawValue);\n                originalNavValues[i] = isNaN(parsedValue) ? null : parsedValue;\n            }\n        }\n\n        \/\/ \u8c03\u8bd5\uff1a\u68c0\u67e5\u539f\u59cb\u6570\u636e\n        console.log('\u539f\u59cb\u6570\u636e\u52a0\u8f7d\u5b8c\u6210:', {\n            dataLength: dataLength,\n            firstNavValue: originalNavValues[0],\n            lastNavValue: originalNavValues[dataLength - 1],\n            sampleNavValues: originalNavValues.slice(0, 5),\n            firstDate: originalDates[0],\n            lastDate: originalDates[dataLength - 1]\n        });\n\n        \/\/ \u4f7f\u7528\u540e\u7aef\u8ba1\u7b97\u7684\u6536\u76ca\u7387\u6570\u636e\u6216\u524d\u7aef\u8ba1\u7b97\n        var returns = typeof fund_returns !== 'undefined' ? fund_returns : calculateMonthlyReturns(originalNavValues);\n\n        \/\/ \u8ba1\u7b97\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\n        var cumulativeNavValues = calculateCumulativeNavValues(returns);\n\n        \/\/ \u8c03\u8bd5\uff1a\u68c0\u67e5\u7d2f\u8ba1\u51c0\u503c\u8ba1\u7b97\n        console.log('\u7d2f\u8ba1\u51c0\u503c\u8ba1\u7b97\u5b8c\u6210:', {\n            firstValue: cumulativeNavValues[0],\n            secondValue: cumulativeNavValues[1],\n            lastValue: cumulativeNavValues[cumulativeNavValues.length - 1],\n            sampleValues: cumulativeNavValues.slice(0, 5)\n        });\n\n        \/\/ \u8c03\u8bd5\uff1a\u68c0\u67e5\u6570\u636e\u7c7b\u578b\n        console.log('\u6570\u636e\u7c7b\u578b\u68c0\u67e5:', {\n            usesBackendReturns: typeof fund_returns !== 'undefined',\n            firstReturn: returns[0],\n            secondReturn: returns[1],\n            sampleReturns: returns.slice(0, 5)\n        });\n\n        \/\/ \u8ba1\u7b97Y\u8f74\u8303\u56f4\n        var yAxisRange = calculateYAxisRange(cumulativeNavValues);\n        \n        \/\/ \u914d\u7f6e\u9009\u9879 - \u4f7f\u7528\u539f\u59cb\u6570\u636e\u521d\u59cb\u5316\n        var option = {\n            tooltip: {\n                trigger: 'axis',\n                position: function (pt) {\n                    return [pt[0], '10%'];\n                },\n                formatter: function (params) {\n                    var dataIndex = params[0].dataIndex;\n                    var dateValue = params[0].axisValue;\n\n                    \/\/ \u683c\u5f0f\u5316\u65e5\u671f\u663e\u793a\n                    var formattedDate = dateValue;\n                    if (dateValue && dateValue.length === 6) {\n                        formattedDate = dateValue.substring(0, 4) + '-' + dateValue.substring(4, 6);\n                    } else if (dateValue && dateValue.length === 8) {\n                        formattedDate = dateValue.substring(0, 4) + '-' + dateValue.substring(4, 6);\n                    }\n\n                    var result = formattedDate + '<br\/>';\n\n                    \/\/ \u4ece\u91c7\u6837\u6570\u636e\u4e2d\u83b7\u53d6\u6536\u76ca\u7387\n                    var sampledData = chartDataContext.sampledData;\n                    if (sampledData && sampledData.returns) {\n                        var currentReturn = sampledData.returns[dataIndex];\n\n                        \/\/ \u663e\u793a\u5f53\u6708\u6536\u76ca\u7387\n                        if (currentReturn !== null && currentReturn !== undefined && !isNaN(currentReturn)) {\n                            var returnSign = currentReturn >= 0 ? '+' : '';\n                            var returnColor = currentReturn >= 0 ? '#52c41a' : '#ff4d4f';\n                            result += '<span style=\"color:' + returnColor + '\">\u25cf<\/span> \u6536\u76ca\u7387: ' + returnSign + currentReturn.toFixed(2) + '%';\n                        } else {\n                            result += '<span style=\"color:#666\">\u25cf<\/span> \u6536\u76ca\u7387: --';\n                        }\n                    } else {\n                        result += '<span style=\"color:#666\">\u25cf<\/span> \u6570\u636e\u52a0\u8f7d\u4e2d...';\n                    }\n\n                    return result;\n                }\n            },\n            title: {\n                left: 'center',\n                text: fund_name + '\u6536\u76ca\u8d70\u52bf\u56fe',  \/\/ \u4fee\u6539\u6807\u9898\n                textStyle: {\n                    fontSize: 16,\n                    fontWeight: 'normal',\n                    color: '#333'\n                }\n            },\n            toolbox: {\n                feature: {\n                    dataZoom: {\n                        yAxisIndex: 'none',\n                        title: {\n                            zoom: '\u533a\u57df\u7f29\u653e',\n                            back: '\u533a\u57df\u7f29\u653e\u8fd8\u539f'\n                        }\n                    },\n                    restore: {\n                        title: '\u8fd8\u539f'\n                    },\n                    saveAsImage: {\n                        title: '\u4fdd\u5b58\u4e3a\u56fe\u7247'\n                    }\n                }\n            },\n            grid: {\n                left: '3%',\n                right: '4%',\n                bottom: '18%', \/\/ \u9884\u7559\u7a7a\u95f4\u7ed9 dataZoom \u6ed1\u5757\u548c\u6307\u5f15\u6587\u5b57\n                containLabel: true\n            },\n            xAxis: {\n                type: 'category',\n                boundaryGap: false,\n                data: displayDates, \/\/ \u4f7f\u7528\u539f\u59cb\u663e\u793a\u65e5\u671f\u521d\u59cb\u5316\n                axisLabel: {\n                    rotate: 0,\n                    formatter: function (value) {\n                        \/\/ \u5982\u679c\u65e5\u671f\u683c\u5f0f\u662f Ym (YYYYMM)\uff0c\u683c\u5f0f\u5316\u4e3a YYYY-MM \u663e\u793a\n                        if (value && value.length === 6) {\n                            return value.substring(0, 4) + '-' + value.substring(4, 6);\n                        }\n                        \/\/ \u5982\u679c\u662f\u539f\u59cb\u683c\u5f0f YYYYMMDD\uff0c\u663e\u793a\u4e3a YYYY-MM\n                        if (value && value.length === 8) {\n                            return value.substring(0, 4) + '-' + value.substring(4, 6);\n                        }\n                        return value;\n                    }\n                }\n            },\n            yAxis: {\n                type: 'value',\n                boundaryGap: [0, '100%'],\n                axisLabel: {\n                    formatter: function (value) {\n                        if (value === null || value === undefined || isNaN(value)) {\n                            return '--';\n                        }\n                        \/\/ \u4fdd\u75591\u4f4d\u5c0f\u6570\u70b9\u663e\u793a\n                        return value.toFixed(1);\n                    }\n                },\n                \/\/ name: '\u7d2f\u8ba1\u51c0\u503c', \/\/ \u5220\u9664Y\u8f74\u540d\u79f0\n                nameTextStyle: {\n                    color: '#666'\n                },\n                scale: true,\n                min: yAxisRange.min, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5c0f\u503c\n                max: yAxisRange.max, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5927\u503c\n                splitNumber: 5, \/\/ \u56fa\u5b9a\u663e\u793a6\u6761\u6a2a\u7ebf\n                interval: yAxisRange.interval \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u95f4\u9694\uff0c\u786e\u4fdd\u663e\u793a6\u6761\u523b\u5ea6\u7ebf\n            },\n            dataZoom: [\n                {\n                    type: 'inside',\n                    start: 0, \/\/ \u9ed8\u8ba4\u663e\u793a\u5168\u90e8\u6570\u636e\n                    end: 100\n                },\n                {\n                    type: 'slider',\n                    start: 0, \/\/ \u9ed8\u8ba4\u663e\u793a\u5168\u90e8\u6570\u636e\n                    end: 100,\n                    height: 20,\n                    bottom: 40,\n                    fillerColor: 'rgba(24, 144, 255, 0.35)',\n                    borderColor: '#1890ff',\n                    backgroundColor: '#edf5ff',\n                    handleStyle: {\n                        color: '#fff',\n                        borderColor: '#1890ff'\n                    },\n                    \/\/ \u52a0\u6df1\u9009\u62e9\u533a\u95f4\u7684\u989c\u8272\n                    selectedDataBackground: {\n                        lineStyle: {\n                            color: '#1890ff',\n                            opacity: 0.8\n                        },\n                        areaStyle: {\n                            color: '#1890ff',\n                            opacity: 0.3\n                        }\n                    },\n                    showDetail: false,\n                    showDataShadow: false\n                }\n            ],\n            series: [\n                {\n                    name: '\u7d2f\u8ba1\u51c0\u503c',\n                    type: 'line',\n                    symbol: 'circle', \/\/ \u663e\u793a\u6570\u636e\u70b9\n                    symbolSize: 6, \/\/ \u8bbe\u7f6e\u6570\u636e\u70b9\u5927\u5c0f\n                    sampling: 'lttb',\n                    itemStyle: {\n                        color: '#1890ff' \/\/ \u7edf\u4e00\u4f7f\u7528\u84dd\u8272\n                    },\n                    lineStyle: {\n                        width: 2\n                    },\n                    areaStyle: {\n                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n                            {\n                                offset: 0,\n                                color: 'rgba(24, 144, 255, 0.3)'\n                            },\n                            {\n                                offset: 1,\n                                color: 'rgba(24, 144, 255, 0.05)'\n                            }\n                        ])\n                    },\n                    data: cumulativeNavValues, \/\/ \u4f7f\u7528\u539f\u59cb\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\u521d\u59cb\u5316\n                    connectNulls: false\n                }\n            ]\n        };\n\n        \/\/ \u8bbe\u7f6e\u914d\u7f6e\u9879\n        if (option && typeof option === 'object') {\n            myChart.setOption(option);\n        }\n        \n        \/\/ \u6dfb\u52a0dataZoom\u63d0\u793a\u6587\u5b57 - \u5c06\u5728\u51fd\u6570\u5b9a\u4e49\u540e\u8c03\u7528\n\n        \/\/ \u5927\u6570\u636e\u96c6\u4f18\u5316\uff1a\u52a8\u6001\u8c03\u6574\u91c7\u6837\u7b56\u7565\n        var maxDataPoints = 1000; \/\/ \u6700\u5927\u663e\u793a\u6570\u636e\u70b9\n        if (veryLargeDataset) {\n            maxDataPoints = 500; \/\/ \u8d85\u5927\u6570\u636e\u96c6\u8fdb\u4e00\u6b65\u4f18\u5316\n        }\n\n        \/\/ ===== \u7edf\u4e00\u6570\u636e\u57fa\u7840\u91cd\u6784\uff1a\u521d\u59cb\u5316\u6570\u636e\u4e0a\u4e0b\u6587 =====\n        initializeChartDataContext(\n            originalDates,\n            originalNavValues,\n            displayDates,\n            returns,\n            cumulativeNavValues \/\/ \u4f20\u5165\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\n        );\n\n        \/\/ \u5904\u7406\u6570\u636e\u91c7\u6837\uff0c\u521b\u5efa\u7edf\u4e00\u7684\u6620\u5c04\u5173\u7cfb\n        var sampledData = processDataSampling(maxDataPoints);\n\n        \/\/ \u66f4\u65b0\u56fe\u8868\u914d\u7f6e\u4e3a\u91c7\u6837\u540e\u7684\u6570\u636e\n        option.xAxis.data = sampledData.dates;\n        option.series[0].data = sampledData.cumulativeValues; \/\/ \u4f7f\u7528\u91c7\u6837\u540e\u7684\u7d2f\u8ba1\u51c0\u503c\u6570\u636e\n\n        \/\/ \u5982\u679c\u53ea\u6709\u4e00\u4e2a\u6570\u636e\u70b9\uff0c\u589e\u52a0\u6570\u636e\u70b9\u5927\u5c0f\u548c\u89c6\u89c9\u6548\u679c\n        if (sampledData.dates.length === 1) {\n            option.series[0].symbolSize = 8; \/\/ \u589e\u5927\u6570\u636e\u70b9\n            option.series[0].itemStyle.color = '#1890ff'; \/\/ \u786e\u4fdd\u989c\u8272\u53ef\u89c1\n            option.series[0].emphasis = {\n                itemStyle: {\n                    color: '#40a9ff',\n                    borderColor: '#1890ff',\n                    borderWidth: 2\n                },\n                scale: 1.2\n            };\n        }\n\n        \/\/ \u8bbe\u7f6e\u914d\u7f6e\u9879\n        if (option && typeof option === 'object') {\n            myChart.setOption(option);\n        }\n\n        \/\/ \u83b7\u53d6\u6700\u65b0\u6570\u636e\u65e5\u671f\u5b57\u7b26\u4e32\n        var lastDataDateStr = null;\n        if (chartDataContext.originalDates && chartDataContext.originalDates.length > 0) {\n            lastDataDateStr = chartDataContext.originalDates[chartDataContext.originalDates.length - 1];\n        }\n\n        \/\/ \u8bbe\u7f6e\u65f6\u95f4\u5468\u671f\u6309\u94ae\u4e8b\u4ef6\uff08\u4f7f\u7528\u7edf\u4e00\u6570\u636e\u57fa\u7840\uff09\n        setupPeriodButtons(myChart, lastDataDateStr);\n\n        \/\/ \u8ba1\u7b97\u5e76\u663e\u793a\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\uff08\u4f7f\u7528\u7d2f\u8ba1\u51c0\u503c\uff09\n        var inceptionReturn = calculateInceptionReturnFromCumulative(chartDataContext.cumulativeValues);\n        updateInceptionYieldDisplay(inceptionReturn);\n\n        \/\/ \u8ba1\u7b97\u5e76\u663e\u793a\u521d\u59cb\u533a\u95f4\u6536\u76ca\u7387\uff08\u9ed8\u8ba4\u5168\u90e8\u6570\u636e\uff09\n        var initialPeriodReturn = calculatePeriodReturnFromCumulative(chartDataContext.cumulativeValues, 0, chartDataContext.dataLength - 1, 'initial');\n        updatePeriodYieldDisplay(initialPeriodReturn);\n        \n        \/\/ \u786e\u4fdd\u9875\u9762\u52a0\u8f7d\u540e\u6570\u636e\u6b63\u786e\u663e\u793a\n        setTimeout(function() {\n            \/\/ \u91cd\u65b0\u8ba1\u7b97\u5e76\u663e\u793a\u6210\u7acb\u81f3\u4eca\u6536\u76ca\u7387\n            var inceptionReturn = calculateInceptionReturnFromCumulative(chartDataContext.cumulativeValues);\n            updateInceptionYieldDisplay(inceptionReturn);\n            \n            \/\/ \u91cd\u65b0\u8ba1\u7b97\u5e76\u663e\u793a\u533a\u95f4\u6536\u76ca\u7387\uff08\u5168\u90e8\u6570\u636e\uff09\n            var allPeriodReturn = calculatePeriodReturnFromCumulative(chartDataContext.cumulativeValues, 0, chartDataContext.dataLength - 1, 'load-check');\n            updatePeriodYieldDisplay(allPeriodReturn);\n            \n            console.log('\u9875\u9762\u52a0\u8f7d\u540e\u6570\u636e\u68c0\u67e5:', {\n                inceptionReturn: inceptionReturn,\n                allPeriodReturn: allPeriodReturn,\n                dataLength: chartDataContext.dataLength\n            });\n        }, 100);\n\n        \/\/ \u8c03\u7528\u6570\u636e\u72b6\u6001\u63d0\u793a\uff08\u5728sampledData\u521d\u59cb\u5316\u4e4b\u540e\uff09\n        updateDataStatusTip(sampledData);\n\n        \/\/ \u6d4b\u8bd5\u65e5\u671f\u8303\u56f4\u8ba1\u7b97\uff08\u4f7f\u7528\u7edf\u4e00\u6570\u636e\u57fa\u7840\uff09\n        if (console && console.log) {\n            console.log('=== \u7edf\u4e00\u6570\u636e\u57fa\u7840\u91cd\u6784 - \u521d\u59cb\u5316\u6d4b\u8bd5 ===');\n            console.log('\u5f53\u524d\u65e5\u671f\uff1a', new Date().toISOString().slice(0, 10));\n            console.log('\u6700\u65b0\u6570\u636e\u65e5\u671f\uff1a', lastDataDateStr);\n            console.log('\u6570\u636e\u4e0a\u4e0b\u6587\u72b6\u6001:', {\n                originalLength: chartDataContext.dataLength,\n                sampledLength: sampledData.dates.length,\n                hasMapping: !!chartDataContext.indexMapping,\n                firstDate: chartDataContext.originalDates[0],\n                lastDate: chartDataContext.originalDates[chartDataContext.dataLength - 1]\n            });\n\n            var testPeriods = ['1m', '3m', '6m'];\n            testPeriods.forEach(function (period) {\n                var range = getDateRange(period, lastDataDateStr, chartDataContext.originalDates);\n                console.log(period + ' \u8303\u56f4\uff1a \u7d22\u5f15 ' + range.startIndex + '-' + range.endIndex +\n                    ' (\u65e5\u671f: ' + range.startLabel + ' \u81f3 ' + range.endLabel + ')');\n\n                \/\/ \u6d4b\u8bd5\u6536\u76ca\u7387\u8ba1\u7b97\n                var testPeriodReturn = calculatePeriodReturnUnified('nav', chartDataContext.originalNavValues, range.startIndex, range.endIndex, 'test-' + period);\n                console.log(period + ' \u533a\u95f4\u6536\u76ca\u7387\uff1a', testPeriodReturn + '%');\n            });\n        }\n\n        \/\/ \u521d\u59cb\u5316\u65f6\u8bbe\u7f6edataZoom\u4e3a\u663e\u793a\u5168\u90e8\u6570\u636e\n        myChart.setOption({\n            dataZoom: [\n                {\n                    type: 'inside',\n                    start: 0,\n                    end: 100\n                },\n                {\n                    type: 'slider',\n                    start: 0,\n                    end: 100,\n                    height: 20,\n                    bottom: 40,\n                    fillerColor: 'rgba(24, 144, 255, 0.35)',\n                    borderColor: '#1890ff',\n                    backgroundColor: '#edf5ff',\n                    handleStyle: {\n                        color: '#fff',\n                        borderColor: '#1890ff'\n                    },\n                    selectedDataBackground: {\n                        lineStyle: {\n                            color: '#1890ff',\n                            opacity: 0.8\n                        },\n                        areaStyle: {\n                            color: '#1890ff',\n                            opacity: 0.3\n                        }\n                    },\n                    showDetail: false,\n                    showDataShadow: false\n                }\n            ]\n        }, false);\n\n        \/\/ \u521d\u59cb\u5316\u65f6\u9ed8\u8ba4\u9009\u62e9\"\u5168\u90e8\"\u65f6\u95f4\u5468\u671f\n        var allButton = document.querySelector('.period-btn[data-period=\"all\"]');\n        if (allButton) {\n            allButton.classList.add('active');\n        }\n\n        \/\/ \u7edf\u4e00 dataZoom \u4e8b\u4ef6\u5904\u7406\u5668 - \u6838\u5fc3\u91cd\u6784\n        var debouncedDataZoomHandler = debounce(function (params) {\n            \/\/ \u5982\u679c\u662f\u6309\u94ae\u89e6\u53d1\u7684dataZoom\uff0c\u8df3\u8fc7\u5904\u7406\uff0c\u907f\u514d\u8986\u76d6\u6309\u94ae\u8bbe\u7f6e\u7684\u503c\n            if (isButtonTriggeredZoom) {\n                if (console && console.log) {\n                    console.log('DataZoom \u4e8b\u4ef6\u7531\u6309\u94ae\u89e6\u53d1\uff0c\u8df3\u8fc7\u5904\u7406');\n                }\n                return;\n            }\n            \n            \/\/ \u786e\u4fdd\u5728\u62d6\u52a8\u65f6\u91cd\u7f6e\u6309\u94ae\u89e6\u53d1\u6807\u5fd7\n            isButtonTriggeredZoom = false;\n\n            console.log('=== \u7edf\u4e00 dataZoom \u4e8b\u4ef6\u5904\u7406\u5668 - \u5f00\u59cb\u5904\u7406 ===');\n\n            \/\/ \u83b7\u53d6\u5f53\u524d\u663e\u793a\u7684\u6570\u636e\u8303\u56f4\n            var option = myChart.getOption();\n            var dataZoom = option.dataZoom[0]; \/\/ \u83b7\u53d6\u7b2c\u4e00\u4e2a dataZoom \u7ec4\u4ef6\n\n            if (dataZoom && chartDataContext.originalDates && chartDataContext.originalNavValues) {\n                var startIndex, endIndex;\n\n                \/\/ \u68c0\u67e5 dataZoom \u662f\u5426\u4f7f\u7528 startValue\/endValue\n                if (dataZoom.startValue !== undefined && dataZoom.endValue !== undefined) {\n                    console.log('\u4f7f\u7528 startValue\/endValue \u6a21\u5f0f');\n                    console.log('dataZoom\u53c2\u6570:', {\n                        startValue: dataZoom.startValue,\n                        endValue: dataZoom.endValue,\n                        dataLength: chartDataContext.dataLength,\n                        hasMapping: !!chartDataContext.indexMapping,\n                        startValueType: typeof dataZoom.startValue,\n                        endValueType: typeof dataZoom.endValue\n                    });\n\n                    \/\/ \u5224\u65ad startValue\/endValue \u7684\u7c7b\u578b\n                    if (typeof dataZoom.startValue === 'number' && typeof dataZoom.endValue === 'number') {\n                        \/\/ \u5982\u679c\u662f\u6570\u5b57\uff0c\u76f4\u63a5\u4f7f\u7528\u4f5c\u4e3a\u7d22\u5f15\n                        console.log('startValue\/endValue \u662f\u6570\u5b57\u7d22\u5f15\uff0c\u76f4\u63a5\u4f7f\u7528');\n                        startIndex = Math.floor(dataZoom.startValue);\n                        endIndex = Math.floor(dataZoom.endValue);\n\n\n                        \/\/ \u786e\u4fdd\u7d22\u5f15\u5728\u6709\u6548\u8303\u56f4\u5185\n                        startIndex = Math.max(0, Math.min(startIndex, chartDataContext.dataLength - 1));\n                        endIndex = Math.max(0, Math.min(endIndex, chartDataContext.dataLength - 1));\n\n                        \/\/ \u786e\u4fdd startIndex <= endIndex\n                        if (startIndex > endIndex) {\n                            var temp = startIndex;\n                            startIndex = endIndex;\n                            endIndex = temp;\n                        }\n\n\n                        \/\/ \u5982\u679c\u7d22\u5f15\u4ecd\u7136\u65e0\u6548\uff0c\u4f7f\u7528\u767e\u5206\u6bd4\u6a21\u5f0f\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\n                        if (startIndex < 0 || endIndex < 0 || startIndex >= chartDataContext.dataLength || endIndex >= chartDataContext.dataLength) {\n\n                            \/\/ \u4f30\u7b97\u767e\u5206\u6bd4\u4f4d\u7f6e\n                            var estimatedStartPercent = (dataZoom.startValue \/ chartDataContext.sampledData.dates.length) * 100;\n                            var estimatedEndPercent = (dataZoom.endValue \/ chartDataContext.sampledData.dates.length) * 100;\n\n                            startIndex = Math.floor(chartDataContext.dataLength * estimatedStartPercent \/ 100);\n                            endIndex = Math.ceil(chartDataContext.dataLength * estimatedEndPercent \/ 100) - 1;\n\n                            \/\/ \u786e\u4fdd\u7d22\u5f15\u5728\u6709\u6548\u8303\u56f4\u5185\n                            startIndex = Math.max(0, Math.min(startIndex, chartDataContext.dataLength - 1));\n                            endIndex = Math.max(startIndex, Math.min(endIndex, chartDataContext.dataLength - 1));\n\n                            console.log('\u767e\u5206\u6bd4\u5907\u7528\u65b9\u6848\u7ed3\u679c:', {\n                                startIndex,\n                                endIndex,\n                                estimatedStartPercent,\n                                estimatedEndPercent\n                            });\n                        }\n\n                        \/\/ \u5982\u679c\u6709\u91c7\u6837\u6620\u5c04\uff0c\u5c1d\u8bd5\u8f6c\u6362\u4e3a\u539f\u59cb\u7d22\u5f15\n                        if (chartDataContext.indexMapping && startIndex < chartDataContext.indexMapping.length && endIndex < chartDataContext.indexMapping.length) {\n                            console.log('\u6709\u91c7\u6837\u6620\u5c04\uff0c\u8f6c\u6362\u4e3a\u539f\u59cb\u7d22\u5f15');\n                            var originalStartIndex = chartDataContext.indexMapping[startIndex];\n                            var originalEndIndex = chartDataContext.indexMapping[endIndex];\n\n                            console.log('\u91c7\u6837\u7d22\u5f15\u5230\u539f\u59cb\u7d22\u5f15\u8f6c\u6362:', {\n                                sampledStartIndex: startIndex,\n                                sampledEndIndex: endIndex,\n                                originalStartIndex: originalStartIndex,\n                                originalEndIndex: originalEndIndex\n                            });\n\n                            startIndex = originalStartIndex;\n                            endIndex = originalEndIndex;\n                        } else {\n                            console.log('\u65e0\u6709\u6548\u91c7\u6837\u6620\u5c04\u6216\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\uff0c\u4f7f\u7528\u5f53\u524d\u7d22\u5f15');\n                            \/\/ \u5982\u679c\u6ca1\u6709\u91c7\u6837\u6620\u5c04\u6216\u7d22\u5f15\u8d85\u51fa\u8303\u56f4\uff0c\u4f7f\u7528\u5f53\u524d\u7d22\u5f15\n                            \/\/ \u8fd9\u4e9b\u7d22\u5f15\u662f\u57fa\u4e8e\u91c7\u6837\u6570\u636e\u7684\uff0c\u9700\u8981\u4f30\u7b97\u5bf9\u5e94\u7684\u539f\u59cb\u6570\u636e\u7d22\u5f15\n                            if (chartDataContext.sampledData && chartDataContext.sampledData.dates) {\n                                var samplingRatio = chartDataContext.dataLength \/ chartDataContext.sampledData.dates.length;\n                                startIndex = Math.floor(startIndex * samplingRatio);\n                                endIndex = Math.floor(endIndex * samplingRatio);\n\n                                console.log('\u57fa\u4e8e\u91c7\u6837\u6bd4\u4f8b\u4f30\u7b97\u539f\u59cb\u7d22\u5f15:', {\n                                    samplingRatio: samplingRatio,\n                                    estimatedStartIndex: startIndex,\n                                    estimatedEndIndex: endIndex\n                                });\n                            }\n                        }\n                    } else {\n                        \/\/ \u5982\u679c\u662f\u5b57\u7b26\u4e32\uff0c\u6309\u65e5\u671f\u67e5\u627e\n                        console.log('startValue\/endValue \u662f\u5b57\u7b26\u4e32\uff0c\u6309\u65e5\u671f\u67e5\u627e');\n\n                        \/\/ \u6b65\u9aa41: \u5728\u91c7\u6837\u6570\u636e\u4e2d\u67e5\u627e\u7d22\u5f15\n                        var sampledStartIndex = findIndexByDateValue(dataZoom.startValue, chartDataContext.sampledData.dates);\n                        var sampledEndIndex = findIndexByDateValue(dataZoom.endValue, chartDataContext.sampledData.dates);\n\n                        console.log('\u91c7\u6837\u6570\u636e\u67e5\u627e\u7ed3\u679c:', { sampledStartIndex, sampledEndIndex });\n\n                        \/\/ \u6b65\u9aa42: \u8f6c\u6362\u4e3a\u539f\u59cb\u6570\u636e\u7d22\u5f15\n                        if (sampledStartIndex !== -1 && sampledEndIndex !== -1) {\n                            startIndex = convertToOriginalIndex(sampledStartIndex, 'sampled');\n                            endIndex = convertToOriginalIndex(sampledEndIndex, 'sampled');\n\n                            console.log('\u539f\u59cb\u7d22\u5f15\u8f6c\u6362\u7ed3\u679c:', { startIndex, endIndex });\n                        } else {\n                            \/\/ \u5982\u679c\u5728\u91c7\u6837\u6570\u636e\u4e2d\u627e\u4e0d\u5230\uff0c\u5c1d\u8bd5\u5728\u539f\u59cb\u6570\u636e\u4e2d\u76f4\u63a5\u67e5\u627e\n                            console.log('\u91c7\u6837\u6570\u636e\u67e5\u627e\u5931\u8d25\uff0c\u5c1d\u8bd5\u539f\u59cb\u6570\u636e');\n                            startIndex = findIndexByDateValue(dataZoom.startValue, chartDataContext.originalDates);\n                            endIndex = findIndexByDateValue(dataZoom.endValue, chartDataContext.originalDates);\n\n                            console.log('\u539f\u59cb\u6570\u636e\u76f4\u63a5\u67e5\u627e\u7ed3\u679c:', { startIndex, endIndex });\n                        }\n                    }\n                } else {\n                    \/\/ \u4f7f\u7528 start\/end \u767e\u5206\u6bd4\u7684\u60c5\u51b5 - \u7edf\u4e00\u4f7f\u7528\u539f\u59cb\u6570\u636e\u957f\u5ea6\u8ba1\u7b97\n                    console.log('\u4f7f\u7528 start\/end \u767e\u5206\u6bd4\u6a21\u5f0f');\n                    var startPercent = dataZoom.start || 0;\n                    var endPercent = dataZoom.end || 100;\n\n                    startIndex = Math.floor(chartDataContext.dataLength * startPercent \/ 100);\n                    endIndex = Math.ceil(chartDataContext.dataLength * endPercent \/ 100) - 1;\n\n                    \/\/ \u786e\u4fdd endIndex \u4e0d\u4f1a\u8d85\u51fa\u8303\u56f4\n                    endIndex = Math.min(endIndex, chartDataContext.dataLength - 1);\n\n                    console.log('\u767e\u5206\u6bd4\u8ba1\u7b97\u7ed3\u679c:', { startIndex, endIndex, startPercent, endPercent });\n                }\n\n                \/\/ \u786e\u4fdd\u7d22\u5f15\u5728\u6709\u6548\u8303\u56f4\u5185\n                startIndex = Math.max(0, Math.min(startIndex || 0, chartDataContext.dataLength - 1));\n                endIndex = Math.max(startIndex, Math.min(endIndex || chartDataContext.dataLength - 1, chartDataContext.dataLength - 1));\n\n                \/\/ \u5982\u679c\u7d22\u5f15\u65e0\u6548\uff0c\u8df3\u8fc7\u8ba1\u7b97\n                if (startIndex < 0 || endIndex < 0 || startIndex >= chartDataContext.dataLength || endIndex >= chartDataContext.dataLength) {\n                    if (console && console.log) {\n                        console.warn('DataZoom \u7d22\u5f15\u65e0\u6548:', {\n                            startIndex: startIndex,\n                            endIndex: endIndex,\n                            totalLength: chartDataContext.dataLength,\n                            dataZoomStartValue: dataZoom.startValue,\n                            dataZoomEndValue: dataZoom.endValue,\n                            startPercent: dataZoom.start,\n                            endPercent: dataZoom.end\n                        });\n                    }\n                    \/\/ \u663e\u793a\u9519\u8bef\u63d0\u793a\n                    updatePeriodYieldDisplay(null);\n                    return;\n                }\n\n                \/\/ \u9a8c\u8bc1\u6570\u636e\u5b8c\u6574\u6027\n                var startNavValue = chartDataContext.originalNavValues[startIndex];\n                var endNavValue = chartDataContext.originalNavValues[endIndex];\n\n                if (startNavValue === null || startNavValue === undefined || isNaN(startNavValue) ||\n                    endNavValue === null || endNavValue === undefined || isNaN(endNavValue) ||\n                    startNavValue === 0) {\n                    console.warn('DataZoom \u6570\u636e\u65e0\u6548\uff0c\u65e0\u6cd5\u8ba1\u7b97\u6536\u76ca\u7387:', {\n                        startIndex: startIndex,\n                        endIndex: endIndex,\n                        startNavValue: startNavValue,\n                        endNavValue: endNavValue\n                    });\n                    updatePeriodYieldDisplay(null);\n                    return;\n                }\n\n                \/\/ \u8ba1\u7b97\u5e76\u66f4\u65b0\u533a\u95f4\u6536\u76ca\u7387 - \u4f7f\u7528\u7edf\u4e00\u6570\u636e\u57fa\u7840\n                \/\/ \u5bf9\u4e8e\u975e\"\u5168\u90e8\"\u6309\u94ae\u89e6\u53d1\u7684\u62d6\u62fd\u64cd\u4f5c\uff0c\u6536\u76ca\u7387\u8ba1\u7b97\u65f6\u989d\u5916\u5305\u542b\u57fa\u51c6\u6708\u4efd\n                var calculationStartIndex = startIndex;\n                if (startIndex > 0) {\n                    calculationStartIndex = startIndex - 1;\n                }\n                \n                var periodReturn = calculatePeriodReturnFromCumulative(chartDataContext.cumulativeValues, calculationStartIndex, endIndex, 'datazoom-drag');\n                updatePeriodYieldDisplay(periodReturn);\n\n                \/\/ \u8ba1\u7b97\u5f53\u524d\u62d6\u62fd\u533a\u95f4\u6570\u636e\u7684Y\u8f74\u8303\u56f4\n                \/\/ \u786e\u4fdd\u4f7f\u7528\u6b63\u786e\u7684\u6570\u636e\u8303\u56f4\uff0c\u5305\u62ec\u6240\u6709\u53ef\u89c1\u7684\u6570\u636e\u70b9\n                var dragData = chartDataContext.cumulativeValues.slice(startIndex, endIndex + 1);\n                \n                \/\/ \u68c0\u67e5\u62d6\u62fd\u6570\u636e\u662f\u5426\u6709\u6548\uff0c\u5982\u679c\u65e0\u6548\u5219\u4f7f\u7528\u66f4\u5927\u7684\u6570\u636e\u8303\u56f4\n                if (!dragData || dragData.length === 0) {\n                    console.warn('\u62d6\u62fd\u6570\u636e\u4e3a\u7a7a\uff0c\u4f7f\u7528\u5168\u90e8\u6570\u636e\u8ba1\u7b97Y\u8f74\u8303\u56f4');\n                    dragData = chartDataContext.cumulativeValues;\n                }\n                \n                var yAxisRange = calculateYAxisRange(dragData);\n                \n                \/\/ \u7528\u6237\u62d6\u62fd\u65f6\uff0c\u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684Y\u8f74\u8303\u56f4\n                myChart.setOption({\n                yAxis: {\n                    min: yAxisRange.min, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5c0f\u503c\n                    max: yAxisRange.max, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u6700\u5927\u503c\n                    splitNumber: 5, \/\/ \u56fa\u5b9a\u5206\u62105\u6bb5\uff0c\u786e\u4fdd6\u6761\u523b\u5ea6\u7ebf\n                    interval: yAxisRange.interval, \/\/ \u4f7f\u7528\u52a8\u6001\u8ba1\u7b97\u7684\u95f4\u9694\n                    axisLabel: {\n                            formatter: function (value) {\n                                if (value === null || value === undefined || isNaN(value)) {\n                                    return '--';\n                                }\n                                \/\/ \u4fdd\u75591\u4f4d\u5c0f\u6570\u70b9\u663e\u793a\n                                return value.toFixed(1);\n                            }\n                        }\n                    }\n                }, false);\n\n                \/\/ \u8c03\u8bd5\u4fe1\u606f\n                if (console && console.log) {\n                    console.log('DataZoom \u533a\u95f4\u6536\u76ca\u7387\u8ba1\u7b97\u5b8c\u6210:', {\n                        displayStartIndex: startIndex,\n                        displayEndIndex: endIndex,\n                        calculationStartIndex: calculationStartIndex,\n                        periodReturn: periodReturn,\n                        startNav: startNavValue,\n                        endNav: endNavValue,\n                        calculationSource: 'datazoom-drag'\n                    });\n                }\n\n                \/\/ \u6e05\u9664\u6240\u6709\u6309\u94ae\u7684 active \u72b6\u6001\uff0c\u56e0\u4e3a\u73b0\u5728\u662f\u81ea\u5b9a\u4e49\u533a\u95f4\n                var buttons = document.querySelectorAll('.period-btn');\n                buttons.forEach(function (btn) {\n                    btn.classList.remove('active');\n                });\n            } else {\n                console.error('DataZoom \u4e8b\u4ef6\u5904\u7406\u5931\u8d25\uff1a\u7f3a\u5c11\u5fc5\u8981\u6570\u636e', {\n                    hasDataZoom: !!dataZoom,\n                    hasChartDataContext: !!chartDataContext,\n                    hasOriginalDates: !!chartDataContext.originalDates,\n                    hasOriginalNavValues: !!chartDataContext.originalNavValues,\n                    originalDatesLength: chartDataContext.originalDates ? chartDataContext.originalDates.length : 0,\n                    originalNavValuesLength: chartDataContext.originalNavValues ? chartDataContext.originalNavValues.length : 0\n                });\n                updatePeriodYieldDisplay(null);\n            }\n        }, 200); \/\/ 200ms \u9632\u6296\u5ef6\u8fdf\n\n        \/\/ \u7ed1\u5b9a\u9632\u6296\u540e\u7684\u4e8b\u4ef6\u5904\u7406\u5668\u5230 dataZoom \u4e8b\u4ef6\n        myChart.on('dataZoom', debouncedDataZoomHandler);\n\n        \/\/ \u54cd\u5e94\u5f0f\u8c03\u6574\n        window.addEventListener('resize', function () {\n            myChart.resize();\n        });\n\n        \/\/ \u663e\u793a\u52a0\u8f7d\u5b8c\u6210\n        myChart.hideLoading();\n\n        \/\/ \u79fb\u9664\u5927\u6570\u636e\u96c6\u52a0\u8f7d\u63d0\u793a\n        if (veryLargeDataset && loadingTip) {\n            loadingTip.remove();\n        }\n    });\n<\/script>\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-efbb33a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"efbb33a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e31c349\" data-id=\"e31c349\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0ac9b9a elementor-widget elementor-widget-spacer\" data-id=\"0ac9b9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1598d4e elementor-widget elementor-widget-heading\" data-id=\"1598d4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"elementor-heading-title elementor-size-default elementor-inline-editing pen\" data-elementor-setting-key=\"title\" data-pen-placeholder=\"Type Here...\" style=\"font-size: 28px;font-style: normal\">\u57fa\u91d1\u4ecb\u7d39<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3124b20 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3124b20\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e124910\" data-id=\"e124910\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-addc4da elementor-align-center elementor-widget elementor-widget-button\" data-id=\"addc4da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/fangyuanfh.site\/wp-content\/uploads\/2026\/04\/\u65b9\u5706\u591a\u7b56\u7565\u503a\u5238\u57fa\u91d1_2026\u5e744\u6708.pdf\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"far fa-file-pdf\"><\/i>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1\u4ecb\u7d39  \u4e0b\u8f09<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ff488a5 elementor-widget elementor-widget-spacer\" data-id=\"ff488a5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a95ffb6 elementor-widget elementor-widget-heading\" data-id=\"a95ffb6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"elementor-heading-title elementor-size-default elementor-inline-editing pen\" data-elementor-setting-key=\"title\" data-pen-placeholder=\"Type Here...\" style=\"font-size: 28px;font-style: normal\">\u57fa\u91d1\u6708\u5831<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e6c98f6 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"e6c98f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/fangyuanfh.site\/wp-content\/uploads\/2026\/04\/\u65b9\u5706\u591a\u7b56\u7565\u503a\u5238\u57fa\u91d1\u5e73\u5c42\u7ea7\u6708\u62a5_2026\u5e742\u6708.pdf\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<i aria-hidden=\"true\" class=\"far fa-file-pdf\"><\/i>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1\u6708\u5831  \u4e0b\u8f09<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c63989f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c63989f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0ff2c12\" data-id=\"0ff2c12\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ac8100a elementor-widget elementor-widget-spacer\" data-id=\"ac8100a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1 \u57fa\u91d1\u4ecb\u7d39 \u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1\u4ecb\u7d39 \u4e0b\u8f09 \u57fa\u91d1\u6708\u5831 \u65b9\u5713\u591a\u7b56\u7565\u50b5\u5238\u57fa\u91d1\u6708\u5831 \u4e0b\u8f09<\/p>","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"0","ocean_second_sidebar":"0","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"0","ocean_custom_header_template":"0","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"0","ocean_menu_typo_font_family":"0","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"0","footnotes":""},"class_list":["post-6128","page","type-page","status-publish","hentry","entry"],"acf":[],"_links":{"self":[{"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/pages\/6128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/comments?post=6128"}],"version-history":[{"count":6,"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/pages\/6128\/revisions"}],"predecessor-version":[{"id":6161,"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/pages\/6128\/revisions\/6161"}],"wp:attachment":[{"href":"https:\/\/fangyuanfh.site\/zh\/wp-json\/wp\/v2\/media?parent=6128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}