{"id":301,"date":"2026-06-14T15:26:28","date_gmt":"2026-06-14T07:26:28","guid":{"rendered":"http:\/\/www.longxiapro.com\/?p=301"},"modified":"2026-06-14T15:26:28","modified_gmt":"2026-06-14T07:26:28","slug":"financequanyujinrongshujufenxipingtai","status":"publish","type":"post","link":"https:\/\/www.longxiapro.com\/index.php\/301\/","title":{"rendered":"Finance\u30fb\u5168\u57df\u91d1\u878d\u6570\u636e\u5206\u6790\u5e73\u53f0"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u72ec\u7acb\u6807\u9898 &amp; \u5dee\u5f02\u5316\u5b9a\u4f4d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Finance \u2014 \u5168\u5e02\u573a\u91d1\u878d\u6570\u636e\u667a\u80fd\u5206\u6790\u5e73\u53f0 | \u591a\u6e90\u6570\u636e\u878d\u5408\u30fb\u56e0\u5b50\u6316\u6398\u30fb\u7edf\u8ba1\u5efa\u6a21\u30fb\u53ef\u89c6\u5316\u6d1e\u5bdf\u30fb\u91cf\u5316\u8d4b\u80fd\u4e00\u4f53\u5316\u5de5\u4f5c\u53f0<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6838\u5fc3\u5b9a\u4f4d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u7ad9\u5f0f\u8986\u76d6<strong>\u80a1\u7968\u3001\u671f\u8d27\u3001\u57fa\u91d1\u3001\u503a\u5238\u3001\u6307\u6570\u3001\u5b8f\u89c2\u7ecf\u6d4e<\/strong>\u7684\u4e13\u4e1a\u91d1\u878d\u6570\u636e\u5206\u6790\u5f15\u64ce\uff0c\u96c6\u6570\u636e\u91c7\u96c6\u3001\u6e05\u6d17\u3001\u56e0\u5b50\u8ba1\u7b97\u3001\u7edf\u8ba1\u5206\u6790\u3001\u53ef\u89c6\u5316\u3001\u6570\u636e\u5efa\u6a21\u3001\u62a5\u8868\u5bfc\u51fa\u4e8e\u4e00\u4f53\u3002\u6df1\u5ea6\u6253\u901a\u524d\u6587 <code>Backtest Expert<\/code>\u3001<code>Stock Monitor<\/code>\u3001<code>Baidu Web Search<\/code>\u3001<code>WeChat MP CN<\/code> \u7b49\u5de5\u5177\uff0c\u5b9e\u73b0<strong>\u884c\u60c5\u6570\u636e\u2192\u8206\u60c5\u6570\u636e\u2192\u91cf\u5316\u56e0\u5b50\u2192\u7b56\u7565\u56de\u6d4b\u2192\u98ce\u9669\u76d1\u63a7<\/strong>\u5168\u94fe\u8def\u95ed\u73af\uff0c\u517c\u987e\u6295\u7814\u5206\u6790\u3001\u91cf\u5316\u5f00\u53d1\u3001\u98ce\u63a7\u590d\u76d8\u3001\u884c\u60c5\u7814\u5224\u7b49\u573a\u666f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u72ec\u5bb6\u6539\u9020\u7279\u8272\uff08\u533a\u522b\u4e8e\u666e\u901a\u6570\u636e\u5206\u6790\u5de5\u5177\uff09<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u591a\u6e90\u5f02\u6784\u6570\u636e\u878d\u5408<\/strong> \u7edf\u4e00\u63a5\u5165\u884c\u60c5\u3001\u8d22\u52a1\u3001\u8d44\u91d1\u3001\u8206\u60c5\u3001\u5b8f\u89c2\u3001\u516c\u544a\u516d\u5927\u7c7b\u6570\u636e\uff0c\u81ea\u52a8\u5bf9\u9f50\u65f6\u95f4\u7ef4\u5ea6\u3001\u8865\u5168\u7f3a\u5931\u503c\u3001\u6807\u51c6\u5316\u5b57\u6bb5\uff0c\u89e3\u51b3\u91d1\u878d\u6570\u636e\u6765\u6e90\u6742\u4e71\u3001\u683c\u5f0f\u4e0d\u4e00\u95ee\u9898\u3002<\/li>\n\n\n\n<li><strong>\u4e13\u4e1a\u91d1\u878d\u56e0\u5b50\u4f53\u7cfb<\/strong> \u5185\u7f6e\u91cf\u4ef7\u3001\u57fa\u672c\u9762\u3001\u8d44\u91d1\u6d41\u5411\u3001\u60c5\u7eea\u8206\u60c5\u3001\u65e5\u5185\u5206\u65f6\u4e94\u5927\u7c7b\u56e0\u5b50\uff0c\u652f\u6301<strong>\u81ea\u5b9a\u4e49\u56e0\u5b50\u7f16\u8f91\u5668<\/strong>\uff0c\u516c\u5f0f\u5316\u7f16\u5199\u3001\u4e00\u952e\u6279\u91cf\u8ba1\u7b97\uff0c\u9002\u914d\u91cf\u5316\u7b56\u7565\u5f00\u53d1\u3002<\/li>\n\n\n\n<li><strong>\u591a\u7ef4\u7edf\u8ba1\u5206\u6790\u6a21\u578b<\/strong> \u539f\u751f\u5b9e\u73b0\u6536\u76ca\u7387\u5206\u5e03\u3001\u76f8\u5173\u6027\u5206\u6790\u3001\u6ce2\u52a8\u7387\u805a\u7c7b\u3001\u98ce\u9669\u655e\u53e3\u3001\u80dc\u7387\u76c8\u4e8f\u7edf\u8ba1\u3001\u6eda\u52a8\u56de\u5f52\u7b49\u4e13\u4e1a\u91d1\u878d\u7edf\u8ba1\u80fd\u529b\uff0c\u6ee1\u8db3\u6295\u7814\u6df1\u5ea6\u5206\u6790\u9700\u6c42\u3002<\/li>\n\n\n\n<li><strong>\u5206\u65f6 + \u65e5\u7ebf + \u9010\u7b14\u5168\u5468\u671f\u5206\u6790<\/strong> \u652f\u6301\u591a\u65f6\u95f4\u7ef4\u5ea6\u8054\u52a8\u5206\u6790\uff0c\u65e5\u7ebf\u770b\u8d8b\u52bf\u3001\u5206\u65f6\u627e\u62d0\u70b9\u3001\u9010\u7b14\u62c6\u76d8\u53e3\uff0c\u9002\u914d\u77ed\u7ebf\u3001\u4e2d\u7ebf\u3001\u957f\u7ebf\u4e0d\u540c\u4ea4\u6613\u98ce\u683c\u3002<\/li>\n\n\n\n<li><strong>\u667a\u80fd\u6570\u636e\u5206\u5c42\u4e0e\u7f13\u5b58<\/strong> \u5bf9\u63a5 <code>Memory Tiering<\/code>\uff0c\u9ad8\u9891\u884c\u60c5\u3001\u5b9e\u65f6\u56e0\u5b50\u5e38\u9a7b\u9ad8\u901f\u5185\u5b58\uff0c\u5386\u53f2\u8d22\u62a5\u3001\u5e74\u5ea6\u5b8f\u89c2\u6570\u636e\u4e0b\u6c89\u51b7\u5b58\u50a8\uff0c\u5343\u4e07\u7ea7\u6570\u636e\u8ba1\u7b97\u63d0\u901f 50%+\u3002<\/li>\n\n\n\n<li><strong>\u751f\u6001\u5168\u94fe\u8def\u6253\u901a<\/strong> \u5206\u6790\u7ed3\u679c\u76f4\u63a5\u8f93\u51fa\u4e3a <code>Backtest Expert<\/code> \u7b56\u7565\u56e0\u5b50\u3001<code>Stock Monitor<\/code> \u76d1\u63a7\u6807\u7684\u3001Remotion \u52a8\u6001\u6570\u636e\u89c6\u9891\u3001\u793e\u5a92\u8c03\u5ea6\u5de5\u5177\u81ea\u52a8\u5206\u53d1\u7814\u62a5\u3002<\/li>\n\n\n\n<li><strong>\u98ce\u63a7\u9884\u8b66\u4e0e\u5f02\u5e38\u8bc6\u522b<\/strong> \u81ea\u52a8\u8bc6\u522b\u5f02\u52a8\u884c\u60c5\u3001\u6d41\u52a8\u6027\u7f3a\u53e3\u3001\u4f30\u503c\u504f\u79bb\u3001\u8d44\u91d1\u5f02\u5e38\u6d41\u51fa\uff0c\u914d\u7f6e\u9608\u503c\u540e\u5b9e\u65f6\u544a\u8b66\u3002<\/li>\n\n\n\n<li><strong>\u6a21\u677f\u5316\u62a5\u8868\u4e0e\u6279\u91cf\u5bfc\u51fa<\/strong> \u5185\u7f6e\u7814\u62a5\u3001\u6301\u4ed3\u5206\u6790\u3001\u98ce\u9669\u62a5\u544a\u3001\u4e1a\u7ee9\u5bf9\u6bd4\u7b49\u6a21\u677f\uff0c\u4e00\u952e\u751f\u6210 Excel\/PDF\/HTML \u62a5\u8868\uff0c\u652f\u6301\u5b9a\u65f6\u6279\u91cf\u5bfc\u51fa\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8c\u3001\u4f20\u7edf\u91d1\u878d\u5206\u6790\u5de5\u5177\u75db\u70b9<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u274c \u6570\u636e\u5272\u88c2\uff1a\u884c\u60c5\u3001\u8d22\u52a1\u3001\u8206\u60c5\u5206\u5c5e\u4e0d\u540c\u5e73\u53f0\uff0c\u624b\u52a8\u6c47\u603b\u8017\u65f6\u6613\u9519<\/li>\n\n\n\n<li>\u274c \u529f\u80fd\u5355\u4e00\uff1a\u4ec5\u57fa\u7840 K \u7ebf\u5c55\u793a\uff0c\u7f3a\u5c11\u4e13\u4e1a\u56e0\u5b50\u3001\u7edf\u8ba1\u5efa\u6a21\u80fd\u529b<\/li>\n\n\n\n<li>\u274c \u6269\u5c55\u56f0\u96be\uff1a\u81ea\u5b9a\u4e49\u6307\u6807 \/ \u56e0\u5b50\u9700\u8981\u6df1\u5ea6\u4e8c\u6b21\u5f00\u53d1\uff0c\u95e8\u69db\u9ad8<\/li>\n\n\n\n<li>\u274c \u6027\u80fd\u4e0d\u8db3\uff1a\u6d77\u91cf\u5386\u53f2\u6570\u636e\u67e5\u8be2\u3001\u6279\u91cf\u8ba1\u7b97\u5361\u987f\u4e25\u91cd<\/li>\n\n\n\n<li>\u274c \u94fe\u8def\u5b64\u7acb\uff1a\u5206\u6790\u7ed3\u679c\u65e0\u6cd5\u76f4\u63a5\u5bf9\u63a5\u56de\u6d4b\u3001\u5b9e\u76d8\u76d1\u63a7\u7b49\u5de5\u5177<\/li>\n\n\n\n<li>\u274c \u65e0\u5f02\u5e38\u76d1\u63a7\uff1a\u53ea\u80fd\u4e8b\u540e\u5206\u6790\uff0c\u65e0\u6cd5\u5b9e\u65f6\u6355\u6349\u884c\u60c5\u3001\u8d44\u91d1\u5f02\u52a8<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e09\u3001\u6838\u5fc3\u529f\u80fd\u6a21\u5757<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u591a\u6e90\u6570\u636e\u63a5\u5165\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u884c\u60c5\u6570\u636e\uff1aA \u80a1\u3001\u671f\u8d27\u3001ETF\u3001\u53ef\u8f6c\u503a\u3001\u6307\u6570\u3001\u6e2f\u80a1 \/ \u7f8e\u80a1\uff0c\u652f\u6301\u65e5\u7ebf \/ \u5206\u65f6 \/ 5 \u5206\u949f \/ \u9010\u7b14<\/li>\n\n\n\n<li>\u57fa\u672c\u9762\u6570\u636e\uff1a\u8d22\u62a5\u3001\u8425\u6536\u3001\u51c0\u5229\u6da6\u3001\u5e02\u76c8\u7387\u3001\u5e02\u51c0\u7387\u3001\u8d44\u4ea7\u8d1f\u503a\u3001\u5206\u7ea2\u9001\u914d<\/li>\n\n\n\n<li>\u8d44\u91d1\u6570\u636e\uff1a\u4e3b\u529b\u51c0\u6d41\u5165\u3001\u5317\u5411\u8d44\u91d1\u3001\u9f99\u864e\u699c\u3001\u5927\u5355 \/ \u4e2d\u5355 \/ \u6563\u6237\u6301\u4ed3<\/li>\n\n\n\n<li>\u8206\u60c5 &amp; \u8d44\u8baf\uff1a\u65b0\u95fb\u3001\u516c\u4f17\u53f7\u6587\u7ae0\u3001\u80a1\u5427\u8bc4\u8bba\u3001\u884c\u4e1a\u70ed\u70b9\uff08\u5bf9\u63a5\u767e\u5ea6\u641c\u7d22\u3001\u516c\u4f17\u53f7\u76d1\u63a7\uff09<\/li>\n\n\n\n<li>\u5b8f\u89c2\u6570\u636e\uff1aCPI\u3001PMI\u3001\u5229\u7387\u3001\u6c47\u7387\u3001\u884c\u4e1a\u666f\u6c14\u5ea6<\/li>\n\n\n\n<li>\u516c\u544a\u6570\u636e\uff1a\u4e1a\u7ee9\u9884\u544a\u3001\u51cf\u6301\u3001\u5e76\u8d2d\u3001\u76d1\u7ba1\u516c\u544a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u6570\u636e\u6e05\u6d17 &amp; \u6807\u51c6\u5316\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9664\u6743\u9664\u606f\u3001\u590d\u6743\u8ba1\u7b97\uff08\u524d\u590d\u6743 \/ \u540e\u590d\u6743\uff09<\/li>\n\n\n\n<li>\u7f3a\u5931\u503c\u586b\u5145\u3001\u5f02\u5e38\u4ef7\u683c\u8fc7\u6ee4\u3001\u505c\u724c\u6570\u636e\u5254\u9664<\/li>\n\n\n\n<li>\u6570\u636e\u5f52\u4e00\u5316\u3001\u5b57\u6bb5\u7edf\u4e00\u3001\u65f6\u95f4\u8f74\u5bf9\u9f50<\/li>\n\n\n\n<li>\u6570\u636e\u53bb\u91cd\u3001\u7248\u672c\u5f52\u6863\u3001\u5386\u53f2\u56de\u6eaf<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u91d1\u878d\u56e0\u5b50\u8ba1\u7b97\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u91cf\u4ef7\u56e0\u5b50\uff1a\u5747\u7ebf\u3001MACD\u3001KDJ\u3001BOLL\u3001\u52a8\u91cf\u3001\u53cd\u8f6c\u3001\u632f\u5e45<\/li>\n\n\n\n<li>\u57fa\u672c\u9762\u56e0\u5b50\uff1a\u4f30\u503c\u56e0\u5b50\u3001\u6210\u957f\u56e0\u5b50\u3001\u76c8\u5229\u56e0\u5b50\u3001\u507f\u503a\u80fd\u529b\u56e0\u5b50<\/li>\n\n\n\n<li>\u8d44\u91d1\u56e0\u5b50\uff1a\u8d44\u91d1\u51c0\u6d41\u5165\u3001\u5927\u5355\u5360\u6bd4\u3001\u7b79\u7801\u5206\u5e03\u3001\u6362\u624b\u7387\u56e0\u5b50<\/li>\n\n\n\n<li>\u8206\u60c5\u56e0\u5b50\uff1a\u60c5\u611f\u5f97\u5206\u3001\u70ed\u5ea6\u6307\u6570\u3001\u5173\u952e\u8bcd\u6743\u91cd<\/li>\n\n\n\n<li>\u81ea\u5b9a\u4e49\u56e0\u5b50\uff1a\u516c\u5f0f\u7f16\u8f91\u5668\u3001\u51fd\u6570\u5e93\u3001\u6279\u91cf\u8ba1\u7b97\u3001\u56e0\u5b50\u56de\u6d4b\u68c0\u9a8c<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u4e13\u4e1a\u7edf\u8ba1\u5206\u6790\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u7840\u7edf\u8ba1\uff1a\u533a\u95f4\u6536\u76ca\u3001\u6700\u5927\u56de\u64a4\u3001\u6ce2\u52a8\u7387\u3001\u80dc\u7387\u3001\u76c8\u4e8f\u6bd4<\/li>\n\n\n\n<li>\u76f8\u5173\u6027\u5206\u6790\uff1a\u6807\u7684\u8054\u52a8\u3001\u677f\u5757\u8f6e\u52a8\u3001\u56e0\u5b50\u76f8\u5173\u6027\u77e9\u9635<\/li>\n\n\n\n<li>\u5206\u5e03\u5206\u6790\uff1a\u6536\u76ca\u7387\u76f4\u65b9\u56fe\u3001\u5206\u4f4d\u6570\u3001\u6781\u503c\u7edf\u8ba1<\/li>\n\n\n\n<li>\u56de\u5f52\u5206\u6790\uff1a\u7ebf\u6027\u56de\u5f52\u3001\u6eda\u52a8\u56de\u5f52\u3001\u56e0\u5b50\u6709\u6548\u6027\u68c0\u9a8c<\/li>\n\n\n\n<li>\u7ec4\u5408\u5206\u6790\uff1a\u6807\u7684\u76f8\u5173\u6027\u3001\u98ce\u9669\u5206\u6563\u5ea6\u3001\u677f\u5757\u96c6\u4e2d\u5ea6<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5. \u53ef\u89c6\u5316\u5206\u6790\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>K \u7ebf + \u6307\u6807\u7ec4\u5408\u56fe\u3001\u5206\u65f6\u91cf\u4ef7\u56fe\u3001\u8d44\u91d1\u6d41\u5411\u66f2\u7ebf<\/li>\n\n\n\n<li>\u76f8\u5173\u6027\u70ed\u529b\u56fe\u3001\u6536\u76ca\u5206\u5e03\u76f4\u65b9\u56fe\u3001\u56de\u64a4\u8d70\u52bf\u56fe<\/li>\n\n\n\n<li>\u677f\u5757\u6da8\u8dcc\u6392\u884c\u3001\u9f99\u864e\u699c\u53ef\u89c6\u5316\u3001\u8206\u60c5\u60c5\u611f\u8d8b\u52bf\u56fe<\/li>\n\n\n\n<li>\u4ea4\u4e92\u5f0f\u56fe\u8868\uff0c\u652f\u6301\u7f29\u653e\u3001\u9009\u533a\u95f4\u3001\u5355\u70b9\u6570\u636e\u67e5\u8be2<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6. \u98ce\u9669\u76d1\u63a7 &amp; \u5f02\u52a8\u9884\u8b66<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4ef7\u683c\u5f02\u52a8\uff1a\u6da8\u8dcc\u8d85\u9608\u503c\u3001\u8fde\u7eed\u6da8\u8dcc\u3001\u8df3\u7a7a\u7f3a\u53e3\u544a\u8b66<\/li>\n\n\n\n<li>\u8d44\u91d1\u5f02\u52a8\uff1a\u5927\u5355\u7a81\u88ad\u3001\u5317\u5411\u8d44\u91d1\u5927\u5e45\u6d41\u5165\u6d41\u51fa\u544a\u8b66<\/li>\n\n\n\n<li>\u4f30\u503c\u5f02\u52a8\uff1a\u5e02\u76c8\u7387 \/ \u5e02\u51c0\u7387\u504f\u79bb\u5386\u53f2\u533a\u95f4\u544a\u8b66<\/li>\n\n\n\n<li>\u6d41\u52a8\u6027\u76d1\u63a7\uff1a\u6210\u4ea4\u91cf\u840e\u7f29\u3001\u76d8\u53e3\u6df1\u5ea6\u4e0d\u8db3\u9884\u8b66<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7. \u62a5\u8868 &amp; \u5bfc\u51fa\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u56fa\u5b9a\u6a21\u677f\uff1a\u4e2a\u80a1\u5206\u6790\u3001\u7ec4\u5408\u6301\u4ed3\u3001\u884c\u4e1a\u5bf9\u6bd4\u3001\u98ce\u9669\u62a5\u544a<\/li>\n\n\n\n<li>\u81ea\u5b9a\u4e49\u62a5\u8868\uff1a\u81ea\u7531\u62d6\u62fd\u5b57\u6bb5\u3001\u914d\u7f6e\u7edf\u8ba1\u89c4\u5219<\/li>\n\n\n\n<li>\u5bfc\u51fa\u683c\u5f0f\uff1aExcel\u3001CSV\u3001PDF\u3001HTML\u3001JSON<\/li>\n\n\n\n<li>\u5b9a\u65f6\u4efb\u52a1\uff1a\u6bcf\u65e5 \/ \u6bcf\u5468\u81ea\u52a8\u751f\u6210\u62a5\u8868\u5e76\u63a8\u9001<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">8. \u751f\u6001\u5bf9\u63a5\u6a21\u5757<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5411 <code>Backtest Expert<\/code> \u8f93\u51fa\u56e0\u5b50\u6570\u636e\u3001\u6807\u7684\u6c60\uff0c\u7528\u4e8e\u7b56\u7565\u56de\u6d4b<\/li>\n\n\n\n<li>\u5411 <code>Stock Monitor<\/code> \u63a8\u9001\u4f18\u9009\u6807\u7684\u3001\u5f02\u52a8\u6807\u7684\uff0c\u5f00\u542f\u5b9e\u65f6\u76d1\u63a7<\/li>\n\n\n\n<li>\u5bf9\u63a5 <code>Remotion<\/code> \u5c06\u5206\u6790\u56fe\u8868\u751f\u6210\u52a8\u6001\u8bb2\u89e3\u89c6\u9891<\/li>\n\n\n\n<li>\u5bf9\u63a5 <code>Social Media Scheduler<\/code> \u81ea\u52a8\u5206\u53d1\u7814\u62a5\u3001\u5206\u6790\u5185\u5bb9<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u56db\u3001\u9879\u76ee\u76ee\u5f55\u7ed3\u6784<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">plaintext<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>finance\/\n\u251c\u2500\u2500 config\/              # \u5168\u5c40\u914d\u7f6e\u3001\u6570\u636e\u6e90\u3001\u544a\u8b66\u89c4\u5219\u3001\u7f13\u5b58\u7b56\u7565\n\u251c\u2500\u2500 core\/                # \u6570\u636e\u5185\u6838\u3001\u6570\u636e\u6e05\u6d17\u3001\u590d\u6743\u8ba1\u7b97\u3001\u65f6\u95f4\u5bf9\u9f50\n\u251c\u2500\u2500 data_source\/         # \u591a\u6570\u636e\u6e90\u5bf9\u63a5\uff08Tushare\/Akshare\/\u722c\u866b\uff09\n\u251c\u2500\u2500 factor\/              # \u91d1\u878d\u56e0\u5b50\u5e93\u3001\u81ea\u5b9a\u4e49\u56e0\u5b50\u5f15\u64ce\u3001\u56e0\u5b50\u68c0\u9a8c\n\u251c\u2500\u2500 statistics\/          # \u7edf\u8ba1\u5206\u6790\u3001\u56de\u5f52\u3001\u76f8\u5173\u6027\u3001\u5206\u5e03\u8ba1\u7b97\n\u251c\u2500\u2500 visual\/              # \u53ef\u89c6\u5316\u56fe\u8868\u3001\u7ed8\u56fe\u7ec4\u4ef6\n\u251c\u2500\u2500 risk_warn\/           # \u98ce\u9669\u8bc6\u522b\u3001\u5f02\u52a8\u68c0\u6d4b\u3001\u544a\u8b66\u63a8\u9001\n\u251c\u2500\u2500 report\/              # \u62a5\u8868\u6a21\u677f\u3001\u751f\u6210\u5f15\u64ce\u3001\u5bfc\u51fa\u5de5\u5177\n\u251c\u2500\u2500 api\/                 # FastAPI\u63a5\u53e3\u3001\u5bf9\u5916\u670d\u52a1\u3001OpenClaw\u5bf9\u63a5\n\u251c\u2500\u2500 task\/                # \u5b9a\u65f6\u4efb\u52a1\u3001\u6279\u91cf\u8ba1\u7b97\u3001\u4efb\u52a1\u961f\u5217\n\u251c\u2500\u2500 utils\/               # \u5de5\u5177\u51fd\u6570\u3001\u65e5\u5fd7\u3001\u5185\u5b58\u5206\u5c42\u9002\u914d\n\u251c\u2500\u2500 web\/                 # \u524d\u7aef\u4ea4\u4e92\u5f0f\u5206\u6790\u770b\u677f\n\u251c\u2500\u2500 requirements.txt     # \u9879\u76ee\u4f9d\u8d56\n\u2514\u2500\u2500 main.py              # \u9879\u76ee\u5165\u53e3\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e94\u3001\u5b8c\u6574\u4e8c\u6b21\u5f00\u53d1\u4ee3\u7801<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. requirements.txt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">txt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6570\u636e\u83b7\u53d6\ntushare&gt;=1.7.9\nakshare&gt;=1.12.0\nrequests&gt;=2.31.0\nbeautifulsoup4&gt;=4.12.0\n\n# \u6570\u636e\u5904\u7406\nnumpy&gt;=1.24.0\npandas&gt;=2.0.0\nscipy&gt;=1.10.0\n\n# \u7edf\u8ba1\u5efa\u6a21\nscikit-learn&gt;=1.3.0\nstatsmodels&gt;=0.14.0\n\n# \u53ef\u89c6\u5316\nmatplotlib&gt;=3.7.0\nplotly&gt;=5.17.0\nseaborn&gt;=0.13.0\n\n# \u63a5\u53e3\u4e0e\u8c03\u5ea6\nfastapi&gt;=0.104.0\nuvicorn&gt;=0.24.0\napscheduler&gt;=3.10.0\n\n# \u7f13\u5b58\u4e0e\u5de5\u5177\nredis&gt;=5.0.0\nloguru&gt;=0.7.2\npython-dotenv&gt;=1.0.0\nopenpyxl&gt;=3.1.0\njinja2&gt;=3.1.0\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u5168\u5c40\u914d\u7f6e config\/settings.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n# \u6570\u636e\u6e90\u5bc6\u94a5\nTUSHARE_TOKEN = os.getenv(\"TUSHARE_TOKEN\", \"\")\n\n# \u6570\u636e\u5b58\u50a8\u8def\u5f84\nRAW_DATA_DIR = \".\/data\/raw\"\nCLEAN_DATA_DIR = \".\/data\/clean\"\nREPORT_DIR = \".\/report\/output\"\n\n# \u590d\u6743\u8bbe\u7f6e: qfq\u524d\u590d\u6743 \/ hfq\u540e\u590d\u6743 \/ none\u4e0d\u590d\u6743\nADJUST_TYPE = \"qfq\"\n\n# \u5185\u5b58\u5206\u5c42\u914d\u7f6e\uff08\u5bf9\u63a5Memory Tiering\uff09\nHOT_DATA_EXPIRE = 1800\nCOLD_DATA_COMPRESS = True\n\n# \u98ce\u9669\u544a\u8b66\u9608\u503c\nPRICE_CHANGE_WARN = 0.05    # \u6da8\u8dcc5%\u89e6\u53d1\u544a\u8b66\nNET_MONEY_WARN = 50000000   # \u5355\u65e5\u8d44\u91d1\u5f02\u52a85000\u4e07\n\n# \u63a5\u53e3\u914d\u7f6e\nAPI_HOST = \"0.0.0.0\"\nAPI_PORT = 8100\n\n# \u5b9a\u65f6\u4efb\u52a1\u65f6\u533a\nTIMEZONE = \"Asia\/Shanghai\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u65e5\u5fd7\u5de5\u5177 utils\/logger.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from loguru import logger\nimport os\nfrom config.settings import RAW_DATA_DIR\n\nlog_file = os.path.join(RAW_DATA_DIR, \"finance_run.log\")\n\nlogger.add(\n    log_file,\n    rotation=\"500 MB\",\n    retention=\"30 days\",\n    level=\"INFO\",\n    encoding=\"utf-8\",\n    enqueue=True\n)\n\ndef get_logger():\n    return logger\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u6570\u636e\u6e90\u5f15\u64ce data_source\/data_loader.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import tushare\nimport pandas as pd\nfrom datetime import datetime\nfrom config.settings import TUSHARE_TOKEN, ADJUST_TYPE\nfrom utils.logger import get_logger\n\nlogger = get_logger()\ntushare.set_token(TUSHARE_TOKEN)\npro = tushare.pro_api()\n\nclass DataLoader:\n    def __init__(self):\n        self.cache = {}\n\n    def get_daily_bar(self, ts_code, start_date, end_date):\n        \"\"\"\u83b7\u53d6\u65e5\u7ebf\u884c\u60c5 + \u590d\u6743\u5904\u7406\"\"\"\n        cache_key = f\"{ts_code}_{start_date}_{end_date}\"\n        if cache_key in self.cache:\n            return self.cache&#91;cache_key]\n\n        try:\n            # \u539f\u59cb\u884c\u60c5\n            df = pro.daily(\n                ts_code=ts_code,\n                start_date=start_date.replace(\"-\", \"\"),\n                end_date=end_date.replace(\"-\", \"\")\n            )\n            if df.empty:\n                logger.warning(f\"\u65e0\u884c\u60c5\u6570\u636e\uff1a{ts_code}\")\n                return None\n\n            # \u590d\u6743\u56e0\u5b50\n            adj_factor = pro.adj_factor(\n                ts_code=ts_code,\n                start_date=start_date.replace(\"-\", \"\"),\n                end_date=end_date.replace(\"-\", \"\")\n            )\n            df = df.merge(adj_factor, on=\"trade_date\", how=\"left\")\n            df&#91;\"adj_factor\"] = df&#91;\"adj_factor\"].fillna(1)\n\n            # \u590d\u6743\u8ba1\u7b97\n            if ADJUST_TYPE == \"qfq\":\n                df&#91;\"open\"] = df&#91;\"open\"] * df&#91;\"adj_factor\"]\n                df&#91;\"high\"] = df&#91;\"high\"] * df&#91;\"adj_factor\"]\n                df&#91;\"low\"] = df&#91;\"low\"] * df&#91;\"low\"] * df&#91;\"adj_factor\"]\n                df&#91;\"close\"] = df&#91;\"close\"] * df&#91;\"adj_factor\"]\n            elif ADJUST_TYPE == \"hfq\":\n                latest_factor = df&#91;\"adj_factor\"].iloc&#91;0]\n                df&#91;\"open\"] = df&#91;\"open\"] * df&#91;\"adj_factor\"] \/ latest_factor\n                df&#91;\"high\"] = df&#91;\"high\"] * df&#91;\"adj_factor\"] \/ latest_factor\n                df&#91;\"low\"] = df&#91;\"low\"] * df&#91;\"adj_factor\"] \/ latest_factor\n                df&#91;\"close\"] = df&#91;\"close\"] * df&#91;\"adj_factor\"] \/ latest_factor\n\n            # \u65e5\u671f\u683c\u5f0f\u5316 &amp; \u6392\u5e8f\n            df&#91;\"trade_date\"] = pd.to_datetime(df&#91;\"trade_date\"])\n            df.rename(columns={\"trade_date\": \"date\"}, inplace=True)\n            df = df.sort_values(\"date\").reset_index(drop=True)\n            df = df&#91;df&#91;\"vol\"] &gt; 0]\n\n            self.cache&#91;cache_key] = df\n            logger.info(f\"\u884c\u60c5\u52a0\u8f7d\u5b8c\u6210\uff1a{ts_code} \u5171{len(df)}\u6761\")\n            return df\n        except Exception as e:\n            logger.error(f\"\u884c\u60c5\u83b7\u53d6\u5931\u8d25 {ts_code}\uff1a{str(e)}\")\n            return None\n\n    def get_money_flow(self, ts_code, start_date, end_date):\n        \"\"\"\u83b7\u53d6\u4e2a\u80a1\u8d44\u91d1\u6d41\u5411\"\"\"\n        try:\n            df = pro.moneyflow(\n                ts_code=ts_code,\n                start_date=start_date.replace(\"-\", \"\"),\n                end_date=end_date.replace(\"-\", \"\")\n            )\n            df&#91;\"trade_date\"] = pd.to_datetime(df&#91;\"trade_date\"])\n            df.rename(columns={\"trade_date\": \"date\"}, inplace=True)\n            return df.sort_values(\"date\").reset_index(drop=True)\n        except Exception as e:\n            logger.error(f\"\u8d44\u91d1\u6d41\u83b7\u53d6\u5931\u8d25\uff1a{str(e)}\")\n            return None\n\n# \u5168\u5c40\u5b9e\u4f8b\ndata_loader = DataLoader()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. \u6570\u636e\u6e05\u6d17\u5185\u6838 core\/data_clean.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nimport numpy as np\nfrom utils.logger import get_logger\n\nlogger = get_logger()\n\nclass DataCleaner:\n    @staticmethod\n    def fill_missing(df, method=\"ffill\"):\n        \"\"\"\u7f3a\u5931\u503c\u586b\u5145\uff1a\u524d\u5411\/\u540e\u5411\/\u5747\u503c\u586b\u5145\"\"\"\n        if method == \"ffill\":\n            df = df.fillna(method=\"ffill\")\n        elif method == \"bfill\":\n            df = df.fillna(method=\"bfill\")\n        elif method == \"mean\":\n            df = df.fillna(df.mean())\n        return df\n\n    @staticmethod\n    def filter_abnormal_price(df, threshold=0.2):\n        \"\"\"\u8fc7\u6ee4\u5f02\u5e38\u4ef7\u683c\uff08\u5355\u65e5\u6da8\u8dcc\u5e45\u8d85\u9608\u503c\uff09\"\"\"\n        df&#91;\"pct_change\"] = df&#91;\"close\"].pct_change()\n        df = df&#91;(df&#91;\"pct_change\"] &gt; -threshold) &amp; (df&#91;\"pct_change\"] &lt; threshold)]\n        df = df.drop(columns=&#91;\"pct_change\"])\n        return df.reset_index(drop=True)\n\n    @staticmethod\n    def standardize_column(df):\n        \"\"\"\u5b57\u6bb5\u6807\u51c6\u5316\uff0c\u7edf\u4e00\u5206\u6790\u53e3\u5f84\"\"\"\n        standard_cols = &#91;\"date\", \"open\", \"high\", \"low\", \"close\", \"vol\", \"amount\"]\n        exist_cols = &#91;c for c in standard_cols if c in df.columns]\n        return df&#91;exist_cols]\n\n# \u5168\u5c40\u6e05\u6d17\u5b9e\u4f8b\ndata_cleaner = DataCleaner()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6. \u91d1\u878d\u56e0\u5b50\u5e93 factor\/finance_factor.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nimport numpy as np\n\nclass FinanceFactor:\n    @staticmethod\n    def calc_momentum(df, period=20):\n        \"\"\"\u52a8\u91cf\u56e0\u5b50\uff1aN\u65e5\u6da8\u8dcc\u5e45\"\"\"\n        df&#91;f\"momentum_{period}\"] = df&#91;\"close\"].pct_change(periods=period)\n        return df\n\n    @staticmethod\n    def calc_volatility(df, period=20):\n        \"\"\"\u6ce2\u52a8\u7387\u56e0\u5b50\"\"\"\n        df&#91;\"ret\"] = df&#91;\"close\"].pct_change()\n        df&#91;f\"vol_{period}\"] = df&#91;\"ret\"].rolling(window=period).std() * np.sqrt(250)\n        df.drop(columns=&#91;\"ret\"], inplace=True)\n        return df\n\n    @staticmethod\n    def calc_turnover(df):\n        \"\"\"\u6362\u624b\u7387\u56e0\u5b50\uff08\u7b80\u6613\uff09\"\"\"\n        df&#91;\"turnover\"] = df&#91;\"vol\"] \/ df&#91;\"vol\"].rolling(60).mean()\n        return df\n\n    @staticmethod\n    def calc_all_factors(df):\n        \"\"\"\u6279\u91cf\u8ba1\u7b97\u5e38\u7528\u56e0\u5b50\"\"\"\n        df = FinanceFactor.calc_momentum(df, 10)\n        df = FinanceFactor.calc_momentum(df, 20)\n        df = FinanceFactor.calc_volatility(df, 20)\n        df = FinanceFactor.calc_turnover(df)\n        return df\n\n# \u5168\u5c40\u56e0\u5b50\u5b9e\u4f8b\nfactor_calc = FinanceFactor()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7. \u7edf\u8ba1\u5206\u6790\u6a21\u5757 statistics\/analysis.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nimport numpy as np\nfrom scipy.stats import pearsonr\nfrom sklearn.linear_model import LinearRegression\n\nclass FinanceAnalysis:\n    @staticmethod\n    def basic_stats(df):\n        \"\"\"\u57fa\u7840\u6536\u76ca\u3001\u98ce\u9669\u7edf\u8ba1\"\"\"\n        df&#91;\"ret\"] = df&#91;\"close\"].pct_change()\n        total_ret = (df&#91;\"close\"].iloc&#91;-1] \/ df&#91;\"close\"].iloc&#91;0]) - 1\n        annual_ret = (1 + total_ret) ** (250 \/ len(df)) - 1\n        volatility = df&#91;\"ret\"].std() * np.sqrt(250)\n\n        # \u6700\u5927\u56de\u64a4\n        cum_max = df&#91;\"close\"].cummax()\n        drawdown = (df&#91;\"close\"] - cum_max) \/ cum_max\n        max_dd = drawdown.min()\n\n        return {\n            \"total_return\": round(total_ret, 4),\n            \"annual_return\": round(annual_ret, 4),\n            \"volatility\": round(volatility, 4),\n            \"max_drawdown\": round(max_dd, 4)\n        }\n\n    @staticmethod\n    def corr_analysis(df1, df2, col=\"close\"):\n        \"\"\"\u4e24\u7ec4\u6570\u636e\u76f8\u5173\u6027\u5206\u6790\"\"\"\n        s1 = df1&#91;col].pct_change().dropna()\n        s2 = df2&#91;col].pct_change().dropna()\n        # \u5bf9\u9f50\u957f\u5ea6\n        min_len = min(len(s1), len(s2))\n        s1, s2 = s1&#91;:min_len], s2&#91;:min_len]\n        corr, p_value = pearsonr(s1, s2)\n        return {\"correlation\": round(corr, 4), \"p_value\": round(p_value, 4)}\n\n    @staticmethod\n    def rolling_regression(df, x_col, y_col, window=60):\n        \"\"\"\u6eda\u52a8\u7ebf\u6027\u56de\u5f52\"\"\"\n        df = df.copy().dropna()\n        coef_list = &#91;]\n        for i in range(window, len(df)):\n            slice_df = df.iloc&#91;i-window:i]\n            X = slice_df&#91;&#91;x_col]].values\n            y = slice_df&#91;y_col].values\n            model = LinearRegression()\n            model.fit(X, y)\n            coef_list.append(model.coef_&#91;0])\n        return {\"rolling_coef\": coef_list}\n\n# \u5206\u6790\u5b9e\u4f8b\nfinance_analyst = FinanceAnalysis()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8. \u98ce\u9669\u5f02\u52a8\u544a\u8b66 risk_warn\/warning.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from config.settings import PRICE_CHANGE_WARN, NET_MONEY_WARN\nfrom utils.logger import get_logger\n\nlogger = get_logger()\n\nclass RiskWarning:\n    @staticmethod\n    def check_price_warn(df):\n        \"\"\"\u4ef7\u683c\u6da8\u8dcc\u5f02\u52a8\u544a\u8b66\"\"\"\n        if len(df) &lt; 2:\n            return False, \"\"\n        last_ret = df&#91;\"close\"].pct_change().iloc&#91;-1]\n        if abs(last_ret) &gt;= PRICE_CHANGE_WARN:\n            msg = f\"\u4ef7\u683c\u5f02\u52a8\u544a\u8b66\uff0c\u5f53\u65e5\u6da8\u8dcc\u5e45\uff1a{last_ret:.2%}\"\n            logger.warning(msg)\n            return True, msg\n        return False, \"\"\n\n    @staticmethod\n    def check_money_warn(money_df):\n        \"\"\"\u8d44\u91d1\u6d41\u5f02\u52a8\u544a\u8b66\"\"\"\n        if len(money_df) &lt; 1:\n            return False, \"\"\n        last_net = money_df&#91;\"net_amount\"].iloc&#91;-1]\n        if abs(last_net) &gt;= NET_MONEY_WARN:\n            msg = f\"\u8d44\u91d1\u5f02\u52a8\u544a\u8b66\uff0c\u5355\u65e5\u51c0\u989d\uff1a{last_net\/10000:.0f}\u4e07\u5143\"\n            logger.warning(msg)\n            return True, msg\n        return False, \"\"\n\nwarn_engine = RiskWarning()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">9. \u62a5\u8868\u751f\u6210\u6a21\u5757 report\/report_generator.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nfrom jinja2 import Environment, FileSystemLoader\nimport os\nfrom config.settings import REPORT_DIR\nfrom utils.logger import get_logger\n\nlogger = get_logger()\n\nclass ReportGenerator:\n    def __init__(self):\n        self.env = Environment(loader=FileSystemLoader(\".\/report\/template\"))\n\n    def generate_html_report(self, data, stats, title=\"\u91d1\u878d\u5206\u6790\u62a5\u544a\"):\n        \"\"\"\u751f\u6210HTML\u53ef\u89c6\u5316\u62a5\u544a\"\"\"\n        template = self.env.get_template(\"base.html\")\n        html = template.render(title=title, data=data.to_html(), stats=stats)\n        save_path = os.path.join(REPORT_DIR, f\"{title}.html\")\n        with open(save_path, \"w\", encoding=\"utf-8\") as f:\n            f.write(html)\n        logger.info(f\"HTML\u62a5\u544a\u5df2\u751f\u6210\uff1a{save_path}\")\n        return save_path\n\n    def export_excel(self, df, file_name=\"data_export\"):\n        \"\"\"\u5bfc\u51faExcel\"\"\"\n        save_path = os.path.join(REPORT_DIR, f\"{file_name}.xlsx\")\n        df.to_excel(save_path, index=False)\n        logger.info(f\"Excel\u6587\u4ef6\u5df2\u5bfc\u51fa\uff1a{save_path}\")\n        return save_path\n\nreport_engine = ReportGenerator()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">10. FastAPI \u63a5\u53e3 api\/route.py\uff08\u5bf9\u5916\u63a5\u53e3 + OpenClaw \u5bf9\u63a5\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from fastapi import FastAPI, Query\nfrom data_source.data_loader import data_loader\nfrom core.data_clean import data_cleaner\nfrom factor.finance_factor import factor_calc\nfrom statistics.analysis import finance_analyst\nfrom risk_warn.warning import warn_engine\nfrom report.report_generator import report_engine\n\napp = FastAPI(title=\"Finance \u91d1\u878d\u6570\u636e\u5206\u6790\u5e73\u53f0\")\n\n@app.get(\"\/daily_analysis\")\ndef daily_analysis(\n    code: str = Query(..., description=\"\u6807\u7684\u4ee3\u7801\"),\n    start: str = Query(\"2024-01-01\"),\n    end: str = Query(\"2026-06-01\")\n):\n    \"\"\"\u5355\u6807\u7684\u5168\u6d41\u7a0b\u5206\u6790\uff1a\u884c\u60c5+\u6e05\u6d17+\u56e0\u5b50+\u7edf\u8ba1+\u544a\u8b66\"\"\"\n    # 1. \u52a0\u8f7d\u6570\u636e\n    df = data_loader.get_daily_bar(code, start, end)\n    if df is None:\n        return {\"status\": \"fail\", \"msg\": \"\u6570\u636e\u52a0\u8f7d\u5931\u8d25\"}\n\n    # 2. \u6570\u636e\u6e05\u6d17\n    df = data_cleaner.standardize_column(df)\n    df = data_cleaner.fill_missing(df)\n    df = data_cleaner.filter_abnormal_price(df)\n\n    # 3. \u8ba1\u7b97\u56e0\u5b50\n    df = factor_calc.calc_all_factors(df)\n\n    # 4. \u7edf\u8ba1\u5206\u6790\n    stats = finance_analyst.basic_stats(df)\n\n    # 5. \u98ce\u9669\u544a\u8b66\u68c0\u6d4b\n    price_warn, price_msg = warn_engine.check_price_warn(df)\n\n    return {\n        \"status\": \"success\",\n        \"code\": code,\n        \"stats\": stats,\n        \"price_warning\": price_warn,\n        \"warn_msg\": price_msg,\n        \"data_rows\": len(df)\n    }\n\n@app.get(\"\/corr\")\ndef correlation(\n    code1: str = Query(...),\n    code2: str = Query(...),\n    start: str = Query(\"2024-01-01\"),\n    end: str = Query(\"2026-06-01\")\n):\n    \"\"\"\u4e24\u4e2a\u6807\u7684\u76f8\u5173\u6027\u5206\u6790\"\"\"\n    df1 = data_loader.get_daily_bar(code1, start, end)\n    df2 = data_loader.get_daily_bar(code2, start, end)\n    if df1 is None or df2 is None:\n        return {\"status\": \"fail\", \"msg\": \"\u6570\u636e\u7f3a\u5931\"}\n    res = finance_analyst.corr_analysis(df1, df2)\n    return {\"status\": \"success\", \"corr_result\": res}\n\n@app.get(\"\/export_report\")\ndef export_report(\n    code: str = Query(...),\n    start: str = Query(\"2024-01-01\"),\n    end: str = Query(\"2026-06-01\")\n):\n    \"\"\"\u751f\u6210\u5e76\u5bfc\u51fa\u5206\u6790\u62a5\u544a\"\"\"\n    df = data_loader.get_daily_bar(code, start, end)\n    if df is None:\n        return {\"status\": \"fail\", \"msg\": \"\u6570\u636e\u52a0\u8f7d\u5931\u8d25\"}\n    stats = finance_analyst.basic_stats(df)\n    html_path = report_engine.generate_html_report(df, stats, f\"{code}_\u5206\u6790\u62a5\u544a\")\n    excel_path = report_engine.export_excel(df, f\"{code}_\u539f\u59cb\u6570\u636e\")\n    return {\n        \"status\": \"success\",\n        \"html_report\": html_path,\n        \"excel_data\": excel_path\n    }\n\n@app.get(\"\/health\")\ndef health():\n    return {\"service\": \"Finance \u91d1\u878d\u6570\u636e\u5206\u6790\u5e73\u53f0\", \"status\": \"running\"}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">11. \u9879\u76ee\u5165\u53e3 main.py<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import uvicorn\nfrom api.route import app\nfrom config.settings import API_HOST, API_PORT\nfrom utils.logger import get_logger\n\nlogger = get_logger()\n\nif __name__ == \"__main__\":\n    logger.info(\"Finance \u91d1\u878d\u6570\u636e\u5206\u6790\u5e73\u53f0 \u542f\u52a8\u6210\u529f\")\n    uvicorn.run(app, host=API_HOST, port=API_PORT)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u516d\u3001\u7279\u8272\u6539\u9020\u843d\u5730\u8bf4\u660e<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u591a\u6e90\u6570\u636e\u878d\u5408\u6539\u9020<\/strong> \u7edf\u4e00\u5c01\u88c5\u884c\u60c5\u3001\u8d44\u91d1\u3001\u57fa\u672c\u9762\u6570\u636e\u6e90\uff0c\u81ea\u52a8\u505a\u65f6\u95f4\u5bf9\u9f50\u3001\u590d\u6743\u3001\u6e05\u6d17\uff0c\u4e00\u7ad9\u5f0f\u89e3\u51b3\u591a\u5e73\u53f0\u6570\u636e\u6574\u5408\u96be\u9898\u3002<\/li>\n\n\n\n<li><strong>\u4e13\u4e1a\u56e0\u5b50 &amp; \u7edf\u8ba1\u589e\u5f3a<\/strong> \u5728\u57fa\u7840\u6307\u6807\u4e4b\u4e0a\u6269\u5c55\u52a8\u91cf\u3001\u6ce2\u52a8\u7387\u3001\u6eda\u52a8\u56de\u5f52\u3001\u76f8\u5173\u6027\u5206\u6790\u7b49\u91cf\u5316\u5e38\u7528\u80fd\u529b\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u56e0\u5b50\u516c\u5f0f\u7f16\u8f91\u3002<\/li>\n\n\n\n<li><strong>\u591a\u7ea7\u5185\u5b58\u9002\u914d<\/strong> \u7ed3\u5408 <code>Memory Tiering<\/code> \u533a\u5206\u51b7\u70ed\u6570\u636e\uff0c\u5b9e\u65f6\u884c\u60c5\u3001\u5f53\u65e5\u56e0\u5b50\u5e38\u9a7b\u5185\u5b58\uff0c\u5386\u53f2\u5e74\u5ea6\u6570\u636e\u538b\u7f29\u4e0b\u6c89\uff0c\u63d0\u5347\u5927\u6570\u636e\u91cf\u8fd0\u7b97\u6548\u7387\u3002<\/li>\n\n\n\n<li><strong>\u5f02\u52a8\u98ce\u63a7\u4f53\u7cfb<\/strong> \u5185\u7f6e\u4ef7\u683c\u3001\u8d44\u91d1\u53cc\u7ef4\u5ea6\u544a\u8b66\uff0c\u53ef\u81ea\u5b9a\u4e49\u9608\u503c\uff0c\u5b9e\u73b0\u4ece \u201c\u4e8b\u540e\u5206\u6790\u201d \u5230 \u201c\u5b9e\u65f6\u76d1\u63a7\u201d \u5347\u7ea7\u3002<\/li>\n\n\n\n<li><strong>\u5168\u751f\u6001\u8054\u52a8\u6539\u9020<\/strong> \u9884\u7559\u6807\u51c6\u63a5\u53e3\uff0c\u53ef\u76f4\u63a5\u5c06\u5206\u6790\u56e0\u5b50\u3001\u6807\u7684\u6c60\u63a8\u9001\u81f3 <code>Backtest Expert<\/code> \u505a\u7b56\u7565\u56de\u6d4b\uff1b\u5f02\u52a8\u6807\u7684\u540c\u6b65\u81f3 <code>Stock Monitor<\/code> \u76ef\u76d8\uff1b\u5206\u6790\u62a5\u544a\u5bf9\u63a5\u89c6\u9891\u751f\u6210\u3001\u793e\u5a92\u5206\u53d1\u5de5\u5177\u3002<\/li>\n\n\n\n<li><strong>\u6a21\u677f\u5316\u62a5\u8868<\/strong> \u5c01\u88c5 HTML\/Excel \u62a5\u8868\u6a21\u677f\uff0c\u652f\u6301\u4e00\u952e\u5bfc\u51fa\u3001\u5b9a\u65f6\u751f\u6210\uff0c\u9002\u914d\u6295\u7814\u65e5\u5e38\u6c47\u62a5\u573a\u666f\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e03\u3001\u4f7f\u7528\u793a\u4f8b<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u542f\u52a8\u670d\u52a1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python main.py\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u5355\u6807\u7684\u7efc\u5408\u5206\u6790<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">plaintext<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;127.0.0.1:8100\/daily_analysis?code=600519.SH&amp;start=2024-01-01&amp;end=2026-06-01\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u6807\u7684\u76f8\u5173\u6027\u5206\u6790<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">plaintext<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;127.0.0.1:8100\/corr?code1=600519.SH&amp;code2=000858.SZ&amp;start=2024-01-01&amp;end=2026-06-01\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u5bfc\u51fa\u5206\u6790\u62a5\u544a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">plaintext<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;127.0.0.1:8100\/export_report?code=600519.SH&amp;start=2024-01-01&amp;end=2026-06-01\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u516b\u3001\u4e8c\u6b21\u5f00\u53d1\u62d3\u5c55\u65b9\u5411<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u63a5\u5165<strong>\u8d22\u62a5\u3001\u884c\u4e1a\u6307\u6570\u3001\u5b8f\u89c2\u7ecf\u6d4e\u6570\u636e<\/strong>\uff0c\u642d\u5efa\u5b8c\u6574\u57fa\u672c\u9762\u5206\u6790\u4f53\u7cfb<\/li>\n\n\n\n<li>\u5f00\u53d1<strong>\u524d\u7aef\u53ef\u89c6\u5316\u5927\u5c4f<\/strong>\uff0c\u5b9e\u73b0\u4ea4\u4e92\u5f0f K \u7ebf\u3001\u70ed\u529b\u56fe\u3001\u8d44\u91d1\u66f2\u7ebf\u5c55\u793a<\/li>\n\n\n\n<li>\u65b0\u589e<strong>\u591a\u56e0\u5b50\u6a21\u578b\u3001\u673a\u5668\u5b66\u4e60\u9009\u80a1<\/strong>\uff0c\u5f3a\u5316\u91cf\u5316\u9009\u80a1\u80fd\u529b<\/li>\n\n\n\n<li>\u5bf9\u63a5\u5b9e\u76d8\u8d26\u6237\uff0c\u5b9e\u73b0 \u201c\u5206\u6790\u2192\u9009\u80a1\u2192\u4fe1\u53f7\u63a8\u9001\u201d \u4e00\u4f53\u5316<\/li>\n\n\n\n<li>\u589e\u52a0<strong>\u677f\u5757\u8f6e\u52a8\u3001\u884c\u4e1a\u666f\u6c14\u5ea6\u5206\u6790<\/strong>\u6a21\u5757<\/li>\n\n\n\n<li>\u5b8c\u5584\u5b9a\u65f6\u4efb\u52a1\uff0c\u5b9e\u73b0\u6bcf\u65e5\u81ea\u52a8\u590d\u76d8\u3001\u6279\u91cf\u6807\u7684\u626b\u63cf\u4e0e\u544a\u8b66\u63a8\u9001<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u72ec\u7acb\u6807\u9898 &amp; \u5dee\u5f02\u5316\u5b9a\u4f4d Finance \u2014 \u5168\u5e02\u573a\u91d1\u878d\u6570\u636e\u667a\u80fd\u5206\u6790\u5e73\u53f0 | \u591a\u6e90\u6570\u636e\u878d\u5408\u30fb\u56e0\u5b50\u6316 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-301","post","type-post","status-publish","format-standard","hentry","category-mianfeiercikaifalongxiaskill"],"_links":{"self":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/comments?post=301"}],"version-history":[{"count":1,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/301\/revisions"}],"predecessor-version":[{"id":302,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/301\/revisions\/302"}],"wp:attachment":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/media?parent=301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/categories?post=301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/tags?post=301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}