{"id":5951,"date":"2025-07-22T08:03:40","date_gmt":"2025-07-22T00:03:40","guid":{"rendered":"http:\/\/192.168.1.29\/?p=5951"},"modified":"2025-07-22T17:32:55","modified_gmt":"2025-07-22T09:32:55","slug":"%e6%9a%97%e7%9b%98%e8%b5%84%e9%87%91-%e6%9a%97%e6%b5%81%e8%93%84%e5%8a%9b%e6%8c%87%e6%a0%87","status":"publish","type":"post","link":"http:\/\/cnliutz.wicp.vip\/?p=5951","title":{"rendered":"\u80a1\u7968\u6697\u76d8\u8d44\u91d1-\u6697\u6d41\u84c4\u529b\u6307\u6807\u9009\u80a1\u65b9\u6cd5"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u5411\u80a1\u6c11\u5206\u4eab\u4e86\u901a\u8fbe\u4fe1\u4e2d\u53ef\u514d\u8d39\u5b9e\u73b0\u7c7b\u4f3c\u4ed8\u8d39\u8f6f\u4ef6\u201c\u6697\u76d8\u8d44\u91d1\u201d\u529f\u80fd\u7684\u201c\u6697\u6d41\u84c4\u529b\u6307\u6807\u201d\uff0c\u5177\u4f53\u5185\u5bb9\u5982\u4e0b\uff1a\n\n### \u6838\u5fc3\u903b\u8f91\u4e0e\u6761\u4ef6\n- **\u91cf\u4ef7\u6697\u8bed**\uff1a\u6210\u4ea4\u91cf\u8fbe20\u65e5\u5747\u91cf\u76841.5-3\u500d\uff0c\u80a1\u4ef7\u5374\u4e0d\u6da8\uff0c\u4f53\u73b0\u4e3b\u529b\u538b\u4ef7\u5438\u7b79\u3002\n- **\u8d44\u91d1\u6697\u6d41**\uff1aOBV\u80fd\u91cf\u6f6e\u6307\u6807\u7a81\u78345\u65e5\u5747\u7ebf\u4e14\u6301\u7eed\u521b\u65b0\u9ad8\uff0c\u8868\u660e\u5927\u8d44\u91d1\u6d41\u5165\u3002\n- **\u6210\u672c\u63a7\u5236**\uff1a\u80a1\u4ef7\u88ab\u538b\u5236\u572820\u65e5\u5e03\u6797\u901a\u9053\u4e2d\u8f68\u9644\u8fd1\uff0c\u4e3b\u529b\u63a7\u76d8\u660e\u663e\u3002\n- **\u5176\u4ed6\u6761\u4ef6**\uff1a\u80a1\u7968\u8fde\u7eed20\u5929\u88ab60\u65e5\u5747\u7ebf\u538b\u5236\uff0c\u5236\u9020\u5f31\u52bf\u5047\u8c61\uff1b\u5f53\u65e5\u6362\u624b\u7387\u9ad8\u4e8e\u524d\u4e00\u65e5\uff0c\u9a8c\u8bc1\u8d44\u91d1\u8fdb\u573a\u3002\n\n### \u6307\u6807\u4f18\u52bf\n- **\u96f6\u6210\u672c\u9ad8\u4ef7\u503c**\uff1a\u901a\u8fbe\u4fe1\u514d\u8d39\uff0c\u4e0e\u67d0\u4ed8\u8d39\u8f6f\u4ef6\u903b\u8f91\u3001\u4fe1\u53f7\u76f8\u540c\uff0c\u53ef\u7701\u4e0a\u5343\u8d39\u7528\u3002\n- **\u65e0\u672a\u6765\u51fd\u6570**\uff1a\u6570\u636e\u4e3a\u5b9e\u65f6\u4ef7\u683c\u548c\u6210\u4ea4\u91cf\uff0c\u65e0\u6ede\u540e\u53c2\u6570\uff0c\u76d8\u4e2d\u53ef\u9a8c\u8bc1\u4fe1\u53f7\uff0c\u907f\u514d\u201c\u4fe1\u53f7\u95ea\u70c1\u201d\u3002\n- **\u64cd\u4f5c\u6781\u7b80**\uff1a\u526f\u56fe\u76f4\u63a5\u663e\u793a\u4fe1\u53f7\uff0c\u76d8\u4e2d\u9884\u8b66\u53ef\u81ea\u52a8\u8df3\u51fa\u7b26\u5408\u6761\u4ef6\u80a1\u7968\uff0c\u6bd4\u4ed8\u8d39\u8f6f\u4ef6\u9ad8\u6548\u3002\n\n### \u6a21\u578b\u4ef7\u503c\n- \u63d0\u524d\u63d0\u793a\u4e3b\u529b\u5438\u7b79\u7ed3\u675f\u3001\u80a1\u4ef7\u5c06\u6da8\u7684\u4fe1\u53f7\uff0c\u907f\u514d\u8e0f\u7a7a\u3002\n- \u901a\u8fc7\u91cf\u80fd\u3001OBV\u3001\u901a\u9053\u6307\u6807\u9a8c\u8bc1\u4e3b\u529b\u52a8\u4f5c\uff0c\u52a9\u6563\u6237\u4e0d\u88ab\u6d17\u76d8\u9707\u4e0b\u8f66\u3002\n- \u8981\u6c42\u80a1\u4ef7\u5728\u4e2d\u957f\u671f\u4f4e\u4f4d\uff0c\u907f\u5f00\u9ad8\u4f4d\u4e3b\u529b\u51fa\u8d27\u9677\u9631\uff0c\u675c\u7edd\u63a5\u76d8\u98ce\u9669\u3002\n\n### \u64cd\u4f5c\u63d0\u9192\n- \u4fe1\u53f7\u51fa\u73b0\u540e\u89c2\u5bdf1-3\u5929\uff0c\u653e\u91cf\u7a81\u783460\u65e5\u7ebf\u5219\u786e\u5b9a\u6027\u589e\u52a0\uff0c\u8dcc\u783420\u65e5\u5e03\u6797\u4e0b\u8f68\u9700\u8c28\u614e\u3002\n- \u5f3a\u8c03\u514d\u8d39\u5de5\u5177\u9700\u7ed3\u5408\u4e25\u683c\u7eaa\u5f8b\uff0c\u540c\u65f6\u63d0\u9192\u6307\u6807\u4ec5\u4e3a\u6280\u672f\u5206\u6790\u5de5\u5177\uff0c\u4e0d\u4fdd\u8bc1\u76c8\u5229\uff0c\u80a1\u5e02\u6709\u98ce\u9669\u3002\n\n\u6b64\u4ee3\u7801\u5df2\u7ecf\u5728win11+python313 \u8dd1\u901a\u4e86<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># ### \u6697\u8d44\u91d1\u9009\u80a1\u6cd5\n# ### \u8bf4\u660e\uff1a\n# 1. **\u6570\u636e\u6765\u6e90**\uff1a\u4f7f\u7528tushare\u83b7\u53d6\u80a1\u7968\u6570\u636e\uff0c\u9700\u5148\u6ce8\u518c\u5e76\u83b7\u53d6token\uff08\u514d\u8d39\u7248\u6709\u8c03\u7528\u9650\u5236\uff09\u3002\n# 2. **\u6307\u6807\u5b9e\u73b0**\uff1a\n#    - \u4e25\u683c\u6309\u7167\u6587\u4e2d\u903b\u8f91\u8ba1\u7b97\u6210\u4ea4\u91cf\u3001OBV\u3001\u5e03\u6797\u901a\u9053\u300160\u65e5\u5747\u7ebf\u538b\u5236\u3001\u6362\u624b\u7387\u7b49\u6761\u4ef6\u3002\n#    - \u90e8\u5206\u6307\u6807\u505a\u4e86\u7b80\u5316\u5904\u7406\uff08\u5982\u7528\u6210\u4ea4\u91cf\u4ee3\u66ff\u6362\u624b\u7387\uff0c\u5b9e\u9645\u53ef\u4f7f\u7528`turnover`\u5b57\u6bb5\uff09\u3002\nimport warnings\n\n# Suppress specific FutureWarning from tushare\nwarnings.filterwarnings(\"ignore\", message=\"Series.fillna with 'method' is deprecated\", category=FutureWarning, module=\"tushare.pro.data_pro\")\n\n# 3. **\u4f7f\u7528\u65b9\u6cd5**\uff1a\u66ff\u6362`tushare_token`\u540e\u8fd0\u884c\uff0c\u4f1a\u8f93\u51fa\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\u4ee3\u7801\u53ca\u65e5\u671f\u3002\n# 4. **\u98ce\u9669\u63d0\u793a**\uff1a\u6587\u4e2d\u63d0\u5230\u201c\u6307\u6807\u4ec5\u4e3a\u5206\u6790\u5de5\u5177\uff0c\u4e0d\u4fdd\u8bc1\u76c8\u5229\u201d\uff0c\u5b9e\u9645\u4f7f\u7528\u9700\u7ed3\u5408\u81ea\u8eab\u5224\u65ad\uff0c\u80a1\u5e02\u6709\u98ce\u9669\u3002\n\n# \u5982\u679c\u9700\u8981\u66f4\u7cbe\u51c6\u7684\u6307\u6807\u8ba1\u7b97\uff08\u5982\u901a\u8fbe\u4fe1\u539f\u7248\u516c\u5f0f\uff09\uff0c\u53ef\u6839\u636e\u901a\u8fbe\u4fe1\u7684\u6307\u6807\u6e90\u7801\u8fdb\u4e00\u6b65\u8c03\u6574\u53c2\u6570\u3002\nimport akshare as ak\nimport pandas as pd\nimport numpy as np\nimport datetime\n\n# \u83b7\u53d6\u5f53\u524d\u65e5\u671f\u53ca\u5386\u53f2\u65e5\u671f\ntoday = datetime.datetime.now().strftime('%Y%m%d')\nstart_date = (datetime.datetime.now() - datetime.timedelta(days=120)).strftime('%Y%m%d')\n\n# \u83b7\u53d6\u6240\u6709A\u80a1\u80a1\u7968\u4ee3\u7801\nstock_info_sh_name_code_df = ak.stock_info_sh_name_code(symbol=\"\u4e3b\u677fA\u80a1\")\nstock_info_sz_name_code_df = ak.stock_info_sz_name_code(symbol=\"A\u80a1\u5217\u8868\")\nsh_codes = stock_info_sh_name_code_df&#91;'\u8bc1\u5238\u4ee3\u7801'].apply(lambda x: f\"{x}.SH\").tolist()\nsz_codes = stock_info_sz_name_code_df&#91;'A\u80a1\u4ee3\u7801'].apply(lambda x: f\"{x}.SZ\").tolist()\nts_codes = sh_codes + sz_codes\nprint(ts_codes)\n\n# \u5b58\u50a8\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\nselected_stocks = &#91;]\n\n# \u904d\u5386\u80a1\u7968\u6c60\uff08\u53ef\u6839\u636e\u9700\u8981\u9650\u5236\u6570\u91cf\uff0c\u907f\u514d\u8bf7\u6c42\u8fc7\u591a\uff09\nfor ts_code in ts_codes&#91;:500]:  # \u6d4b\u8bd5\u65f6\u53d6\u524d500\u53ea\uff0c\u5b9e\u9645\u53ef\u53bb\u6389&#91;:500]\n    \n    try:\n        print(f\"\u6b63\u5728\u83b7\u53d6 {ts_code} \u7684\u6570\u636e...\")\n        # \u83b7\u53d6\u65e5\u7ebf\u6570\u636e\n        df = ak.stock_zh_a_hist(symbol=ts_code&#91;:-3], period=\"daily\", start_date=start_date, end_date=today, adjust=\"qfq\")\n        if df is None:\n            print(f\"{ts_code} \u6570\u636e\u83b7\u53d6\u5931\u8d25\uff0c\u8df3\u8fc7\")\n            continue\n        if len(df) &lt; 60:\n            print(f\"{ts_code} \u6570\u636e\u91cf\u4e0d\u8db3\uff0c\u8df3\u8fc7\")\n            continue\n\n        # \u6309\u65e5\u671f\u5347\u5e8f\u6392\u5217\n        df = df.sort_values('\u65e5\u671f').reset_index(drop=True)\n        df&#91;'\u65e5\u671f'] = pd.to_datetime(df&#91;'\u65e5\u671f'])\n        \n        # \u8ba1\u7b97\u6307\u6807\n        # 1. 20\u65e5\u5747\u91cf\n        df&#91;'vol_20'] = df&#91;'\u6210\u4ea4\u91cf'].rolling(window=20).mean()\n        print(f\"{ts_code} \u7684 20 \u65e5\u5747\u91cf\uff1a{df&#91;'vol_20'].tail()}\")\n        # 2. \u5f53\u65e5\u6210\u4ea4\u91cf\u662f\u5426\u4e3a20\u65e5\u5747\u91cf\u76841.5 - 3\u500d\n        df&#91;'vol_condition'] = (df&#91;'\u6210\u4ea4\u91cf'] >= 1.5 * df&#91;'vol_20']) &amp; (df&#91;'\u6210\u4ea4\u91cf'] &lt;= 3 * df&#91;'vol_20'])\n        print(f\"{ts_code} \u7684\u6210\u4ea4\u91cf\u6761\u4ef6\uff1a{df&#91;'vol_condition'].tail()}\")\n        \n        # 3. OBV\u80fd\u91cf\u6f6e\u6307\u6807\n        df&#91;'obv'] = np.where(df&#91;'\u6536\u76d8'] > df&#91;'\u6536\u76d8'].shift(1), df&#91;'\u6210\u4ea4\u91cf'], \n                           np.where(df&#91;'\u6536\u76d8'] &lt; df&#91;'\u6536\u76d8'].shift(1), -df&#91;'\u6210\u4ea4\u91cf'], 0)).cumsum()\n        df&#91;'obv_5'] = df&#91;'obv'].rolling(window=5).mean()\n        # OBV\u7a81\u78345\u65e5\u5747\u7ebf\u4e14\u521b\u65b0\u9ad8\n        df&#91;'obv_condition'] = (df&#91;'obv'] > df&#91;'obv_5']) &amp; (df&#91;'obv'] == df&#91;'obv'].rolling(window=20).max())\n        \n        # 4. 20\u65e5\u5e03\u6797\u901a\u9053\uff08\u4e2d\u8f68\u4e3a20\u65e5\u5747\u7ebf\uff0c\u4e0a\u8f68=\u4e2d\u8f68+1.5\u500d\u6807\u51c6\u5dee\uff0c\u4e0b\u8f68=\u4e2d\u8f68-1.5\u500d\u6807\u51c6\u5dee\uff09\n        df&#91;'ma20'] = df&#91;'\u6536\u76d8'].rolling(window=20).mean()\n        df&#91;'std20'] = df&#91;'\u6536\u76d8'].rolling(window=20).std()\n        df&#91;'boll_mid'] = df&#91;'ma20']\n        # \u80a1\u4ef7\u5728\u4e2d\u8f68\u9644\u8fd1\uff08\u8fd9\u91cc\u7b80\u5316\u4e3a\u4e2d\u8f68\u4e0a\u4e0b1.5\u500d\u6807\u51c6\u5dee\u8303\u56f4\u5185\uff0c\u5373\u5e03\u6797\u5e26\u5185\uff09\n        df&#91;'boll_condition'] = (df&#91;'\u6536\u76d8'] >= df&#91;'boll_mid'] - 1.5 * df&#91;'std20']) &amp; (df&#91;'\u6536\u76d8'] &lt;= df&#91;'boll_mid'] + 1.5 * df&#91;'std20'])\n        \n        # 5. \u8fde\u7eed20\u5929\u88ab60\u65e5\u5747\u7ebf\u538b\u5236\n        df&#91;'ma60'] = df&#91;'\u6536\u76d8'].rolling(window=60).mean()\n        # \u6700\u8fd120\u5929\u6536\u76d8\u4ef7\u5747\u4f4e\u4e8e60\u65e5\u5747\u7ebf\n        df&#91;'ma60_condition'] = df&#91;'\u6536\u76d8'].rolling(window=20).apply(lambda x: all(x &lt; df&#91;'ma60'].iloc&#91;-1]))\n        \n        # 6. \u5f53\u65e5\u6362\u624b\u7387\u9ad8\u4e8e\u524d\u4e00\u65e5\n        df&#91;'turnover_condition'] = df&#91;'\u6362\u624b\u7387'] > df&#91;'\u6362\u624b\u7387'].shift(1)\n        \n        # \u7b5b\u9009\u6700\u540e\u4e00\u5929\u7b26\u5408\u6240\u6709\u6761\u4ef6\u7684\u80a1\u7968\n        last_day = df.iloc&#91;-1]\n        # \u5148\u53ea\u68c0\u67e5\u90e8\u5206\u6761\u4ef6\uff0c\u4f8b\u5982\u53ea\u68c0\u67e5\u6210\u4ea4\u91cf\u6761\u4ef6\n        if last_day&#91;'vol_condition']:\n            selected_stocks.append({\n                'ts_code': ts_code,\n                'trade_date': last_day&#91;'\u65e5\u671f'].strftime('%Y-%m-%d')\n            })\n            print(f\"\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\uff1a{ts_code}\")\n    \n    except Exception as e:\n        print(f\"\u5904\u7406\u80a1\u7968{ts_code}\u65f6\u51fa\u9519\uff1a{e}\")\n\n\nprint(\"\\n\u9009\u80a1\u7ed3\u679c\uff1a\")\nresult_df = pd.DataFrame(selected_stocks)\nprint(result_df)\n\n# \u5c06\u9009\u80a1\u7ed3\u679c\u4fdd\u5b58\u4e3a CSV \u6587\u4ef6\ncsv_file_path = 'selected_stocks.csv'\nresult_df.to_csv(csv_file_path, index=False)\nprint(f\"\u9009\u80a1\u7ed3\u679c\u5df2\u4fdd\u5b58\u81f3 {csv_file_path}\")\n\n# \u5c06\u9009\u80a1\u7ed3\u679c\u4fdd\u5b58\u4e3a Excel \u6587\u4ef6\ntry:\n    import openpyxl\n    excel_file_path = 'selected_stocks.xlsx'\n    result_df.to_excel(excel_file_path, index=False)\n    print(f\"\u9009\u80a1\u7ed3\u679c\u5df2\u4fdd\u5b58\u81f3 {excel_file_path}\")\nexcept ImportError:\n    print(\"\u672a\u5b89\u88c5 openpyxl \u5e93\uff0c\u65e0\u6cd5\u4fdd\u5b58\u4e3a Excel \u6587\u4ef6\u3002\u8bf7\u4f7f\u7528 'pip install openpyxl' \u8fdb\u884c\u5b89\u88c5\u3002\")\n\n\n<\/code><\/pre>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex\">\n<p><\/p>\n\n\n\n<p>\u9009\u80a1\u7ed3\u679c\uff1a<br>      ts_code  trade_date<br>0   600025.SH  2025-07-22<br>1   600037.SH  2025-07-22<br>2   600039.SH  2025-07-22<br>3   600080.SH  2025-07-22<br>4   600169.SH  2025-07-22<br>5   600172.SH  2025-07-22<br>6   600221.SH  2025-07-22<br>7   600248.SH  2025-07-22<br>8   600283.SH  2025-07-22<br>9   600288.SH  2025-07-22<br>10  600309.SH  2025-07-22<br>11  600312.SH  2025-07-22<br>12  600346.SH  2025-07-22<\/p>\n\n\n\n<p>13  600380.SH  2025-07-22<br>14  600392.SH  2025-07-22<br>15  600406.SH  2025-07-22<br>16  600436.SH  2025-07-22<br>17  600449.SH  2025-07-22<br>18  600515.SH  2025-07-22<br>19  600537.SH  2025-07-22<br>20  600539.SH  2025-07-22<br>21  600549.SH  2025-07-22<br>22  600580.SH  2025-07-22<br>23  600587.SH  2025-07-22<br>24  600593.SH  2025-07-21<br>25  600596.SH  2025-07-22<br>26  600611.SH  2025-07-22<br>27  600620.SH  2025-07-22<br>28  600637.SH  2025-07-22<\/p>\n<\/div>\n\n\n\n<p><strong>\u4ee5\u4e0b\u4ee3\u7801\u6536\u5230\u8bbf\u95ee\u6b21\u6570\u9650\u5236<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># ### \u6697\u8d44\u91d1\u9009\u80a1\u6cd5\n# ### \u8bf4\u660e\uff1a\n# 1. **\u6570\u636e\u6765\u6e90**\uff1a\u4f7f\u7528tushare\u83b7\u53d6\u80a1\u7968\u6570\u636e\uff0c\u9700\u5148\u6ce8\u518c\u5e76\u83b7\u53d6token\uff08\u514d\u8d39\u7248\u6709\u8c03\u7528\u9650\u5236\uff09\u3002\n# 2. **\u6307\u6807\u5b9e\u73b0**\uff1a\n#    - \u4e25\u683c\u6309\u7167\u6587\u4e2d\u903b\u8f91\u8ba1\u7b97\u6210\u4ea4\u91cf\u3001OBV\u3001\u5e03\u6797\u901a\u9053\u300160\u65e5\u5747\u7ebf\u538b\u5236\u3001\u6362\u624b\u7387\u7b49\u6761\u4ef6\u3002\n#    - \u90e8\u5206\u6307\u6807\u505a\u4e86\u7b80\u5316\u5904\u7406\uff08\u5982\u7528\u6210\u4ea4\u91cf\u4ee3\u66ff\u6362\u624b\u7387\uff0c\u5b9e\u9645\u53ef\u4f7f\u7528`turnover`\u5b57\u6bb5\uff09\u3002\n# 3. **\u4f7f\u7528\u65b9\u6cd5**\uff1a\u66ff\u6362`tushare_token`\u540e\u8fd0\u884c\uff0c\u4f1a\u8f93\u51fa\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\u4ee3\u7801\u53ca\u65e5\u671f\u3002\n# 4. **\u98ce\u9669\u63d0\u793a**\uff1a\u6587\u4e2d\u63d0\u5230\u201c\u6307\u6807\u4ec5\u4e3a\u5206\u6790\u5de5\u5177\uff0c\u4e0d\u4fdd\u8bc1\u76c8\u5229\u201d\uff0c\u5b9e\u9645\u4f7f\u7528\u9700\u7ed3\u5408\u81ea\u8eab\u5224\u65ad\uff0c\u80a1\u5e02\u6709\u98ce\u9669\u3002\n\n# \u5982\u679c\u9700\u8981\u66f4\u7cbe\u51c6\u7684\u6307\u6807\u8ba1\u7b97\uff08\u5982\u901a\u8fbe\u4fe1\u539f\u7248\u516c\u5f0f\uff09\uff0c\u53ef\u6839\u636e\u901a\u8fbe\u4fe1\u7684\u6307\u6807\u6e90\u7801\u8fdb\u4e00\u6b65\u8c03\u6574\u53c2\u6570\u3002\nimport tushare as ts\nimport pandas as pd\nimport numpy as np\nimport datetime\n\n# \u8bbe\u7f6etushare token\uff08\u9700\u66ff\u6362\u4e3a\u81ea\u5df1\u7684token\uff09\nts.set_token('\u4f60\u7684tushare_token')\npro = ts.pro_api()\n\n# \u83b7\u53d6\u5f53\u524d\u65e5\u671f\u53ca\u5386\u53f2\u65e5\u671f\ntoday = datetime.datetime.now().strftime('%Y%m%d')\n# \u8ba1\u7b9760\u5929\u524d\u7684\u65e5\u671f\uff08\u7528\u4e8e\u83b7\u53d6\u8db3\u591f\u6570\u636e\uff09\nstart_date = (datetime.datetime.now() - datetime.timedelta(days=120)).strftime('%Y%m%d')\n\n# \u83b7\u53d6\u6240\u6709A\u80a1\u80a1\u7968\u4ee3\u7801\nstock_basic = pro.stock_basic(exchange='', list_status='L', fields='ts_code')\nts_codes = stock_basic&#91;'ts_code'].tolist()\n\n# \u5b58\u50a8\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\nselected_stocks = &#91;]\n\n# \u904d\u5386\u80a1\u7968\u6c60\uff08\u53ef\u6839\u636e\u9700\u8981\u9650\u5236\u6570\u91cf\uff0c\u907f\u514d\u8bf7\u6c42\u8fc7\u591a\uff09\nfor ts_code in ts_codes&#91;:500]:  # \u6d4b\u8bd5\u65f6\u53d6\u524d500\u53ea\uff0c\u5b9e\u9645\u53ef\u53bb\u6389&#91;:500]\n    try:\n        # \u83b7\u53d6\u65e5\u7ebf\u6570\u636e\n        df = ts.pro_bar(ts_code=ts_code, adj='qfq', start_date=start_date, end_date=today)\n        if df is None or len(df) &lt; 60:\n            continue  # \u6570\u636e\u4e0d\u8db3\u8df3\u8fc7\n        \n        # \u6309\u65e5\u671f\u5347\u5e8f\u6392\u5217\n        df = df.sort_values('trade_date').reset_index(drop=True)\n        df&#91;'trade_date'] = pd.to_datetime(df&#91;'trade_date'])\n        \n        # \u8ba1\u7b97\u6307\u6807\n        # 1. 20\u65e5\u5747\u91cf\n        df&#91;'vol_20'] = df&#91;'vol'].rolling(window=20).mean()\n        # 2. \u5f53\u65e5\u6210\u4ea4\u91cf\u662f\u5426\u4e3a20\u65e5\u5747\u91cf\u76841.5-3\u500d\n        df&#91;'vol_condition'] = (df&#91;'vol'] &gt;= 1.5 * df&#91;'vol_20']) &amp; (df&#91;'vol'] &lt;= 3 * df&#91;'vol_20'])\n        \n        # 3. OBV\u80fd\u91cf\u6f6e\u6307\u6807\n        df&#91;'obv'] = np.where(df&#91;'close'] &gt; df&#91;'close'].shift(1), df&#91;'vol'], \n                           np.where(df&#91;'close'] &lt; df&#91;'close'].shift(1), -df&#91;'vol'], 0)).cumsum()\n        df&#91;'obv_5'] = df&#91;'obv'].rolling(window=5).mean()\n        # OBV\u7a81\u78345\u65e5\u5747\u7ebf\u4e14\u521b\u65b0\u9ad8\n        df&#91;'obv_condition'] = (df&#91;'obv'] &gt; df&#91;'obv_5']) &amp; (df&#91;'obv'] == df&#91;'obv'].rolling(window=20).max())\n        \n        # 4. 20\u65e5\u5e03\u6797\u901a\u9053\uff08\u4e2d\u8f68\u4e3a20\u65e5\u5747\u7ebf\uff0c\u4e0a\u8f68=\u4e2d\u8f68+1.5\u500d\u6807\u51c6\u5dee\uff0c\u4e0b\u8f68=\u4e2d\u8f68-1.5\u500d\u6807\u51c6\u5dee\uff09\n        df&#91;'ma20'] = df&#91;'close'].rolling(window=20).mean()\n        df&#91;'std20'] = df&#91;'close'].rolling(window=20).std()\n        df&#91;'boll_mid'] = df&#91;'ma20']\n        # \u80a1\u4ef7\u5728\u4e2d\u8f68\u9644\u8fd1\uff08\u8fd9\u91cc\u7b80\u5316\u4e3a\u4e2d\u8f68\u4e0a\u4e0b1.5\u500d\u6807\u51c6\u5dee\u8303\u56f4\u5185\uff0c\u5373\u5e03\u6797\u5e26\u5185\uff09\n        df&#91;'boll_condition'] = (df&#91;'close'] &gt;= df&#91;'boll_mid'] - 1.5 * df&#91;'std20']) &amp; (df&#91;'close'] &lt;= df&#91;'boll_mid'] + 1.5 * df&#91;'std20'])\n        \n        # 5. \u8fde\u7eed20\u5929\u88ab60\u65e5\u5747\u7ebf\u538b\u5236\n        df&#91;'ma60'] = df&#91;'close'].rolling(window=60).mean()\n        # \u6700\u8fd120\u5929\u6536\u76d8\u4ef7\u5747\u4f4e\u4e8e60\u65e5\u5747\u7ebf\n        df&#91;'ma60_condition'] = df&#91;'close'].rolling(window=20).apply(lambda x: all(x &lt; df&#91;'ma60'].iloc&#91;-1]))\n        \n        # 6. \u5f53\u65e5\u6362\u624b\u7387\u9ad8\u4e8e\u524d\u4e00\u65e5\uff08\u4f7f\u7528vol\u4ee3\u66ff\u6362\u624b\u7387\u7b80\u5316\uff0c\u5b9e\u9645\u53ef\u7528turnover\u5b57\u6bb5\uff09\n        df&#91;'turnover_condition'] = df&#91;'vol'] &gt; df&#91;'vol'].shift(1)\n        \n        # \u7b5b\u9009\u6700\u540e\u4e00\u5929\u7b26\u5408\u6240\u6709\u6761\u4ef6\u7684\u80a1\u7968\n        last_day = df.iloc&#91;-1]\n        if (last_day&#91;'vol_condition'] \n            and last_day&#91;'obv_condition'] \n            and last_day&#91;'boll_condition'] \n            and last_day&#91;'ma60_condition'] \n            and last_day&#91;'turnover_condition']):\n            selected_stocks.append({\n                'ts_code': ts_code,\n                'trade_date': last_day&#91;'trade_date'].strftime('%Y-%m-%d')\n            })\n            print(f\"\u7b26\u5408\u6761\u4ef6\u7684\u80a1\u7968\uff1a{ts_code}\")\n    \n    except Exception as e:\n        print(f\"\u5904\u7406\u80a1\u7968{ts_code}\u65f6\u51fa\u9519\uff1a{e}\")\n\nprint(\"\\n\u9009\u80a1\u7ed3\u679c\uff1a\")\nprint(pd.DataFrame(selected_stocks))\n\n\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9009\u80a1\u7ed3\u679c\uff1a ts_code trade_date0 600025.SH 2025 <span class=\"readmore\"><a href=\"http:\/\/cnliutz.wicp.vip\/?p=5951\">Continue Reading<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-5951","post","type-post","status-publish","format-standard","hentry","category-24"],"_links":{"self":[{"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/posts\/5951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5951"}],"version-history":[{"count":5,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/posts\/5951\/revisions"}],"predecessor-version":[{"id":5964,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=\/wp\/v2\/posts\/5951\/revisions\/5964"}],"wp:attachment":[{"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5951"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/cnliutz.wicp.vip\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}