1
0

尝试构建回测模块

This commit is contained in:
2025-02-11 17:35:00 +08:00
parent e856588b6e
commit 5236a0f6f9
5 changed files with 1076 additions and 149 deletions

95
poetry.lock generated
View File

@@ -15,14 +15,14 @@ files = [
[[package]]
name = "akshare"
version = "1.15.84"
version = "1.15.85"
description = "AKShare is an elegant and simple financial data interface library for Python, built for human beings!"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
{file = "akshare-1.15.84-py3-none-any.whl", hash = "sha256:437f12ba66236f2863292ae4d253f974de2fd99f7124e560b3cdd48a8be174b9"},
{file = "akshare-1.15.84.tar.gz", hash = "sha256:51c025e2e582591f973a5d1fb9dd9a248164005ae547e9142ac771bae25153eb"},
{file = "akshare-1.15.85-py3-none-any.whl", hash = "sha256:46c2c96027a9588d838c41b7613cef4cee049d9961f9d592fc8165ab4b460343"},
{file = "akshare-1.15.85.tar.gz", hash = "sha256:fad37fe3684a8d026d8dab802580f393d69969d35fd23106c72757a6dab22f7a"},
]
[package.dependencies]
@@ -223,6 +223,20 @@ files = [
[package.extras]
dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"]
[[package]]
name = "backtrader"
version = "1.9.78.123"
description = "BackTesting Engine"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "backtrader-1.9.78.123-py2.py3-none-any.whl", hash = "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd"},
]
[package.extras]
plotting = ["matplotlib"]
[[package]]
name = "beautifulsoup4"
version = "4.13.3"
@@ -2975,6 +2989,64 @@ files = [
{file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"},
]
[[package]]
name = "scipy"
version = "1.15.1"
description = "Fundamental algorithms for scientific computing in Python"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
{file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"},
{file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"},
{file = "scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea"},
{file = "scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e"},
{file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25"},
{file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52"},
{file = "scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0"},
{file = "scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"},
{file = "scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2"},
{file = "scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0"},
{file = "scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf"},
{file = "scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac"},
{file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df"},
{file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7"},
{file = "scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a"},
{file = "scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b"},
{file = "scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776"},
{file = "scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f"},
{file = "scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04"},
{file = "scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9"},
{file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce"},
{file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2"},
{file = "scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5"},
{file = "scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d"},
{file = "scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85"},
{file = "scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692"},
{file = "scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab"},
{file = "scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c"},
{file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e"},
{file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e"},
{file = "scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4"},
{file = "scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef"},
{file = "scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b"},
{file = "scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95"},
{file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364"},
{file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0"},
{file = "scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54"},
{file = "scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c"},
{file = "scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5"},
{file = "scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6"},
]
[package.dependencies]
numpy = ">=1.23.5,<2.5"
[package.extras]
dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
[[package]]
name = "send2trash"
version = "1.8.3"
@@ -3208,6 +3280,21 @@ numpy = "*"
test = ["pandas", "pytest", "pytest-cov"]
ujson = ["ujson (>=5.5.0)"]
[[package]]
name = "ta-lib"
version = "0.6.3"
description = "Python wrapper for TA-Lib"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "ta_lib-0.6.3.tar.gz", hash = "sha256:0c628db09b3fab6e5c26979e608b674e7aecc10359c82ba8d53f729767a856ac"},
]
[package.dependencies]
numpy = "*"
setuptools = "*"
[[package]]
name = "tabulate"
version = "0.9.0"
@@ -3498,4 +3585,4 @@ test = ["pytest", "pytest-cov"]
[metadata]
lock-version = "2.1"
python-versions = "^3.12"
content-hash = "9fbcdd3a9fba083ae2a2138f3b82492b3559f8dcd3a7fde8ab521f36387327af"
content-hash = "40ca96657ad381e086f3ea182f88c07ff7d44daa425efe1942266d112701c0ba"

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"
ta-lib = "^0.6.3"
backtrader = "^1.9.78.123"
[build-system]

37
回测/backtrader.ipynb Normal file
View File

@@ -0,0 +1,37 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "initial_id",
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
""
]
}
],
"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
}

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
}

View File

@@ -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": {