1
0

Compare commits

...

25 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
f34ce1374b K线分析 2025-01-21 23:19:07 +08:00
576d9abc3c 完成金字塔选股 2025-01-20 18:14:42 +08:00
bdacbcde9d 完善金字塔选股策略计算 2025-01-20 17:16:34 +08:00
063ece34c9 优化选股计算 2025-01-20 00:49:23 +08:00
c711a8c94a 明确策略开发方向 2025-01-17 18:20:28 +08:00
bd1131ee06 优化代码 2025-01-16 17:00:48 +08:00
b74e33b37b 增加结构化策略 2025-01-15 18:43:23 +08:00
a89c60227c 优化财报获取 2025-01-14 22:48:14 +08:00
b78cc1dd23 优化依赖版本 2025-01-14 21:55:07 +08:00
16 changed files with 15248 additions and 2446 deletions

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

6
.idea/vcs.xml generated
View File

@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CommitMessageInspectionProfile">
<profile version="1.0">
<inspection_tool class="CommitFormat" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="CommitNamingConvention" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>

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
```

3948
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]

44
strategy.py Normal file
View File

@@ -0,0 +1,44 @@
import pandas as pd
class Selector:
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
return codes
class Strategy:
def __init__(self, selectors: [Selector]):
self.selectors = selectors
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
return list(map(lambda code: self.selectors.select(code, df), codes))
class PeriodSelector(Selector):
def __init__(self, period: int = 5):
self.__period = period
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
size_df = df.groupby("code").size()
return list(filter(lambda code: size_df[code] > self.__period, codes))
class PyramidSelector(Selector):
def select(self, codes: [str], df: pd.DataFrame) -> [str]:
target_df = df[df["code"].isin(codes)]
target_df["score"] = 0
group_df = target_df.groupby("code")
target_df["prev_total_stockholder_interest"] = group_df["total_stockholder_interest"].shift(1)
target_df["roe"] = target_df["net_income"] / ((target_df["prev_total_stockholder_interest"] + target_df["total_stockholder_interest"]) / 2)
target_df["average_roe"] = target_df["roe"].mean()
target_df[target_df["average_roe"] >= 35] = target_df["score"] + 550
target_df[(target_df["average_roe"] < 35) & (target_df["average_roe"] >= 30)] = target_df["score"] + 500
target_df[(target_df["average_roe"] < 30) & (target_df["average_roe"] >= 25)] = target_df["score"] + 450
target_df[(target_df["average_roe"] < 25) & (target_df["average_roe"] >= 15)] = target_df["score"] + 300
target_df[(target_df["average_roe"] < 15) & (target_df["average_roe"] >= 10)] = target_df["score"] + 250
target_df["prev_total_assets"] = group_df["total_assets"].shift(1)
target_df["roa"] = target_df["net_income"] / ((target_df["prev_total_assets"] + target_df["total_assets"]) / 2)
return super().select(codes, df)

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

25
财报筛选/loader.py Normal file
View File

@@ -0,0 +1,25 @@
import os.path
import pandas as pd
finance_root = "/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare"
# finance_root = "C:\\Users\\lanyuanxiaoyao\\Documents\\Tushare"
def load_balance_sheet():
return pd.read_csv(os.path.join(finance_root, "财务报表", "资产负债表1990-2024.csv"))
def load_income():
return pd.read_csv(os.path.join(finance_root, "财务报表", "利润表1990-2024.csv"))
def load_cashflow():
return pd.read_csv(os.path.join(finance_root, "财务报表", "现金流量表1990-2024.csv"))
def load_finance():
finance_df = load_balance_sheet()
finance_df = pd.merge(finance_df, load_income(), on=["ts_code", "end_date"])
finance_df = pd.merge(finance_df, load_cashflow(), on=["ts_code", "end_date"])
return finance_df

View File

@@ -102,12 +102,12 @@
" daily_df[\"trade_date\"] = pd.to_datetime(daily_df[\"trade_date\"], format=\"%Y%m%d\")\n",
" daily_df[\"trade_date_timestamp\"] = daily_df[\"trade_date\"].astype(np.int64)\n",
" daily_df.sort_values(by=\"trade_date\", ascending=True, inplace=True)\n",
" \n",
" first = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].min()][\"close_qfq\"].values[0]\n",
" last = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].max()][\"close_qfq\"].values[0]\n",
" \n",
"\n",
" first = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].min()][\"close_qfq\"].values[0]\n",
" last = daily_df[daily_df[\"trade_date_timestamp\"] == daily_df[\"trade_date_timestamp\"].max()][\"close_qfq\"].values[0]\n",
"\n",
" print(first, last)\n",
" \n",
"\n",
" coefficients = np.polyfit(daily_df[\"trade_date_timestamp\"], daily_df[\"close_qfq\"], 1)\n",
"\n",
" print(coefficients)\n",

View File

@@ -0,0 +1,113 @@
{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2025-01-16T07:57:04.498115Z",
"start_time": "2025-01-16T07:57:00.401734Z"
}
},
"source": [
"import pandas as pd\n",
"import loader as ld\n",
"\n",
"source_finance_df = ld.load_finance()\n",
"finance_df = pd.DataFrame()\n",
"finance_df[[\n",
" \"code\",\n",
" # 年份\n",
" \"year\",\n",
" # 股东权益合计(含少数股东权益)\n",
" \"total_stockholder_interest\",\n",
" # 净利润\n",
" \"net_income\",\n",
" # 总资产\n",
" \"total_assets\",\n",
" # 营业总收入\n",
" \"total_revenue\",\n",
" # 存货\n",
" \"inventories\",\n",
" # 应收账款\n",
" \"accounts_receivable\",\n",
" # 营业成本\n",
" \"operating_costs\",\n",
" # 营业利润\n",
" \"operating_profit\",\n",
" # 现金与现金等价物\n",
" \"cash\",\n",
" # 营业活动现金流量净值\n",
" \"operating_net_cash_flow\",\n",
"]] = source_finance_df[[\n",
" \"ts_code\",\n",
" \"end_date\",\n",
" \"total_hldr_eqy_inc_min_int\",\n",
" \"n_income\",\n",
" \"total_assets\",\n",
" \"total_revenue\",\n",
" \"inventories\",\n",
" \"accounts_receiv\",\n",
" \"oper_cost\",\n",
" \"operate_profit\",\n",
" \"money_cap\",\n",
" \"n_cashflow_act\",\n",
"]]"
],
"outputs": [],
"execution_count": 1
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-01-16T07:57:04.552251Z",
"start_time": "2025-01-16T07:57:04.499999Z"
}
},
"cell_type": "code",
"source": [
"from strategy import PeriodSelector\n",
"\n",
"filter_df = finance_df[(2010 < finance_df[\"year\"]) & (finance_df[\"year\"] < 2025)]\n",
"codes = filter_df[\"code\"].unique().tolist()\n",
"print(len(codes))\n",
"codes = PeriodSelector().select(codes, filter_df)\n",
"print(len(codes))"
],
"id": "26539ccd8ce0fb9e",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5715\n",
"4892\n"
]
}
],
"execution_count": 2
}
],
"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 it is too large Load Diff