1
0

Compare commits

...

16 Commits

Author SHA1 Message Date
1ae75a3e6c 增加数据采集 2025-09-17 18:35:03 +08:00
d4a5a8f586 设计止损函数 2025-02-23 22:18:37 +08:00
5dcc00d9b2 修正MACD策略参数 2025-02-21 11:56:28 +08:00
edec606449 增加批量回测函数 2025-02-19 23:18:19 +08:00
2b01c56471 修正策略的编写 2025-02-19 18:43:14 +08:00
b8f97f7203 新增backtesting框架用于回测 2025-02-18 18:01:01 +08:00
5489a0bb4b 完成macd回测 2025-02-17 22:35:46 +08:00
3f8b210564 尝试在策略内部使用talib计算指标 2025-02-17 18:28:08 +08:00
9689625fc1 完成macd回测 2025-02-16 23:24:34 +08:00
46a539cf72 尝试构建回测模块 2025-02-13 18:21:54 +08:00
e1eba0559e 学习使用backtrader 2025-02-11 22:56:21 +08:00
5236a0f6f9 尝试构建回测模块 2025-02-11 17:35:00 +08:00
e856588b6e 进行了一些尝试 2025-02-10 23:22:55 +08:00
7092fd65c4 优化代码 2025-02-10 17:28:30 +08:00
32f563518d 进行了一番计算 2025-01-22 16:03:28 +08:00
2901905e20 更新依赖信息 2025-01-22 09:00:45 +08:00
9 changed files with 14482 additions and 1499 deletions

10
note.md Normal file
View File

@@ -0,0 +1,10 @@
talib安装
macOS
```
poetry run pip install TA-Lib
```
Windows
> https://github.com/cgohlke/talib-build
```
poetry run pip install ta_lib-0.6.3-cp312-cp312-win_amd64.whl
```

3813
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,9 @@ jupyter = "^1.1.1"
matplotlib = "^3.10.0"
prophet = "^1.1.6"
mplfinance = "^0.12.10b0"
scipy = "^1.15.1"
backtrader = "^1.9.78.123"
backtesting = "^0.6.1"
[build-system]

3456
回测/backtesting.ipynb Normal file

File diff suppressed because one or more lines are too long

403
回测/backtrader.ipynb Normal file

File diff suppressed because one or more lines are too long

587
材料准备/ta-lib.ipynb Normal file
View File

@@ -0,0 +1,587 @@
{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2025-02-11T06:31:19.433336Z",
"start_time": "2025-02-11T06:31:18.884130Z"
}
},
"source": [
"import pandas as pd\n",
"\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",
" source_df[[\"trade_date\", \"vol\", \"open_qfq\", \"close_qfq\", \"high_qfq\", \"low_qfq\", \"macd\", \"macd_dif\", \"macd_dea\"]]\n",
"df[\"datetime\"] = pd.to_datetime(df[\"date\"], format=\"%Y%m%d\")\n",
"df[\"datetime_text\"] = df[\"datetime\"].apply(lambda x: x.strftime(\"%Y%m%d\"))\n",
"df.sort_values(by='datetime', inplace=True)\n",
"df"
],
"outputs": [
{
"data": {
"text/plain": [
" 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 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",
"[5591 rows x 11 columns]"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>volume</th>\n",
" <th>open</th>\n",
" <th>close</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
" <th>macd</th>\n",
" <th>macd_dif</th>\n",
" <th>macd_dea</th>\n",
" <th>datetime</th>\n",
" <th>datetime_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\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>2001-08-27</td>\n",
" <td>20010827</td>\n",
" </tr>\n",
" <tr>\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>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>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>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",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2182</th>\n",
" <td>20241225</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>2183</th>\n",
" <td>20241226</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>2184</th>\n",
" <td>20241227</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>2185</th>\n",
" <td>20241230</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>2186</th>\n",
" <td>20241231</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>5591 rows × 11 columns</p>\n",
"</div>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 2
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-02-11T06:33:12.365001Z",
"start_time": "2025-02-11T06:33:12.329227Z"
}
},
"cell_type": "code",
"source": [
"import talib\n",
"\n",
"dif, dea, hist = talib.MACD(df[\"close\"], fastperiod=12, slowperiod=26, signalperiod=9)\n",
"\n",
"# 将结果添加到数据框\n",
"df['DIF'] = dif\n",
"df['DEA'] = dea\n",
"df['MACD'] = hist\n",
"\n",
"#根据close列计算macd值\n",
"talib.SMA(df[\"close\"], timeperiod=26, step=10)\n",
"\n",
"df"
],
"id": "72b1c0c3f57e8b8e",
"outputs": [
{
"data": {
"text/plain": [
" 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 macd_dif macd_dea datetime datetime_text DIF DEA \\\n",
"2187 0.000 0.000 0.000 2001-08-27 20010827 NaN NaN \n",
"2188 0.021 0.013 0.003 2001-08-28 20010828 NaN NaN \n",
"2189 0.025 0.018 0.006 2001-08-29 20010829 NaN NaN \n",
"2190 0.037 0.029 0.010 2001-08-30 20010830 NaN NaN \n",
"2191 0.042 0.036 0.016 2001-08-31 20010831 NaN NaN \n",
"... ... ... ... ... ... ... ... \n",
"2182 5.430 5.063 2.348 2024-12-25 20241225 5.062711 2.347629 \n",
"2183 4.192 4.968 2.872 2024-12-26 20241226 4.967756 2.871654 \n",
"2184 3.295 4.931 3.283 2024-12-27 20241227 4.930880 3.283499 \n",
"2185 1.993 4.529 3.533 2024-12-30 20241230 4.529101 3.532620 \n",
"2186 0.880 4.083 3.643 2024-12-31 20241231 4.082931 3.642682 \n",
"\n",
" MACD \n",
"2187 NaN \n",
"2188 NaN \n",
"2189 NaN \n",
"2190 NaN \n",
"2191 NaN \n",
"... ... \n",
"2182 2.715082 \n",
"2183 2.096102 \n",
"2184 1.647381 \n",
"2185 0.996481 \n",
"2186 0.440249 \n",
"\n",
"[5591 rows x 14 columns]"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>volume</th>\n",
" <th>open</th>\n",
" <th>close</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
" <th>macd</th>\n",
" <th>macd_dif</th>\n",
" <th>macd_dea</th>\n",
" <th>datetime</th>\n",
" <th>datetime_text</th>\n",
" <th>DIF</th>\n",
" <th>DEA</th>\n",
" <th>MACD</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\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>2001-08-27</td>\n",
" <td>20010827</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\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",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\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",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\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",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\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",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2182</th>\n",
" <td>20241225</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",
" <td>5.062711</td>\n",
" <td>2.347629</td>\n",
" <td>2.715082</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2183</th>\n",
" <td>20241226</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",
" <td>4.967756</td>\n",
" <td>2.871654</td>\n",
" <td>2.096102</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2184</th>\n",
" <td>20241227</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",
" <td>4.930880</td>\n",
" <td>3.283499</td>\n",
" <td>1.647381</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2185</th>\n",
" <td>20241230</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",
" <td>4.529101</td>\n",
" <td>3.532620</td>\n",
" <td>0.996481</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2186</th>\n",
" <td>20241231</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",
" <td>4.082931</td>\n",
" <td>3.642682</td>\n",
" <td>0.440249</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5591 rows × 14 columns</p>\n",
"</div>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 3
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff