Compare commits
23 Commits
a89c60227c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ae75a3e6c | |||
| d4a5a8f586 | |||
| 5dcc00d9b2 | |||
| edec606449 | |||
| 2b01c56471 | |||
| b8f97f7203 | |||
| 5489a0bb4b | |||
| 3f8b210564 | |||
| 9689625fc1 | |||
| 46a539cf72 | |||
| e1eba0559e | |||
| 5236a0f6f9 | |||
| e856588b6e | |||
| 7092fd65c4 | |||
| 32f563518d | |||
| 2901905e20 | |||
| f34ce1374b | |||
| 576d9abc3c | |||
| bdacbcde9d | |||
| 063ece34c9 | |||
| c711a8c94a | |||
| bd1131ee06 | |||
| b74e33b37b |
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||
</state>
|
||||
</component>
|
||||
10
note.md
Normal file
10
note.md
Normal 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
|
||||
```
|
||||
3816
poetry.lock
generated
3816
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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
44
strategy.py
Normal 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
3456
回测/backtesting.ipynb
Normal file
File diff suppressed because one or more lines are too long
403
回测/backtrader.ipynb
Normal file
403
回测/backtrader.ipynb
Normal file
File diff suppressed because one or more lines are too long
587
材料准备/ta-lib.ipynb
Normal file
587
材料准备/ta-lib.ipynb
Normal 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
|
||||
}
|
||||
1412
行情监控/Holdle策略.ipynb
Normal file
1412
行情监控/Holdle策略.ipynb
Normal file
File diff suppressed because one or more lines are too long
5240
财报数据获取/AK数据.ipynb
Normal file
5240
财报数据获取/AK数据.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
1059
财报数据获取/TuShare数据.ipynb
Normal file
1059
财报数据获取/TuShare数据.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,18 +1,21 @@
|
||||
import os.path
|
||||
|
||||
import pandas as pd
|
||||
|
||||
finance_root = "C:\\Users\\lanyuanxiaoyao\\Documents\\Tushare"
|
||||
finance_root = "/Users/lanyuanxiaoyao/SynologyDrive/data/Tushare"
|
||||
# finance_root = "C:\\Users\\lanyuanxiaoyao\\Documents\\Tushare"
|
||||
|
||||
|
||||
def load_balance_sheet():
|
||||
return pd.read_csv(f"{finance_root}\\财务报表\\资产负债表1990-2024.csv")
|
||||
return pd.read_csv(os.path.join(finance_root, "财务报表", "资产负债表1990-2024.csv"))
|
||||
|
||||
|
||||
def load_income():
|
||||
return pd.read_csv(f"{finance_root}\\财务报表\\利润表1990-2024.csv")
|
||||
return pd.read_csv(os.path.join(finance_root, "财务报表", "利润表1990-2024.csv"))
|
||||
|
||||
|
||||
def load_cashflow():
|
||||
return pd.read_csv(f"{finance_root}\\财务报表\\现金流量表1990-2024.csv")
|
||||
return pd.read_csv(os.path.join(finance_root, "财务报表", "现金流量表1990-2024.csv"))
|
||||
|
||||
|
||||
def load_finance():
|
||||
|
||||
@@ -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",
|
||||
|
||||
113
财报筛选/选股测试.ipynb
Normal file
113
财报筛选/选股测试.ipynb
Normal 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
|
||||
}
|
||||
1458
财报筛选/金字塔选股.ipynb
1458
财报筛选/金字塔选股.ipynb
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user