尝试构建回测模块
This commit is contained in:
@@ -3,28 +3,28 @@
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2025-02-10T14:37:48.747081Z",
|
||||
"start_time": "2025-02-10T14:37:48.743083Z"
|
||||
"end_time": "2025-02-11T02:51:57.789440Z",
|
||||
"start_time": "2025-02-11T02:51:57.208223Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": "import pandas as pd",
|
||||
"id": "6a10e07f5f498bc6",
|
||||
"outputs": [],
|
||||
"execution_count": 27
|
||||
"execution_count": 1
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2025-02-10T14:54:43.071056Z",
|
||||
"start_time": "2025-02-10T14:54:43.027108Z"
|
||||
"end_time": "2025-02-11T03:14:30.972240Z",
|
||||
"start_time": "2025-02-11T03:14:30.857326Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/Documents/日线行情/000001.SZ.csv\") \\\n",
|
||||
"source_df = \\\n",
|
||||
" pd.read_csv(\"C:\\\\Users\\\\lanyuanxiaoyao\\\\SynologyDrive\\\\data\\\\Tushare\\\\日线行情 1990-2024\\\\分组行情\\\\000001.SZ.csv\") \\\n",
|
||||
"# source_df = \\\n",
|
||||
"# pd.read_csv(\"C:\\\\Users\\\\lanyuanxiaoyao\\\\SynologyDrive\\\\data\\\\Tushare\\\\日线行情 1990-2024\\\\分组行情\\\\000001.SZ.csv\") \\\n",
|
||||
"source_df = pd.read_csv(\"/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare/日线行情 1990-2024/分组行情/600519.SH.csv\") \\\n",
|
||||
" [[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\", \"macd\", \"macd_dif\", \"macd_dea\"]]\n",
|
||||
"df = pd.DataFrame()\n",
|
||||
"df[[\"date\", \"volume\", \"open\", \"close\", \"high\", \"low\", \"macd\", \"macd_dif\", \"macd_dea\"]] = \\\n",
|
||||
@@ -39,33 +39,33 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
" date volume open close high low macd \\\n",
|
||||
"0 19910404 3.00 0.38158 0.38158 0.38158 0.38158 0.000 \n",
|
||||
"1 19910405 2.00 0.37970 0.37970 0.37970 0.37970 0.000 \n",
|
||||
"2 19910408 2.00 0.37595 0.37595 0.37595 0.37595 -0.001 \n",
|
||||
"3 19910409 4.00 0.37407 0.37407 0.37407 0.37407 -0.001 \n",
|
||||
"4 19910410 15.00 0.37219 0.37219 0.37219 0.37219 -0.002 \n",
|
||||
"... ... ... ... ... ... ... ... \n",
|
||||
"3813 20241225 1475282.94 11.86000 11.92000 12.02000 11.84000 0.050 \n",
|
||||
"3814 20241226 1000074.70 11.92000 11.86000 11.93000 11.78000 0.051 \n",
|
||||
"3815 20241227 1290012.28 11.87000 11.83000 11.90000 11.66000 0.044 \n",
|
||||
"3816 20241230 1351846.36 11.78000 11.95000 11.97000 11.78000 0.052 \n",
|
||||
"3817 20241231 1475367.33 11.93000 11.70000 11.99000 11.70000 0.020 \n",
|
||||
" date volume open close high low \\\n",
|
||||
"2187 20010827 406318.00 4.23675 4.36443 4.63820 4.03295 \n",
|
||||
"2188 20010828 129647.79 4.29568 4.52525 4.54244 4.24902 \n",
|
||||
"2189 20010829 53252.75 4.53999 4.46632 4.54244 4.43195 \n",
|
||||
"2190 20010830 48013.06 4.45405 4.55472 4.60505 4.41967 \n",
|
||||
"2191 20010831 23231.48 4.56086 4.54367 4.61856 4.51789 \n",
|
||||
"... ... ... ... ... ... ... \n",
|
||||
"2182 20241225 17123.39 1538.80000 1530.00000 1538.80000 1526.10000 \n",
|
||||
"2183 20241226 18286.51 1534.00000 1527.79000 1538.78000 1523.00000 \n",
|
||||
"2184 20241227 20759.32 1528.90000 1528.97000 1536.00000 1519.50000 \n",
|
||||
"2185 20241230 25129.82 1533.97000 1525.00000 1543.96000 1525.00000 \n",
|
||||
"2186 20241231 39354.45 1525.40000 1524.00000 1545.00000 1522.01000 \n",
|
||||
"\n",
|
||||
" macd_dif macd_dea datetime datetime_text \n",
|
||||
"0 0.000 0.000 1991-04-04 19910404 \n",
|
||||
"1 0.000 0.000 1991-04-05 19910405 \n",
|
||||
"2 -0.001 0.000 1991-04-08 19910408 \n",
|
||||
"3 -0.001 0.000 1991-04-09 19910409 \n",
|
||||
"4 -0.002 -0.001 1991-04-10 19910410 \n",
|
||||
"... ... ... ... ... \n",
|
||||
"3813 0.080 0.055 2024-12-25 20241225 \n",
|
||||
"3814 0.087 0.062 2024-12-26 20241226 \n",
|
||||
"3815 0.089 0.067 2024-12-27 20241227 \n",
|
||||
"3816 0.100 0.074 2024-12-30 20241230 \n",
|
||||
"3817 0.086 0.076 2024-12-31 20241231 \n",
|
||||
" macd macd_dif macd_dea datetime datetime_text \n",
|
||||
"2187 0.000 0.000 0.000 2001-08-27 20010827 \n",
|
||||
"2188 0.021 0.013 0.003 2001-08-28 20010828 \n",
|
||||
"2189 0.025 0.018 0.006 2001-08-29 20010829 \n",
|
||||
"2190 0.037 0.029 0.010 2001-08-30 20010830 \n",
|
||||
"2191 0.042 0.036 0.016 2001-08-31 20010831 \n",
|
||||
"... ... ... ... ... ... \n",
|
||||
"2182 5.430 5.063 2.348 2024-12-25 20241225 \n",
|
||||
"2183 4.192 4.968 2.872 2024-12-26 20241226 \n",
|
||||
"2184 3.295 4.931 3.283 2024-12-27 20241227 \n",
|
||||
"2185 1.993 4.529 3.533 2024-12-30 20241230 \n",
|
||||
"2186 0.880 4.083 3.643 2024-12-31 20241231 \n",
|
||||
"\n",
|
||||
"[8022 rows x 11 columns]"
|
||||
"[5591 rows x 11 columns]"
|
||||
],
|
||||
"text/html": [
|
||||
"<div>\n",
|
||||
@@ -101,74 +101,74 @@
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>19910404</td>\n",
|
||||
" <td>3.00</td>\n",
|
||||
" <td>0.38158</td>\n",
|
||||
" <td>0.38158</td>\n",
|
||||
" <td>0.38158</td>\n",
|
||||
" <td>0.38158</td>\n",
|
||||
" <th>2187</th>\n",
|
||||
" <td>20010827</td>\n",
|
||||
" <td>406318.00</td>\n",
|
||||
" <td>4.23675</td>\n",
|
||||
" <td>4.36443</td>\n",
|
||||
" <td>4.63820</td>\n",
|
||||
" <td>4.03295</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>1991-04-04</td>\n",
|
||||
" <td>19910404</td>\n",
|
||||
" <td>2001-08-27</td>\n",
|
||||
" <td>20010827</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>19910405</td>\n",
|
||||
" <td>2.00</td>\n",
|
||||
" <td>0.37970</td>\n",
|
||||
" <td>0.37970</td>\n",
|
||||
" <td>0.37970</td>\n",
|
||||
" <td>0.37970</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>1991-04-05</td>\n",
|
||||
" <td>19910405</td>\n",
|
||||
" <th>2188</th>\n",
|
||||
" <td>20010828</td>\n",
|
||||
" <td>129647.79</td>\n",
|
||||
" <td>4.29568</td>\n",
|
||||
" <td>4.52525</td>\n",
|
||||
" <td>4.54244</td>\n",
|
||||
" <td>4.24902</td>\n",
|
||||
" <td>0.021</td>\n",
|
||||
" <td>0.013</td>\n",
|
||||
" <td>0.003</td>\n",
|
||||
" <td>2001-08-28</td>\n",
|
||||
" <td>20010828</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>19910408</td>\n",
|
||||
" <td>2.00</td>\n",
|
||||
" <td>0.37595</td>\n",
|
||||
" <td>0.37595</td>\n",
|
||||
" <td>0.37595</td>\n",
|
||||
" <td>0.37595</td>\n",
|
||||
" <td>-0.001</td>\n",
|
||||
" <td>-0.001</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>1991-04-08</td>\n",
|
||||
" <td>19910408</td>\n",
|
||||
" <th>2189</th>\n",
|
||||
" <td>20010829</td>\n",
|
||||
" <td>53252.75</td>\n",
|
||||
" <td>4.53999</td>\n",
|
||||
" <td>4.46632</td>\n",
|
||||
" <td>4.54244</td>\n",
|
||||
" <td>4.43195</td>\n",
|
||||
" <td>0.025</td>\n",
|
||||
" <td>0.018</td>\n",
|
||||
" <td>0.006</td>\n",
|
||||
" <td>2001-08-29</td>\n",
|
||||
" <td>20010829</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>19910409</td>\n",
|
||||
" <td>4.00</td>\n",
|
||||
" <td>0.37407</td>\n",
|
||||
" <td>0.37407</td>\n",
|
||||
" <td>0.37407</td>\n",
|
||||
" <td>0.37407</td>\n",
|
||||
" <td>-0.001</td>\n",
|
||||
" <td>-0.001</td>\n",
|
||||
" <td>0.000</td>\n",
|
||||
" <td>1991-04-09</td>\n",
|
||||
" <td>19910409</td>\n",
|
||||
" <th>2190</th>\n",
|
||||
" <td>20010830</td>\n",
|
||||
" <td>48013.06</td>\n",
|
||||
" <td>4.45405</td>\n",
|
||||
" <td>4.55472</td>\n",
|
||||
" <td>4.60505</td>\n",
|
||||
" <td>4.41967</td>\n",
|
||||
" <td>0.037</td>\n",
|
||||
" <td>0.029</td>\n",
|
||||
" <td>0.010</td>\n",
|
||||
" <td>2001-08-30</td>\n",
|
||||
" <td>20010830</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>19910410</td>\n",
|
||||
" <td>15.00</td>\n",
|
||||
" <td>0.37219</td>\n",
|
||||
" <td>0.37219</td>\n",
|
||||
" <td>0.37219</td>\n",
|
||||
" <td>0.37219</td>\n",
|
||||
" <td>-0.002</td>\n",
|
||||
" <td>-0.002</td>\n",
|
||||
" <td>-0.001</td>\n",
|
||||
" <td>1991-04-10</td>\n",
|
||||
" <td>19910410</td>\n",
|
||||
" <th>2191</th>\n",
|
||||
" <td>20010831</td>\n",
|
||||
" <td>23231.48</td>\n",
|
||||
" <td>4.56086</td>\n",
|
||||
" <td>4.54367</td>\n",
|
||||
" <td>4.61856</td>\n",
|
||||
" <td>4.51789</td>\n",
|
||||
" <td>0.042</td>\n",
|
||||
" <td>0.036</td>\n",
|
||||
" <td>0.016</td>\n",
|
||||
" <td>2001-08-31</td>\n",
|
||||
" <td>20010831</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>...</th>\n",
|
||||
@@ -185,87 +185,87 @@
|
||||
" <td>...</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3813</th>\n",
|
||||
" <th>2182</th>\n",
|
||||
" <td>20241225</td>\n",
|
||||
" <td>1475282.94</td>\n",
|
||||
" <td>11.86000</td>\n",
|
||||
" <td>11.92000</td>\n",
|
||||
" <td>12.02000</td>\n",
|
||||
" <td>11.84000</td>\n",
|
||||
" <td>0.050</td>\n",
|
||||
" <td>0.080</td>\n",
|
||||
" <td>0.055</td>\n",
|
||||
" <td>17123.39</td>\n",
|
||||
" <td>1538.80000</td>\n",
|
||||
" <td>1530.00000</td>\n",
|
||||
" <td>1538.80000</td>\n",
|
||||
" <td>1526.10000</td>\n",
|
||||
" <td>5.430</td>\n",
|
||||
" <td>5.063</td>\n",
|
||||
" <td>2.348</td>\n",
|
||||
" <td>2024-12-25</td>\n",
|
||||
" <td>20241225</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3814</th>\n",
|
||||
" <th>2183</th>\n",
|
||||
" <td>20241226</td>\n",
|
||||
" <td>1000074.70</td>\n",
|
||||
" <td>11.92000</td>\n",
|
||||
" <td>11.86000</td>\n",
|
||||
" <td>11.93000</td>\n",
|
||||
" <td>11.78000</td>\n",
|
||||
" <td>0.051</td>\n",
|
||||
" <td>0.087</td>\n",
|
||||
" <td>0.062</td>\n",
|
||||
" <td>18286.51</td>\n",
|
||||
" <td>1534.00000</td>\n",
|
||||
" <td>1527.79000</td>\n",
|
||||
" <td>1538.78000</td>\n",
|
||||
" <td>1523.00000</td>\n",
|
||||
" <td>4.192</td>\n",
|
||||
" <td>4.968</td>\n",
|
||||
" <td>2.872</td>\n",
|
||||
" <td>2024-12-26</td>\n",
|
||||
" <td>20241226</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3815</th>\n",
|
||||
" <th>2184</th>\n",
|
||||
" <td>20241227</td>\n",
|
||||
" <td>1290012.28</td>\n",
|
||||
" <td>11.87000</td>\n",
|
||||
" <td>11.83000</td>\n",
|
||||
" <td>11.90000</td>\n",
|
||||
" <td>11.66000</td>\n",
|
||||
" <td>0.044</td>\n",
|
||||
" <td>0.089</td>\n",
|
||||
" <td>0.067</td>\n",
|
||||
" <td>20759.32</td>\n",
|
||||
" <td>1528.90000</td>\n",
|
||||
" <td>1528.97000</td>\n",
|
||||
" <td>1536.00000</td>\n",
|
||||
" <td>1519.50000</td>\n",
|
||||
" <td>3.295</td>\n",
|
||||
" <td>4.931</td>\n",
|
||||
" <td>3.283</td>\n",
|
||||
" <td>2024-12-27</td>\n",
|
||||
" <td>20241227</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3816</th>\n",
|
||||
" <th>2185</th>\n",
|
||||
" <td>20241230</td>\n",
|
||||
" <td>1351846.36</td>\n",
|
||||
" <td>11.78000</td>\n",
|
||||
" <td>11.95000</td>\n",
|
||||
" <td>11.97000</td>\n",
|
||||
" <td>11.78000</td>\n",
|
||||
" <td>0.052</td>\n",
|
||||
" <td>0.100</td>\n",
|
||||
" <td>0.074</td>\n",
|
||||
" <td>25129.82</td>\n",
|
||||
" <td>1533.97000</td>\n",
|
||||
" <td>1525.00000</td>\n",
|
||||
" <td>1543.96000</td>\n",
|
||||
" <td>1525.00000</td>\n",
|
||||
" <td>1.993</td>\n",
|
||||
" <td>4.529</td>\n",
|
||||
" <td>3.533</td>\n",
|
||||
" <td>2024-12-30</td>\n",
|
||||
" <td>20241230</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3817</th>\n",
|
||||
" <th>2186</th>\n",
|
||||
" <td>20241231</td>\n",
|
||||
" <td>1475367.33</td>\n",
|
||||
" <td>11.93000</td>\n",
|
||||
" <td>11.70000</td>\n",
|
||||
" <td>11.99000</td>\n",
|
||||
" <td>11.70000</td>\n",
|
||||
" <td>0.020</td>\n",
|
||||
" <td>0.086</td>\n",
|
||||
" <td>0.076</td>\n",
|
||||
" <td>39354.45</td>\n",
|
||||
" <td>1525.40000</td>\n",
|
||||
" <td>1524.00000</td>\n",
|
||||
" <td>1545.00000</td>\n",
|
||||
" <td>1522.01000</td>\n",
|
||||
" <td>0.880</td>\n",
|
||||
" <td>4.083</td>\n",
|
||||
" <td>3.643</td>\n",
|
||||
" <td>2024-12-31</td>\n",
|
||||
" <td>20241231</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"<p>8022 rows × 11 columns</p>\n",
|
||||
"<p>5591 rows × 11 columns</p>\n",
|
||||
"</div>"
|
||||
]
|
||||
},
|
||||
"execution_count": 35,
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"execution_count": 35
|
||||
"execution_count": 9
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
@@ -923,13 +923,15 @@
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"daily_df = df.copy()[[\"datetime\", \"volume\", \"open\", \"close\", \"high\", \"low\"]]\n",
|
||||
"monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='ME')).agg({\n",
|
||||
" \"volume\": \"sum\",\n",
|
||||
" \"open\": \"first\",\n",
|
||||
" \"close\": \"last\",\n",
|
||||
" \"high\": \"max\",\n",
|
||||
" \"low\": \"min\",\n",
|
||||
"})\n",
|
||||
"monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='ME')).agg(\n",
|
||||
" {\n",
|
||||
" \"volume\": \"sum\",\n",
|
||||
" \"open\": \"first\",\n",
|
||||
" \"close\": \"last\",\n",
|
||||
" \"high\": \"max\",\n",
|
||||
" \"low\": \"min\",\n",
|
||||
" }\n",
|
||||
")\n",
|
||||
"monthly_df.reset_index(inplace=True)\n",
|
||||
"monthly_df.set_index('datetime', inplace=True)\n",
|
||||
"monthly_df"
|
||||
@@ -1152,6 +1154,217 @@
|
||||
"2.在上述筛选出的月份中,找出那些该月份的前一个月的MACD值小于0的月份"
|
||||
],
|
||||
"id": "8a98fd3bbe6cfffb"
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2025-02-11T03:14:36.513645Z",
|
||||
"start_time": "2025-02-11T03:14:36.474163Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"daily_df = df.copy()\n",
|
||||
"import pandas as pd\n",
|
||||
"import talib\n",
|
||||
"import numpy as np\n",
|
||||
"from scipy.signal import argrelextrema\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 假设daily_df已经导入,列名为datetime, open, close, high, low\n",
|
||||
"# 代码中会直接使用daily_df\n",
|
||||
"\n",
|
||||
"# 步骤1: 计算月线行情和月线的MACD\n",
|
||||
"# 首先需要将日线行情转换为月线行情\n",
|
||||
"def calculate_monthly_data(daily_df):\n",
|
||||
" \"\"\"\n",
|
||||
" 将日线行情转换为月线行情\n",
|
||||
" datetime: 转换为日期的月初\n",
|
||||
" open: 每个月的第一个交易日的开盘价\n",
|
||||
" close: 每个月的最后一个交易日的收盘价\n",
|
||||
" high: 每个月的最高价\n",
|
||||
" low: 每个月的最低价\n",
|
||||
" \"\"\"\n",
|
||||
" # 将datetime列转换为日期格式\n",
|
||||
" daily_df['datetime'] = pd.to_datetime(daily_df['datetime'])\n",
|
||||
"\n",
|
||||
" # 按月份分组\n",
|
||||
" monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='M')).agg(\n",
|
||||
" {\n",
|
||||
" 'open': 'first',\n",
|
||||
" 'close': 'last',\n",
|
||||
" 'high': 'max',\n",
|
||||
" 'low': 'min'\n",
|
||||
" }\n",
|
||||
" )\n",
|
||||
" return monthly_df\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 计算月线的MACD指标\n",
|
||||
"def calculate_monthly_macd(monthly_df):\n",
|
||||
" \"\"\"\n",
|
||||
" 计算月线的MACD指标,包括DIF, DEA和MACD柱状图值\n",
|
||||
" \"\"\"\n",
|
||||
" # 获取收盘价序列\n",
|
||||
" close_prices = monthly_df['close'].values\n",
|
||||
"\n",
|
||||
" # 计算MACD\n",
|
||||
" dif, dea, hist = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)\n",
|
||||
"\n",
|
||||
" # 将结果添加到数据框\n",
|
||||
" monthly_df['DIF'] = dif\n",
|
||||
" monthly_df['DEA'] = dea\n",
|
||||
" monthly_df['MACD'] = hist\n",
|
||||
"\n",
|
||||
" return monthly_df\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 筛选出符合条件的月份\n",
|
||||
"def filter_monthly_macd(monthly_df):\n",
|
||||
" \"\"\"\n",
|
||||
" 筛选出满足条件的月份:\n",
|
||||
" DIF和DEA均在0轴上方,且MACD值大于0并且小于DIF和DEA\n",
|
||||
" \"\"\"\n",
|
||||
" # 定义筛选条件\n",
|
||||
" condition = (monthly_df['DIF'] > 0) & \\\n",
|
||||
" (monthly_df['DEA'] > 0) & \\\n",
|
||||
" (monthly_df['MACD'] > 0) & \\\n",
|
||||
" (monthly_df['MACD'] < monthly_df['DIF']) & \\\n",
|
||||
" (monthly_df['MACD'] < monthly_df['DEA'])\n",
|
||||
"\n",
|
||||
" # 筛选符合条件的月份\n",
|
||||
" filtered_months = monthly_df[condition]\n",
|
||||
" return filtered_months\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 步骤2: 进一步筛选符合条件的月份\n",
|
||||
"def further_filter_months(filtered_months, monthly_df):\n",
|
||||
" \"\"\"\n",
|
||||
" 在步骤1筛选出的月份中,进一步筛选:\n",
|
||||
" 1. 该月份的前一个月的MACD值小于0\n",
|
||||
" 2. 该月份前几个月MACD值经历了从下降(至少连续下降超过2个月)再回升的第一个月\n",
|
||||
" \"\"\"\n",
|
||||
" # 合并所有月份的数据\n",
|
||||
" merged_df = monthly_df.merge(\n",
|
||||
" filtered_months[['DIF', 'DEA', 'MACD']],\n",
|
||||
" left_index=True, right_index=True,\n",
|
||||
" how='left', suffixes=('', '_filtered')\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" # 条件1: 前一个月的MACD值小于0\n",
|
||||
" condition1 = merged_df['MACD_filtered'].shift(1) < 0\n",
|
||||
"\n",
|
||||
" # 条件2: 前几个月MACD经历了从下降超过2个月再回升的第一个月\n",
|
||||
" # 使用rolling窗口检查是否连续下降超过2个月,然后回升\n",
|
||||
" # 创建一个标志,表示是否处于连续下降状态\n",
|
||||
" merged_df['macd_diff'] = merged_df['MACD_filtered'].diff()\n",
|
||||
" merged_df['descending'] = merged_df['macd_diff'] < 0\n",
|
||||
"\n",
|
||||
" # 使用rolling窗口计算连续下降超过2个月\n",
|
||||
" merged_df['consecutive_desc'] = merged_df['descending'].rolling(window=3).sum() >= 2\n",
|
||||
"\n",
|
||||
" # 检查前一个月是否在连续下降,当前月是否回升\n",
|
||||
" condition2 = (merged_df['consecutive_desc'].shift(1)) & \\\n",
|
||||
" (merged_df['macd_diff'] > 0)\n",
|
||||
"\n",
|
||||
" # 筛选满足条件的月份\n",
|
||||
" further_filtered = merged_df[condition1 | condition2]\n",
|
||||
"\n",
|
||||
" # 返回筛选出的月份的索引(日期)\n",
|
||||
" return further_filtered.index.tolist()\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 步骤3: 在日线行情中判断峰值\n",
|
||||
"def find_dayline_peaks(further_filtered_months, daily_df):\n",
|
||||
" \"\"\"\n",
|
||||
" 在步骤2筛选出的月份中,从下一个月开始,在日线行情中找到前两个峰值\n",
|
||||
" \"\"\"\n",
|
||||
" # 确保日线行情已经按日期排序\n",
|
||||
" daily_df = daily_df.sort_values(by='datetime')\n",
|
||||
"\n",
|
||||
" # 将日线行情的索引设置为datetime\n",
|
||||
" daily_df.set_index('datetime', inplace=True)\n",
|
||||
"\n",
|
||||
" # 初始化结果列表\n",
|
||||
" result_dates = []\n",
|
||||
"\n",
|
||||
" for month in further_filtered_months:\n",
|
||||
" # 获取下一个月的起始日期\n",
|
||||
" next_month_start = month + pd.offsets.MonthBegin(1)\n",
|
||||
" next_month_end = month + pd.offsets.MonthEnd(2) # 可能需要调整范围\n",
|
||||
"\n",
|
||||
" # 截取日线行情数据\n",
|
||||
" period_df = daily_df.loc[next_month_start:next_month_end]\n",
|
||||
"\n",
|
||||
" # 找到收盘价的峰值\n",
|
||||
" # 使用scipy的argrelextrema函数找到相对高点\n",
|
||||
" peak_indices = argrelextrema(period_df['close'].values, np.greater, order=5)[0]\n",
|
||||
" if len(peak_indices) >= 2:\n",
|
||||
" # 获取前两个峰值\n",
|
||||
" first_peak = peak_indices[0]\n",
|
||||
" second_peak = peak_indices[1]\n",
|
||||
"\n",
|
||||
" # 比较两个峰值\n",
|
||||
" if period_df['close'].iloc[second_peak] > period_df['close'].iloc[first_peak]:\n",
|
||||
" result_dates.append(period_df.index[second_peak])\n",
|
||||
"\n",
|
||||
" return result_dates\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 步骤4: 输出结果\n",
|
||||
"def main(daily_df):\n",
|
||||
" # 步骤1: 计算月线行情和MACD\n",
|
||||
" monthly_df = calculate_monthly_data(daily_df.copy())\n",
|
||||
" monthly_df = calculate_monthly_macd(monthly_df)\n",
|
||||
"\n",
|
||||
" # 步骤1: 筛选出符合条件的月份\n",
|
||||
" filtered_months = filter_monthly_macd(monthly_df)\n",
|
||||
"\n",
|
||||
" if filtered_months.empty:\n",
|
||||
" print(\"没有满足步骤1条件的月份\")\n",
|
||||
" return\n",
|
||||
"\n",
|
||||
" # 步骤2: 进一步筛选符合条件的月份\n",
|
||||
" further_filtered_months = further_filter_months(filtered_months, monthly_df)\n",
|
||||
"\n",
|
||||
" if not further_filtered_months:\n",
|
||||
" print(\"没有满足步骤2条件的月份\")\n",
|
||||
" return\n",
|
||||
"\n",
|
||||
" # 步骤3: 在日线行情中查找峰值\n",
|
||||
" result_dates = find_dayline_peaks(further_filtered_months, daily_df)\n",
|
||||
"\n",
|
||||
" # 输出结果\n",
|
||||
" if result_dates:\n",
|
||||
" print(\"满足条件的日期:\")\n",
|
||||
" for date in result_dates:\n",
|
||||
" print(date.date())\n",
|
||||
" else:\n",
|
||||
" print(\"没有找到符合条件的日期\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"main(daily_df)"
|
||||
],
|
||||
"id": "46bd60b709f637a2",
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"满足条件的日期:\n",
|
||||
"2005-09-16\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/var/folders/7h/w0cmp4zj6mn9br_6nyj310m40000gn/T/ipykernel_60768/2739124595.py:26: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.\n",
|
||||
" monthly_df = daily_df.groupby(pd.Grouper(key='datetime', freq='M')).agg(\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"execution_count": 10
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
Reference in New Issue
Block a user