Commit 4a42a53c authored by Dr.李's avatar Dr.李

update

parent e3576c36
.ipynb_checkpoints .ipynb_checkpoints
__pycache__ __pycache__
*.pyc *.pyc
.virtual_documents .virtual_documents
\ No newline at end of file *.xlsx
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 2,
"id": "3604e08c-d849-4d0e-aa6d-384657b1b6c8", "id": "3604e08c-d849-4d0e-aa6d-384657b1b6c8",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -10,18 +10,31 @@ ...@@ -10,18 +10,31 @@
"import datetime as dt\n", "import datetime as dt\n",
"from utility import (\n", "from utility import (\n",
" read_sql,\n", " read_sql,\n",
" fd_alive_funds,\n",
" fd_basicinfo,\n", " fd_basicinfo,\n",
" fd_typeclass,\n", " fd_typeclass,\n",
" fd_hshkiport,\n", " fd_hshkiport,\n",
" fd_assetportfolio,\n", " fd_assetportfolio,\n",
" fd_derieden,\n",
" nearest_report_date\n", " nearest_report_date\n",
")\n", ")\n",
"import pandas as pd" "import pandas as pd\n",
"from PyFin.api import makeSchedule\n",
"from PyFin.api import BizDayConventions"
]
},
{
"cell_type": "markdown",
"id": "195697a1-a0a8-4daa-bde4-098e7facf2be",
"metadata": {},
"source": [
"# 1. 基金分类\n",
"-----------------------"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 76,
"id": "35ca37b3-41d1-4c2d-a576-eef1cb9c1ec5", "id": "35ca37b3-41d1-4c2d-a576-eef1cb9c1ec5",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -36,67 +49,67 @@ ...@@ -36,67 +49,67 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 79,
"id": "96a3611d-8f1e-4420-9b08-7ca5dd6443cd", "id": "96a3611d-8f1e-4420-9b08-7ca5dd6443cd",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# 获取所有目标股票型基金(清算结束日期晚于当前日)\n", "# 获取所有目标股票型基金(清算结束日期晚于当前日)\n",
"\n", "\n",
"security_ids = read_sql(f\"\"\"\n", "security_ids = fd_alive_funds(current_date, 1)"
"select SECURITYID from TQ_FD_TYPECLASS \n",
"WHERE\n",
" ISVALID = 1 AND\n",
" L1CODE = 1 AND\n",
" (ENDDATE>='{today}' or ENDDATE = '19000101') \n",
"ORDER BY SECURITYID;\n",
"\"\"\")[\"SECURITYID\"].unique().tolist()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": 80,
"id": "79115d35-0712-4432-a73c-29bd5262dda7", "id": "79115d35-0712-4432-a73c-29bd5262dda7",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"basic_info = fd_basicinfo(security_ids, current_date)\n", "basic_info = fd_basicinfo(security_ids, current_date)\n",
"type_info = fd_typeclass(security_ids, current_date)\n", "type_info = fd_typeclass(security_ids, current_date)\n",
"hkport_info = fd_hshkiport(security_ids, report_dates_begin)\n", "hkport_info = fd_hshkiport(security_ids, report_dates_begin, current_date)\n",
"hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n", "hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n",
"asset_port = fd_assetportfolio(security_ids, report_dates_begin).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()" "asset_port = fd_assetportfolio(security_ids, report_dates_begin, current_date).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": 81,
"id": "0c30cc50-a1c3-4774-84a8-5ab5faca8b67", "id": "0c30cc50-a1c3-4774-84a8-5ab5faca8b67",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"df = pd.merge(basic_info, type_info, on=\"SECURITYID\")\n", "df = pd.merge(basic_info, type_info, on=\"SECURITYID\", how=\"inner\")\n",
"df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n", "df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n",
"df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\")\n", "df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\").drop_duplicates()\n",
"df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)" "\n",
"if \"ACCNETMKTCAP\" in df:\n",
" df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)\n",
"else:\n",
" df[\"ACCNETMKTCAP\"] = 0.0"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 23, "execution_count": 82,
"id": "c99e0fe3-7193-449e-b5ee-6cbd0b003035", "id": "c99e0fe3-7193-449e-b5ee-6cbd0b003035",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# 分类\n", "# 分类\n",
"df.loc[(df[\"L3NAME\"].isin([\"其他行业股票型基金\", \"偏股型基金(股票上下限60%-95%)\", '标准股票型基金', '医药行业股票型基金', '封闭式标准股票型基金'])), \"股票型(子类)\"] = \"普通股票型基金\"\n", "\n",
"df.loc[(df[\"L3NAME\"].isin([\"标准指数股票型基金\"])), \"股票型(子类)\"] = \"被动指数型基金\"\n", "flag = df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5\n",
"df.loc[(df[\"L3NAME\"].isin([\"增强指数股票型基金\"])), \"股票型(子类)\"] = \"增强指数型基金\"\n", "df.loc[flag, \"股票型(子类)\"] = \"港股通股票型基金\"\n",
"df.loc[(df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5), \"股票型(子类)\"] = \"港股通股票型基金\"" "\n",
"df.loc[(~flag) & (df[\"L3NAME\"].isin([\"其他行业股票型基金\", \"偏股型基金(股票上下限60%-95%)\", '标准股票型基金', '医药行业股票型基金', '封闭式标准股票型基金'])), \"股票型(子类)\"] = \"普通股票型基金\"\n",
"df.loc[(~flag) & (df[\"L3NAME\"].isin([\"标准指数股票型基金\"])), \"股票型(子类)\"] = \"被动指数型基金\"\n",
"df.loc[(~flag) & (df[\"L3NAME\"].isin([\"增强指数股票型基金\"])), \"股票型(子类)\"] = \"增强指数型基金\""
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 24, "execution_count": 83,
"id": "a42b357e-6b87-424b-9ca9-4ce60904b66b", "id": "a42b357e-6b87-424b-9ca9-4ce60904b66b",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -174,20 +187,20 @@ ...@@ -174,20 +187,20 @@
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>普通股票型基金</th>\n", " <th>普通股票型基金</th>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>60</td>\n", " <td>59</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" <td>206</td>\n", " <td>204</td>\n",
" <td>207</td>\n", " <td>205</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>港股通股票型基金</th>\n", " <th>港股通股票型基金</th>\n",
...@@ -208,20 +221,20 @@ ...@@ -208,20 +221,20 @@
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>被动指数型基金</th>\n", " <th>被动指数型基金</th>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>213</td>\n", " <td>202</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" <td>329</td>\n", " <td>315</td>\n",
" <td>342</td>\n", " <td>328</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
...@@ -231,26 +244,26 @@ ...@@ -231,26 +244,26 @@
" SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE INVESTSTYLE \\\n", " SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE INVESTSTYLE \\\n",
"股票型(子类) \n", "股票型(子类) \n",
"增强指数型基金 63 63 45 63 63 63 \n", "增强指数型基金 63 63 45 63 63 63 \n",
"普通股票型基金 207 207 60 207 207 207 \n", "普通股票型基金 205 205 59 205 205 205 \n",
"港股通股票型基金 12 12 8 12 12 12 \n", "港股通股票型基金 12 12 8 12 12 12 \n",
"被动指数型基金 342 342 213 342 342 342 \n", "被动指数型基金 328 328 202 328 328 328 \n",
"\n", "\n",
" L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME EQUITYINVERTO \\\n", " L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME EQUITYINVERTO \\\n",
"股票型(子类) \n", "股票型(子类) \n",
"增强指数型基金 63 63 63 63 63 63 60 \n", "增强指数型基金 63 63 63 63 63 63 60 \n",
"普通股票型基金 207 207 207 207 207 207 206 \n", "普通股票型基金 205 205 205 205 205 205 204 \n",
"港股通股票型基金 12 12 12 12 12 12 12 \n", "港股通股票型基金 12 12 12 12 12 12 12 \n",
"被动指数型基金 342 342 342 342 342 342 329 \n", "被动指数型基金 328 328 328 328 328 328 315 \n",
"\n", "\n",
" ACCNETMKTCAP \n", " ACCNETMKTCAP \n",
"股票型(子类) \n", "股票型(子类) \n",
"增强指数型基金 63 \n", "增强指数型基金 63 \n",
"普通股票型基金 207 \n", "普通股票型基金 205 \n",
"港股通股票型基金 12 \n", "港股通股票型基金 12 \n",
"被动指数型基金 342 " "被动指数型基金 328 "
] ]
}, },
"execution_count": 24, "execution_count": 83,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
...@@ -261,7 +274,7 @@ ...@@ -261,7 +274,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 25, "execution_count": 84,
"id": "3a20a243-ebe0-4410-a3e8-3363e1e793e2", "id": "3a20a243-ebe0-4410-a3e8-3363e1e793e2",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -360,28 +373,28 @@ ...@@ -360,28 +373,28 @@
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>3</th>\n", " <th>3</th>\n",
" <td>1030000045</td>\n", " <td>1030000096</td>\n",
" <td>博时裕富沪深300指数证券投资基金</td>\n", " <td>易方达上证50指数增强型证券投资基金</td>\n",
" <td>博时沪深300指数</td>\n", " <td>易方达上证50增强</td>\n",
" <td>050002</td>\n", " <td>110003</td>\n",
" <td>证券投资基金</td>\n", " <td>证券投资基金</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
" <td>股票基金</td>\n", " <td>股票基金</td>\n",
" <td>1.2</td>\n", " <td>1.2</td>\n",
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.2</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>增强指数股票型基金</td>\n",
" <td>93.689167</td>\n", " <td>92.823333</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>增强指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>4</th>\n", " <th>554</th>\n",
" <td>1030000096</td>\n", " <td>1030000136</td>\n",
" <td>易方达上证50指数增强型证券投资基金</td>\n", " <td>融通深证100指数证券投资基金</td>\n",
" <td>易方达上证50增强</td>\n", " <td>融通深证100指数</td>\n",
" <td>110003</td>\n", " <td>161604</td>\n",
" <td>证券投资基金</td>\n", " <td>证券投资基金</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
...@@ -390,34 +403,124 @@ ...@@ -390,34 +403,124 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.2</td>\n", " <td>1.2.2</td>\n",
" <td>增强指数股票型基金</td>\n", " <td>增强指数股票型基金</td>\n",
" <td>92.823333</td>\n", " <td>94.824167</td>\n",
" <td>0.0</td>\n",
" <td>增强指数型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>580</th>\n",
" <td>1030000149</td>\n",
" <td>泰达宏利首选企业股票型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>162208</td>\n",
" <td>证券投资基金</td>\n",
" <td>增值型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>1.1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>93.647500</td>\n",
" <td>0.0</td>\n",
" <td>普通股票型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>564</th>\n",
" <td>1030000159</td>\n",
" <td>银华-道琼斯88精选证券投资基金</td>\n",
" <td>None</td>\n",
" <td>180003</td>\n",
" <td>证券投资基金</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.2</td>\n",
" <td>增强指数股票型基金</td>\n",
" <td>88.533333</td>\n",
" <td>0.0</td>\n",
" <td>增强指数型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>577</th>\n",
" <td>1030000168</td>\n",
" <td>长城久泰沪深300指数证券投资基金</td>\n",
" <td>长城久泰沪深300指数</td>\n",
" <td>200002</td>\n",
" <td>证券投资基金</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.2</td>\n",
" <td>增强指数股票型基金</td>\n",
" <td>94.545000</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>增强指数型基金</td>\n", " <td>增强指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>...</th>\n", " <th>720</th>\n",
" <td>...</td>\n", " <td>1030000245</td>\n",
" <td>...</td>\n", " <td>申万菱信沪深300指数增强型证券投资基金</td>\n",
" <td>...</td>\n", " <td>申万菱信沪深300指数增强</td>\n",
" <td>...</td>\n", " <td>310318</td>\n",
" <td>...</td>\n", " <td>证券投资基金</td>\n",
" <td>...</td>\n", " <td>指数型</td>\n",
" <td>...</td>\n", " <td>1</td>\n",
" <td>...</td>\n", " <td>股票基金</td>\n",
" <td>...</td>\n", " <td>1.2</td>\n",
" <td>...</td>\n", " <td>指数股票型基金</td>\n",
" <td>...</td>\n", " <td>1.2.2</td>\n",
" <td>...</td>\n", " <td>增强指数股票型基金</td>\n",
" <td>...</td>\n", " <td>91.097500</td>\n",
" <td>...</td>\n", " <td>0.0</td>\n",
" <td>...</td>\n", " <td>增强指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>933</th>\n", " <th>649</th>\n",
" <td>1030005100</td>\n", " <td>1030000258</td>\n",
" <td>信诚中证智能家居指数分级证券投资基金</td>\n", " <td>兴全全球视野股票型证券投资基金</td>\n",
" <td>信诚中证智能家居指数分级</td>\n", " <td>None</td>\n",
" <td>165524</td>\n", " <td>340006</td>\n",
" <td>证券投资基金</td>\n",
" <td>成长型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>1.1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>89.563333</td>\n",
" <td>0.0</td>\n",
" <td>普通股票型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>705</th>\n",
" <td>1030000264</td>\n",
" <td>光大保德信量化核心证券投资基金</td>\n",
" <td>None</td>\n",
" <td>360001</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>1.1.1</td>\n",
" <td>标准股票型基金</td>\n",
" <td>91.365833</td>\n",
" <td>0.0</td>\n",
" <td>普通股票型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>455</th>\n",
" <td>1030000340</td>\n",
" <td>长盛中证100指数证券投资基金</td>\n",
" <td>None</td>\n",
" <td>519100</td>\n",
" <td>证券投资基金</td>\n", " <td>证券投资基金</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
...@@ -426,16 +529,16 @@ ...@@ -426,16 +529,16 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>标准指数股票型基金</td>\n",
" <td>94.028889</td>\n", " <td>94.055000</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>被动指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>934</th>\n", " <th>586</th>\n",
" <td>1030001329</td>\n", " <td>1030000342</td>\n",
" <td>信诚沪深300指数分级证券投资基金</td>\n", " <td>万家180指数证券投资基金</td>\n",
" <td>信诚沪深300指数分级</td>\n", " <td>None</td>\n",
" <td>165515</td>\n", " <td>519180</td>\n",
" <td>证券投资基金</td>\n", " <td>证券投资基金</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
...@@ -444,16 +547,16 @@ ...@@ -444,16 +547,16 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>标准指数股票型基金</td>\n",
" <td>94.640000</td>\n", " <td>94.820833</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>被动指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>935</th>\n", " <th>443</th>\n",
" <td>1030002379</td>\n", " <td>1030000345</td>\n",
" <td>信诚中证800医药指数分级证券投资基金</td>\n", " <td>大成沪深300指数证券投资基金</td>\n",
" <td>信诚中证800医药指数分级</td>\n", " <td>大成沪深300指数</td>\n",
" <td>165519</td>\n", " <td>519300</td>\n",
" <td>证券投资基金</td>\n", " <td>证券投资基金</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
...@@ -462,17 +565,17 @@ ...@@ -462,17 +565,17 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>标准指数股票型基金</td>\n",
" <td>94.184444</td>\n", " <td>93.275000</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>被动指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>936</th>\n", " <th>416</th>\n",
" <td>1030001071</td>\n", " <td>1030000429</td>\n",
" <td>信诚中证500指数分级证券投资基金</td>\n", " <td>上证50交易型开放式指数证券投资基金</td>\n",
" <td>信诚中证500指数</td>\n", " <td>None</td>\n",
" <td>165511</td>\n", " <td>510050</td>\n",
" <td>证券投资基金</td>\n", " <td>ETF</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
" <td>股票基金</td>\n", " <td>股票基金</td>\n",
...@@ -480,17 +583,17 @@ ...@@ -480,17 +583,17 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>标准指数股票型基金</td>\n",
" <td>93.046667</td>\n", " <td>99.823333</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>被动指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>937</th>\n", " <th>470</th>\n",
" <td>1030002053</td>\n", " <td>1030000430</td>\n",
" <td>建信央视财经50指数分级发起式证券投资基金</td>\n", " <td>上证180交易型开放式指数证券投资基金</td>\n",
" <td>建信央视财经50指数分级</td>\n", " <td>None</td>\n",
" <td>165312</td>\n", " <td>510180</td>\n",
" <td>证券投资基金</td>\n", " <td>ETF</td>\n",
" <td>指数型</td>\n", " <td>指数型</td>\n",
" <td>1</td>\n", " <td>1</td>\n",
" <td>股票基金</td>\n", " <td>股票基金</td>\n",
...@@ -498,79 +601,766 @@ ...@@ -498,79 +601,766 @@
" <td>指数股票型基金</td>\n", " <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n", " <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n", " <td>标准指数股票型基金</td>\n",
" <td>92.328889</td>\n", " <td>99.770000</td>\n",
" <td>0.0</td>\n", " <td>0.0</td>\n",
" <td>被动指数型基金</td>\n", " <td>被动指数型基金</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n",
" <th>773</th>\n",
" <td>1030000431</td>\n",
" <td>上证红利交易型开放式指数证券投资基金</td>\n",
" <td>None</td>\n",
" <td>510880</td>\n",
" <td>ETF</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n",
" <td>99.025833</td>\n",
" <td>0.0</td>\n",
" <td>被动指数型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>469</th>\n",
" <td>1030000464</td>\n",
" <td>易方达深证100交易型开放式指数证券投资基金</td>\n",
" <td>None</td>\n",
" <td>159901</td>\n",
" <td>ETF</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n",
" <td>99.598333</td>\n",
" <td>0.0</td>\n",
" <td>被动指数型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>410</th>\n",
" <td>1030000465</td>\n",
" <td>中小企业100交易型开放式指数基金</td>\n",
" <td>None</td>\n",
" <td>159902</td>\n",
" <td>ETF</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.1</td>\n",
" <td>标准指数股票型基金</td>\n",
" <td>99.563333</td>\n",
" <td>0.0</td>\n",
" <td>被动指数型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>411</th>\n",
" <td>1030000474</td>\n",
" <td>嘉实沪深300交易型开放式指数证券投资基金联接基金(LOF)</td>\n",
" <td>嘉实沪深300ETF联接(LOF)</td>\n",
" <td>160706</td>\n",
" <td>LOF</td>\n",
" <td>指数型</td>\n",
" <td>1</td>\n",
" <td>股票基金</td>\n",
" <td>1.2</td>\n",
" <td>指数股票型基金</td>\n",
" <td>1.2.3</td>\n",
" <td>ETF联接基金</td>\n",
" <td>0.902500</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"<p>938 rows × 15 columns</p>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE \\\n", " SECURITYID FDNAME SNAMECOMP FSYMBOL \\\n",
"0 1030000030 国泰沪深300指数证券投资基金 国泰沪深300指数 020011 证券投资基金 \n", "0 1030000030 国泰沪深300指数证券投资基金 国泰沪深300指数 020011 \n",
"1 1030000034 华安MSCI中国A股指数增强型证券投资基金 None 040002 证券投资基金 \n", "1 1030000034 华安MSCI中国A股指数增强型证券投资基金 None 040002 \n",
"2 1030000045 博时裕富沪深300指数证券投资基金 博时沪深300指数 050002 证券投资基金 \n", "2 1030000045 博时裕富沪深300指数证券投资基金 博时沪深300指数 050002 \n",
"3 1030000045 博时裕富沪深300指数证券投资基金 博时沪深300指数 050002 证券投资基金 \n", "3 1030000096 易方达上证50指数增强型证券投资基金 易方达上证50增强 110003 \n",
"4 1030000096 易方达上证50指数增强型证券投资基金 易方达上证50增强 110003 证券投资基金 \n", "554 1030000136 融通深证100指数证券投资基金 融通深证100指数 161604 \n",
".. ... ... ... ... ... \n", "580 1030000149 泰达宏利首选企业股票型证券投资基金 None 162208 \n",
"933 1030005100 信诚中证智能家居指数分级证券投资基金 信诚中证智能家居指数分级 165524 证券投资基金 \n", "564 1030000159 银华-道琼斯88精选证券投资基金 None 180003 \n",
"934 1030001329 信诚沪深300指数分级证券投资基金 信诚沪深300指数分级 165515 证券投资基金 \n", "577 1030000168 长城久泰沪深300指数证券投资基金 长城久泰沪深300指数 200002 \n",
"935 1030002379 信诚中证800医药指数分级证券投资基金 信诚中证800医药指数分级 165519 证券投资基金 \n", "720 1030000245 申万菱信沪深300指数增强型证券投资基金 申万菱信沪深300指数增强 310318 \n",
"936 1030001071 信诚中证500指数分级证券投资基金 信诚中证500指数 165511 证券投资基金 \n", "649 1030000258 兴全全球视野股票型证券投资基金 None 340006 \n",
"937 1030002053 建信央视财经50指数分级发起式证券投资基金 建信央视财经50指数分级 165312 证券投资基金 \n", "705 1030000264 光大保德信量化核心证券投资基金 None 360001 \n",
"455 1030000340 长盛中证100指数证券投资基金 None 519100 \n",
"586 1030000342 万家180指数证券投资基金 None 519180 \n",
"443 1030000345 大成沪深300指数证券投资基金 大成沪深300指数 519300 \n",
"416 1030000429 上证50交易型开放式指数证券投资基金 None 510050 \n",
"470 1030000430 上证180交易型开放式指数证券投资基金 None 510180 \n",
"773 1030000431 上证红利交易型开放式指数证券投资基金 None 510880 \n",
"469 1030000464 易方达深证100交易型开放式指数证券投资基金 None 159901 \n",
"410 1030000465 中小企业100交易型开放式指数基金 None 159902 \n",
"411 1030000474 嘉实沪深300交易型开放式指数证券投资基金联接基金(LOF) 嘉实沪深300ETF联接(LOF) 160706 \n",
"\n", "\n",
" INVESTSTYLE L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME \\\n", " FDNATURE INVESTSTYLE L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME \\\n",
"0 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "0 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"1 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n", "1 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
"2 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "2 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"3 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "3 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
"4 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n", "554 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
".. ... ... ... ... ... ... ... \n", "580 证券投资基金 增值型 1 股票基金 1.1 标准股票型基金 1.1.1 标准股票型基金 \n",
"933 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "564 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
"934 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "577 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
"935 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "720 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.2 增强指数股票型基金 \n",
"936 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "649 证券投资基金 成长型 1 股票基金 1.1 标准股票型基金 1.1.1 标准股票型基金 \n",
"937 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n", "705 证券投资基金 稳健成长型 1 股票基金 1.1 标准股票型基金 1.1.1 标准股票型基金 \n",
"455 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"586 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"443 证券投资基金 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"416 ETF 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"470 ETF 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"773 ETF 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"469 ETF 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"410 ETF 指数型 1 股票基金 1.2 指数股票型基金 1.2.1 标准指数股票型基金 \n",
"411 LOF 指数型 1 股票基金 1.2 指数股票型基金 1.2.3 ETF联接基金 \n",
"\n", "\n",
" EQUITYINVERTO ACCNETMKTCAP 股票型(子类) \n", " EQUITYINVERTO ACCNETMKTCAP 股票型(子类) \n",
"0 93.975000 0.0 被动指数型基金 \n", "0 93.975000 0.0 被动指数型基金 \n",
"1 94.049167 0.0 增强指数型基金 \n", "1 94.049167 0.0 增强指数型基金 \n",
"2 93.689167 0.0 被动指数型基金 \n", "2 93.689167 0.0 被动指数型基金 \n",
"3 93.689167 0.0 被动指数型基金 \n", "3 92.823333 0.0 增强指数型基金 \n",
"4 92.823333 0.0 增强指数型基金 \n", "554 94.824167 0.0 增强指数型基金 \n",
".. ... ... ... \n", "580 93.647500 0.0 普通股票型基金 \n",
"933 94.028889 0.0 被动指数型基金 \n", "564 88.533333 0.0 增强指数型基金 \n",
"934 94.640000 0.0 被动指数型基金 \n", "577 94.545000 0.0 增强指数型基金 \n",
"935 94.184444 0.0 被动指数型基金 \n", "720 91.097500 0.0 增强指数型基金 \n",
"936 93.046667 0.0 被动指数型基金 \n", "649 89.563333 0.0 普通股票型基金 \n",
"937 92.328889 0.0 被动指数型基金 \n", "705 91.365833 0.0 普通股票型基金 \n",
"455 94.055000 0.0 被动指数型基金 \n",
"586 94.820833 0.0 被动指数型基金 \n",
"443 93.275000 0.0 被动指数型基金 \n",
"416 99.823333 0.0 被动指数型基金 \n",
"470 99.770000 0.0 被动指数型基金 \n",
"773 99.025833 0.0 被动指数型基金 \n",
"469 99.598333 0.0 被动指数型基金 \n",
"410 99.563333 0.0 被动指数型基金 \n",
"411 0.902500 0.0 NaN "
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.sort_values(\"SECURITYID\")[:20]"
]
},
{
"cell_type": "markdown",
"id": "2de48336-03c0-46c0-b2af-e1c890867ef7",
"metadata": {},
"source": [
"## 1.1 Put it all together"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "c9c557cf-2b92-402a-8c57-9711f42de08b",
"metadata": {},
"outputs": [],
"source": [
"def create_stk_fund_info(trade_dt):\n",
" trade_dt = dt.datetime.strptime(trade_dt, \"%Y%m%d\")\n",
" date_3yrs_ago = trade_dt.replace(year=trade_dt.year - 3)\n",
" report_dates_begin = nearest_report_date(date_3yrs_ago.strftime(\"%Y%m%d\"))\n",
" current_date = trade_dt.strftime(\"%Y%m%d\")\n",
" \n",
" security_ids = fd_alive_funds(current_date, 1)\n",
" basic_info = fd_basicinfo(security_ids, current_date)\n",
" type_info = fd_typeclass(security_ids, current_date)\n",
" hkport_info = fd_hshkiport(security_ids, report_dates_begin, current_date)\n",
" hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n",
" asset_port = fd_assetportfolio(security_ids, report_dates_begin, current_date).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()\n",
" \n",
" df = pd.merge(basic_info, type_info, on=\"SECURITYID\", how=\"inner\")\n",
" df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n",
" df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\").drop_duplicates()\n",
" if \"ACCNETMKTCAP\" in df:\n",
" df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)\n",
" else:\n",
" df[\"ACCNETMKTCAP\"] = 0.0\n",
" \n",
" flag = df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5\n",
" df.loc[flag, \"股票型(子类)\"] = \"港股通股票型基金\"\n",
"\n",
" df.loc[(~flag) & (df[\"L3NAME\"].isin([\"其他行业股票型基金\", \"偏股型基金(股票上下限60%-95%)\", '标准股票型基金', '医药行业股票型基金', '封闭式标准股票型基金'])), \"股票型(子类)\"] = \"普通股票型基金\"\n",
" df.loc[(~flag) & (df[\"L3NAME\"].isin([\"标准指数股票型基金\"])), \"股票型(子类)\"] = \"被动指数型基金\"\n",
" df.loc[(~flag) & (df[\"L3NAME\"].isin([\"增强指数股票型基金\"])), \"股票型(子类)\"] = \"增强指数型基金\"\n",
" \n",
" return df.sort_values(\"SECURITYID\").dropna(subset=[\"股票型(子类)\"])"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "e38ec99c-1674-41b2-a912-767b14b5795c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 3.78 s\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n", "\n",
"[938 rows x 15 columns]" " .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>SECURITYID</th>\n",
" <th>FDNAME</th>\n",
" <th>SNAMECOMP</th>\n",
" <th>FSYMBOL</th>\n",
" <th>FDNATURE</th>\n",
" <th>INVESTSTYLE</th>\n",
" <th>L1CODE</th>\n",
" <th>L1NAME</th>\n",
" <th>L2CODE</th>\n",
" <th>L2NAME</th>\n",
" <th>L3CODE</th>\n",
" <th>L3NAME</th>\n",
" <th>EQUITYINVERTO</th>\n",
" <th>ACCNETMKTCAP</th>\n",
" </tr>\n",
" <tr>\n",
" <th>股票型(子类)</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>增强指数型基金</th>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>45</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>63</td>\n",
" <td>60</td>\n",
" <td>63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>普通股票型基金</th>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>59</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>205</td>\n",
" <td>204</td>\n",
" <td>205</td>\n",
" </tr>\n",
" <tr>\n",
" <th>港股通股票型基金</th>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>8</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>被动指数型基金</th>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>202</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>328</td>\n",
" <td>315</td>\n",
" <td>328</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE INVESTSTYLE \\\n",
"股票型(子类) \n",
"增强指数型基金 63 63 45 63 63 63 \n",
"普通股票型基金 205 205 59 205 205 205 \n",
"港股通股票型基金 12 12 8 12 12 12 \n",
"被动指数型基金 328 328 202 328 328 328 \n",
"\n",
" L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME EQUITYINVERTO \\\n",
"股票型(子类) \n",
"增强指数型基金 63 63 63 63 63 63 60 \n",
"普通股票型基金 205 205 205 205 205 205 204 \n",
"港股通股票型基金 12 12 12 12 12 12 12 \n",
"被动指数型基金 328 328 328 328 328 328 315 \n",
"\n",
" ACCNETMKTCAP \n",
"股票型(子类) \n",
"增强指数型基金 63 \n",
"普通股票型基金 205 \n",
"港股通股票型基金 12 \n",
"被动指数型基金 328 "
] ]
}, },
"execution_count": 25, "execution_count": 86,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"df" "%%time\n",
"\n",
"create_stk_fund_info(\"20211109\").groupby(\"股票型(子类)\").count()"
]
},
{
"cell_type": "markdown",
"id": "65c52f84-9df5-4591-8f63-004711e75957",
"metadata": {},
"source": [
"# 2. 基金指数\n",
"-----------------"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 87,
"id": "025f28d5-c059-44ff-9d58-c8bb15912b4a", "id": "cf8394c6-c0d2-4c28-a803-7597fbebadb2",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": [
"# 我们只计算指数的每日收益\n",
"# 在确定指数的基准日之后,可以直接使用收益计算指数的值。\n",
"# 使用 TQ_FD_DERIVEDN 获取基金的净值情况\n",
"\n",
"start_dt = \"2015-01-31\"\n",
"final_trade_dt = \"2021-11-09\"\n",
"nav_type = \"REPAIRUNITNAV\"\n",
"\n",
"rebalance_dates = [d.strftime(\"%Y%m%d\") for d in makeSchedule(start_dt, final_trade_dt, tenor=\"3M\", calendar=\"china.sse\", dateRule=BizDayConventions.ModifiedFollowing)]"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "66cdd0ee-91e1-42eb-9b04-f958c9286ba7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20150130 20150430\n",
"20150430 20150731\n",
"20150731 20151030\n",
"20151030 20160129\n",
"20160129 20160429\n",
"20160429 20160729\n",
"20160729 20161031\n",
"20161031 20170126\n",
"20170126 20170428\n",
"20170428 20170731\n",
"20170731 20171031\n",
"20171031 20180131\n",
"20180131 20180427\n",
"20180427 20180731\n",
"20180731 20181031\n",
"20181031 20190131\n",
"20190131 20190430\n",
"20190430 20190731\n",
"20190731 20191031\n",
"20191031 20200123\n",
"20200123 20200430\n",
"20200430 20200731\n",
"20200731 20201030\n",
"20201030 20210129\n",
"20210129 20210430\n",
"20210430 20210730\n",
"20210730 20211029\n",
"20211029 20211109\n"
]
}
],
"source": [
"dfs = []\n",
"\n",
"for i, trade_dt in enumerate(rebalance_dates[1:]):\n",
" pre_trade_dt = rebalance_dates[i]\n",
" print(pre_trade_dt, trade_dt)\n",
" fund_info = create_stk_fund_info(trade_dt)\n",
" pre_nav_info = fd_derieden(fund_info.SECURITYID.tolist(), pre_trade_dt).rename(columns={nav_type: \"PRE\" + nav_type})\n",
" nav_info = fd_derieden(fund_info.SECURITYID.tolist(), trade_dt)\n",
"\n",
" total_df = pd.merge(fund_info, nav_info, on=[\"SECURITYID\"])\n",
" total_df = pd.merge(total_df, pre_nav_info, on=[\"SECURITYID\"])\n",
" total_df[\"chg.\"] = total_df[nav_type] / total_df[\"PRE\" + nav_type] - 1.0\n",
" res = total_df.groupby(\"股票型(子类)\")[[\"chg.\"]].mean()\n",
" dfs.append(res)"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "82b9db84-2b77-4311-a232-48bc03dd6d81",
"metadata": {},
"outputs": [],
"source": [
"final_report = pd.concat(dfs, keys=rebalance_dates[1:]).reset_index()\n",
"final_report.pivot_table(index=\"level_0\", columns=\"股票型(子类)\", values=\"chg.\").to_excel(\"010_股票型基金_bak.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "a6f34c58-5c01-4c27-b206-60efcf35302e",
"metadata": {},
"outputs": [
{
"data": {
"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>增强指数型基金</th>\n",
" <th>普通股票型基金</th>\n",
" <th>港股通股票型基金</th>\n",
" <th>被动指数型基金</th>\n",
" </tr>\n",
" <tr>\n",
" <th>level_0</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>20150430</th>\n",
" <td>0.373081</td>\n",
" <td>0.445309</td>\n",
" <td>NaN</td>\n",
" <td>0.399033</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20150731</th>\n",
" <td>-0.150522</td>\n",
" <td>-0.127085</td>\n",
" <td>NaN</td>\n",
" <td>-0.159062</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20151030</th>\n",
" <td>-0.062868</td>\n",
" <td>0.000142</td>\n",
" <td>NaN</td>\n",
" <td>-0.064587</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160129</th>\n",
" <td>-0.154214</td>\n",
" <td>-0.172297</td>\n",
" <td>NaN</td>\n",
" <td>-0.177011</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160429</th>\n",
" <td>0.088368</td>\n",
" <td>0.101380</td>\n",
" <td>NaN</td>\n",
" <td>0.084537</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160729</th>\n",
" <td>0.047092</td>\n",
" <td>0.055730</td>\n",
" <td>0.000000</td>\n",
" <td>0.037961</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20161031</th>\n",
" <td>0.041936</td>\n",
" <td>0.035465</td>\n",
" <td>0.033208</td>\n",
" <td>0.036679</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170126</th>\n",
" <td>0.000413</td>\n",
" <td>-0.035175</td>\n",
" <td>0.032578</td>\n",
" <td>-0.015172</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170428</th>\n",
" <td>0.017795</td>\n",
" <td>0.033252</td>\n",
" <td>0.079169</td>\n",
" <td>0.005582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170731</th>\n",
" <td>0.075612</td>\n",
" <td>0.048354</td>\n",
" <td>0.098230</td>\n",
" <td>0.049566</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20171031</th>\n",
" <td>0.064314</td>\n",
" <td>0.087513</td>\n",
" <td>0.048476</td>\n",
" <td>0.059402</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180131</th>\n",
" <td>0.035647</td>\n",
" <td>0.001016</td>\n",
" <td>0.066222</td>\n",
" <td>0.000188</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180427</th>\n",
" <td>-0.090244</td>\n",
" <td>-0.055925</td>\n",
" <td>-0.084825</td>\n",
" <td>-0.070153</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180731</th>\n",
" <td>-0.049883</td>\n",
" <td>-0.058483</td>\n",
" <td>-0.007869</td>\n",
" <td>-0.075832</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20181031</th>\n",
" <td>-0.125866</td>\n",
" <td>-0.154263</td>\n",
" <td>-0.143018</td>\n",
" <td>-0.127678</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190131</th>\n",
" <td>0.006905</td>\n",
" <td>0.017684</td>\n",
" <td>0.041734</td>\n",
" <td>-0.004245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190430</th>\n",
" <td>0.227508</td>\n",
" <td>0.234431</td>\n",
" <td>0.100768</td>\n",
" <td>0.232490</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190731</th>\n",
" <td>-0.002496</td>\n",
" <td>0.017587</td>\n",
" <td>-0.013597</td>\n",
" <td>-0.017734</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20191031</th>\n",
" <td>0.027008</td>\n",
" <td>0.071754</td>\n",
" <td>0.030307</td>\n",
" <td>0.021154</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200123</th>\n",
" <td>0.063628</td>\n",
" <td>0.122061</td>\n",
" <td>0.048563</td>\n",
" <td>0.072224</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200430</th>\n",
" <td>0.011756</td>\n",
" <td>0.039897</td>\n",
" <td>-0.044257</td>\n",
" <td>-0.003223</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200731</th>\n",
" <td>0.258409</td>\n",
" <td>0.332945</td>\n",
" <td>0.230487</td>\n",
" <td>0.252309</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20201030</th>\n",
" <td>-0.002921</td>\n",
" <td>0.012172</td>\n",
" <td>0.008833</td>\n",
" <td>-0.020099</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210129</th>\n",
" <td>0.116040</td>\n",
" <td>0.168308</td>\n",
" <td>0.190279</td>\n",
" <td>0.095697</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210430</th>\n",
" <td>-0.014573</td>\n",
" <td>-0.014868</td>\n",
" <td>-0.000492</td>\n",
" <td>-0.014275</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210730</th>\n",
" <td>-0.002418</td>\n",
" <td>0.081573</td>\n",
" <td>-0.044329</td>\n",
" <td>0.012424</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20211029</th>\n",
" <td>0.027797</td>\n",
" <td>0.009757</td>\n",
" <td>-0.033858</td>\n",
" <td>0.023799</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20211109</th>\n",
" <td>-0.007915</td>\n",
" <td>0.003048</td>\n",
" <td>-0.012938</td>\n",
" <td>-0.001889</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"股票型(子类) 增强指数型基金 普通股票型基金 港股通股票型基金 被动指数型基金\n",
"level_0 \n",
"20150430 0.373081 0.445309 NaN 0.399033\n",
"20150731 -0.150522 -0.127085 NaN -0.159062\n",
"20151030 -0.062868 0.000142 NaN -0.064587\n",
"20160129 -0.154214 -0.172297 NaN -0.177011\n",
"20160429 0.088368 0.101380 NaN 0.084537\n",
"20160729 0.047092 0.055730 0.000000 0.037961\n",
"20161031 0.041936 0.035465 0.033208 0.036679\n",
"20170126 0.000413 -0.035175 0.032578 -0.015172\n",
"20170428 0.017795 0.033252 0.079169 0.005582\n",
"20170731 0.075612 0.048354 0.098230 0.049566\n",
"20171031 0.064314 0.087513 0.048476 0.059402\n",
"20180131 0.035647 0.001016 0.066222 0.000188\n",
"20180427 -0.090244 -0.055925 -0.084825 -0.070153\n",
"20180731 -0.049883 -0.058483 -0.007869 -0.075832\n",
"20181031 -0.125866 -0.154263 -0.143018 -0.127678\n",
"20190131 0.006905 0.017684 0.041734 -0.004245\n",
"20190430 0.227508 0.234431 0.100768 0.232490\n",
"20190731 -0.002496 0.017587 -0.013597 -0.017734\n",
"20191031 0.027008 0.071754 0.030307 0.021154\n",
"20200123 0.063628 0.122061 0.048563 0.072224\n",
"20200430 0.011756 0.039897 -0.044257 -0.003223\n",
"20200731 0.258409 0.332945 0.230487 0.252309\n",
"20201030 -0.002921 0.012172 0.008833 -0.020099\n",
"20210129 0.116040 0.168308 0.190279 0.095697\n",
"20210430 -0.014573 -0.014868 -0.000492 -0.014275\n",
"20210730 -0.002418 0.081573 -0.044329 0.012424\n",
"20211029 0.027797 0.009757 -0.033858 0.023799\n",
"20211109 -0.007915 0.003048 -0.012938 -0.001889"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"final_report.pivot_table(index=\"level_0\", columns=\"股票型(子类)\", values=\"chg.\")"
]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "c9c557cf-2b92-402a-8c57-9711f42de08b", "id": "07844a5b-d5b0-47c3-a44f-960124e5b19a",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 1,
"id": "25a5db3d-4c9d-46e8-bd5a-88cca84280ba", "id": "25a5db3d-4c9d-46e8-bd5a-88cca84280ba",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -10,18 +10,31 @@ ...@@ -10,18 +10,31 @@
"import datetime as dt\n", "import datetime as dt\n",
"from utility import (\n", "from utility import (\n",
" read_sql,\n", " read_sql,\n",
" fd_alive_funds,\n",
" fd_basicinfo,\n", " fd_basicinfo,\n",
" fd_typeclass,\n", " fd_typeclass,\n",
" fd_hshkiport,\n", " fd_hshkiport,\n",
" fd_assetportfolio,\n", " fd_assetportfolio,\n",
" fd_derieden,\n",
" nearest_report_date\n", " nearest_report_date\n",
")\n", ")\n",
"import pandas as pd" "import pandas as pd\n",
"from PyFin.api import makeSchedule\n",
"from PyFin.api import BizDayConventions"
]
},
{
"cell_type": "markdown",
"id": "110e465c-cd92-4aa4-b7fd-03854679ef34",
"metadata": {},
"source": [
"# 1. 基金分类\n",
"-----------------------"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 2,
"id": "329e6a8c-4e60-43d7-8314-63cee4f9196a", "id": "329e6a8c-4e60-43d7-8314-63cee4f9196a",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -29,6 +42,7 @@ ...@@ -29,6 +42,7 @@
"# 获取回溯的报告日\n", "# 获取回溯的报告日\n",
"\n", "\n",
"today = dt.datetime.today()\n", "today = dt.datetime.today()\n",
"today = dt.date(2015, 1, 30)\n",
"date_3yrs_ago = today.replace(year=today.year - 3)\n", "date_3yrs_ago = today.replace(year=today.year - 3)\n",
"report_dates_begin = nearest_report_date(date_3yrs_ago.strftime(\"%Y%m%d\"))\n", "report_dates_begin = nearest_report_date(date_3yrs_ago.strftime(\"%Y%m%d\"))\n",
"current_date = today.strftime(\"%Y%m%d\")" "current_date = today.strftime(\"%Y%m%d\")"
...@@ -36,26 +50,19 @@ ...@@ -36,26 +50,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 3,
"id": "74246462-2676-4817-8c89-3a024ed8e412", "id": "74246462-2676-4817-8c89-3a024ed8e412",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# 获取所有目标混合型基金(清算结束日期晚于当前日)\n", "# 获取所有目标混合型基金(清算结束日期晚于当前日)\n",
"\n", "\n",
"security_ids = read_sql(f\"\"\"\n", "security_ids = fd_alive_funds(report_dates_begin, 2)"
"select SECURITYID from TQ_FD_TYPECLASS \n",
"WHERE\n",
" ISVALID = 1 AND\n",
" L1CODE = 2 AND\n",
" (ENDDATE>='{report_dates_begin}' or ENDDATE = '19000101') \n",
"ORDER BY SECURITYID;\n",
"\"\"\")[\"SECURITYID\"].unique().tolist()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": 4,
"id": "61270089-05d5-4396-829e-651118231b60", "id": "61270089-05d5-4396-829e-651118231b60",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -64,14 +71,14 @@ ...@@ -64,14 +71,14 @@
"\n", "\n",
"basic_info = fd_basicinfo(security_ids, current_date)\n", "basic_info = fd_basicinfo(security_ids, current_date)\n",
"type_info = fd_typeclass(security_ids, current_date)\n", "type_info = fd_typeclass(security_ids, current_date)\n",
"hkport_info = fd_hshkiport(security_ids, report_dates_begin)\n", "hkport_info = fd_hshkiport(security_ids, report_dates_begin, current_date)\n",
"hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n", "hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n",
"asset_port = fd_assetportfolio(security_ids, report_dates_begin).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()" "asset_port = fd_assetportfolio(security_ids, report_dates_begin, current_date).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": 5,
"id": "3968c35a-fa98-479b-a9e2-9cbeec4def1a", "id": "3968c35a-fa98-479b-a9e2-9cbeec4def1a",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
...@@ -79,27 +86,31 @@ ...@@ -79,27 +86,31 @@
"df = pd.merge(basic_info, type_info, on=\"SECURITYID\")\n", "df = pd.merge(basic_info, type_info, on=\"SECURITYID\")\n",
"df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n", "df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n",
"df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\")\n", "df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\")\n",
"df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)" "if \"ACCNETMKTCAP\" in df:\n",
" df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)\n",
"else:\n",
" df[\"ACCNETMKTCAP\"] = 0.0"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 18, "execution_count": 6,
"id": "73250ba3-83f4-41fe-8e61-2869f7db8662", "id": "73250ba3-83f4-41fe-8e61-2869f7db8662",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"# 分类\n", "# 分类\n",
"df.loc[df[\"EQUITYINVERTO\"] >= 70, \"混合型(子类)\"] = \"高权益仓位混合型基金\"\n", "flag = df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5\n",
"df.loc[((df[\"EQUITYINVERTO\"] >= 50) & (df[\"EQUITYINVERTO\"] < 70)), \"混合型(子类)\"] = \"中高权益仓位混合型基金\"\n", "df.loc[flag, \"混合型(子类)\"] = \"港股通混合型基金\"\n",
"df.loc[((df[\"EQUITYINVERTO\"] >= 30) & (df[\"EQUITYINVERTO\"] < 50)), \"混合型(子类)\"] = \"中权益仓位混合型基金\"\n", "df.loc[(~flag) & (df[\"EQUITYINVERTO\"] >= 70), \"混合型(子类)\"] = \"高权益仓位混合型基金\"\n",
"df.loc[((df[\"EQUITYINVERTO\"] >= 0) & (df[\"EQUITYINVERTO\"] < 30)), \"混合型(子类)\"] = \"低权益仓位混合型基金\"\n", "df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 50) & (df[\"EQUITYINVERTO\"] < 70)), \"混合型(子类)\"] = \"中高权益仓位混合型基金\"\n",
"df.loc[(df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5), \"混合型(子类)\"] = \"港股通混合型基金\"" "df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 30) & (df[\"EQUITYINVERTO\"] < 50)), \"混合型(子类)\"] = \"中权益仓位混合型基金\"\n",
"df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 0) & (df[\"EQUITYINVERTO\"] < 30)), \"混合型(子类)\"] = \"低权益仓位混合型基金\""
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": 7,
"id": "a27e2473-ddf5-4883-bb50-6fe46914d3da", "id": "a27e2473-ddf5-4883-bb50-6fe46914d3da",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
...@@ -124,61 +135,940 @@ ...@@ -124,61 +135,940 @@
" <thead>\n", " <thead>\n",
" <tr style=\"text-align: right;\">\n", " <tr style=\"text-align: right;\">\n",
" <th></th>\n", " <th></th>\n",
" <th>SECURITYID</th>\n",
" <th>FDNAME</th>\n",
" <th>SNAMECOMP</th>\n",
" <th>FSYMBOL</th>\n", " <th>FSYMBOL</th>\n",
" <th>FDNATURE</th>\n",
" <th>INVESTSTYLE</th>\n",
" <th>L1CODE</th>\n",
" <th>L1NAME</th>\n",
" <th>L2CODE</th>\n",
" <th>L2NAME</th>\n",
" <th>L3CODE</th>\n",
" <th>L3NAME</th>\n",
" <th>EQUITYINVERTO</th>\n",
" <th>ACCNETMKTCAP</th>\n",
" <th>混合型(子类)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1030000001</td>\n",
" <td>华夏复兴混合型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>000031</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.1</td>\n",
" <td>偏股型基金</td>\n",
" <td>2.1.1</td>\n",
" <td>偏股型基金(股票上限95%)</td>\n",
" <td>85.680000</td>\n",
" <td>0.0</td>\n",
" <td>高权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1030000001</td>\n",
" <td>华夏复兴混合型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>000031</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.1</td>\n",
" <td>偏股型基金</td>\n",
" <td>2.1.3</td>\n",
" <td>偏股型基金(股票上下限60%-95%)</td>\n",
" <td>85.680000</td>\n",
" <td>0.0</td>\n",
" <td>高权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1030000006</td>\n",
" <td>华夏成长证券投资基金</td>\n",
" <td>None</td>\n",
" <td>000001</td>\n",
" <td>证券投资基金</td>\n",
" <td>成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.1</td>\n",
" <td>偏股型基金</td>\n",
" <td>2.1.2</td>\n",
" <td>偏股型基金(股票上限80%)</td>\n",
" <td>65.283333</td>\n",
" <td>0.0</td>\n",
" <td>中高权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1030000007</td>\n",
" <td>华夏大盘精选证券投资基金</td>\n",
" <td>华夏大盘精选混合</td>\n",
" <td>000011</td>\n",
" <td>证券投资基金</td>\n",
" <td>增值型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.1</td>\n",
" <td>偏股型基金</td>\n",
" <td>2.1.1</td>\n",
" <td>偏股型基金(股票上限95%)</td>\n",
" <td>82.620833</td>\n",
" <td>0.0</td>\n",
" <td>高权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1030000008</td>\n",
" <td>华夏优势增长混合型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>000021</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.1</td>\n",
" <td>偏股型基金</td>\n",
" <td>2.1.1</td>\n",
" <td>偏股型基金(股票上限95%)</td>\n",
" <td>79.129167</td>\n",
" <td>0.0</td>\n",
" <td>高权益仓位混合型基金</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",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>255</th>\n",
" <td>1030000112</td>\n",
" <td>国投瑞银融华债券型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>121001</td>\n",
" <td>证券投资基金</td>\n",
" <td>收益型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.4</td>\n",
" <td>偏债型基金</td>\n",
" <td>2.4.1</td>\n",
" <td>偏债型基金</td>\n",
" <td>38.870833</td>\n",
" <td>0.0</td>\n",
" <td>中权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256</th>\n",
" <td>1030001114</td>\n",
" <td>银河强化收益债券型证券投资基金</td>\n",
" <td>None</td>\n",
" <td>519676</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>3</td>\n",
" <td>债券基金</td>\n",
" <td>3.2</td>\n",
" <td>普通债券型基金</td>\n",
" <td>3.2.3</td>\n",
" <td>普通债券型基金(二级A类)</td>\n",
" <td>10.041667</td>\n",
" <td>0.0</td>\n",
" <td>低权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>257</th>\n",
" <td>1030000124</td>\n",
" <td>银河收益证券投资基金</td>\n",
" <td>None</td>\n",
" <td>151002</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.4</td>\n",
" <td>偏债型基金</td>\n",
" <td>2.4.1</td>\n",
" <td>偏债型基金</td>\n",
" <td>5.093333</td>\n",
" <td>0.0</td>\n",
" <td>低权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>258</th>\n",
" <td>1030000180</td>\n",
" <td>南方宝元债券型基金</td>\n",
" <td>南方宝元债券</td>\n",
" <td>202101</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>2</td>\n",
" <td>混合基金</td>\n",
" <td>2.4</td>\n",
" <td>偏债型基金</td>\n",
" <td>2.4.1</td>\n",
" <td>偏债型基金</td>\n",
" <td>30.825000</td>\n",
" <td>0.0</td>\n",
" <td>中权益仓位混合型基金</td>\n",
" </tr>\n",
" <tr>\n",
" <th>259</th>\n",
" <td>1030001010</td>\n",
" <td>汇添富双利债券型证券投资基金</td>\n",
" <td>汇添富双利债券</td>\n",
" <td>470018</td>\n",
" <td>证券投资基金</td>\n",
" <td>稳健成长型</td>\n",
" <td>3</td>\n",
" <td>债券基金</td>\n",
" <td>3.2</td>\n",
" <td>普通债券型基金</td>\n",
" <td>3.2.3</td>\n",
" <td>普通债券型基金(二级A类)</td>\n",
" <td>5.393333</td>\n",
" <td>0.0</td>\n",
" <td>低权益仓位混合型基金</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>260 rows × 15 columns</p>\n",
"</div>"
],
"text/plain": [
" SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE INVESTSTYLE \\\n",
"0 1030000001 华夏复兴混合型证券投资基金 None 000031 证券投资基金 稳健成长型 \n",
"1 1030000001 华夏复兴混合型证券投资基金 None 000031 证券投资基金 稳健成长型 \n",
"2 1030000006 华夏成长证券投资基金 None 000001 证券投资基金 成长型 \n",
"3 1030000007 华夏大盘精选证券投资基金 华夏大盘精选混合 000011 证券投资基金 增值型 \n",
"4 1030000008 华夏优势增长混合型证券投资基金 None 000021 证券投资基金 稳健成长型 \n",
".. ... ... ... ... ... ... \n",
"255 1030000112 国投瑞银融华债券型证券投资基金 None 121001 证券投资基金 收益型 \n",
"256 1030001114 银河强化收益债券型证券投资基金 None 519676 证券投资基金 稳健成长型 \n",
"257 1030000124 银河收益证券投资基金 None 151002 证券投资基金 稳健成长型 \n",
"258 1030000180 南方宝元债券型基金 南方宝元债券 202101 证券投资基金 稳健成长型 \n",
"259 1030001010 汇添富双利债券型证券投资基金 汇添富双利债券 470018 证券投资基金 稳健成长型 \n",
"\n",
" L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME EQUITYINVERTO \\\n",
"0 2 混合基金 2.1 偏股型基金 2.1.1 偏股型基金(股票上限95%) 85.680000 \n",
"1 2 混合基金 2.1 偏股型基金 2.1.3 偏股型基金(股票上下限60%-95%) 85.680000 \n",
"2 2 混合基金 2.1 偏股型基金 2.1.2 偏股型基金(股票上限80%) 65.283333 \n",
"3 2 混合基金 2.1 偏股型基金 2.1.1 偏股型基金(股票上限95%) 82.620833 \n",
"4 2 混合基金 2.1 偏股型基金 2.1.1 偏股型基金(股票上限95%) 79.129167 \n",
".. ... ... ... ... ... ... ... \n",
"255 2 混合基金 2.4 偏债型基金 2.4.1 偏债型基金 38.870833 \n",
"256 3 债券基金 3.2 普通债券型基金 3.2.3 普通债券型基金(二级A类) 10.041667 \n",
"257 2 混合基金 2.4 偏债型基金 2.4.1 偏债型基金 5.093333 \n",
"258 2 混合基金 2.4 偏债型基金 2.4.1 偏债型基金 30.825000 \n",
"259 3 债券基金 3.2 普通债券型基金 3.2.3 普通债券型基金(二级A类) 5.393333 \n",
"\n",
" ACCNETMKTCAP 混合型(子类) \n",
"0 0.0 高权益仓位混合型基金 \n",
"1 0.0 高权益仓位混合型基金 \n",
"2 0.0 中高权益仓位混合型基金 \n",
"3 0.0 高权益仓位混合型基金 \n",
"4 0.0 高权益仓位混合型基金 \n",
".. ... ... \n",
"255 0.0 中权益仓位混合型基金 \n",
"256 0.0 低权益仓位混合型基金 \n",
"257 0.0 低权益仓位混合型基金 \n",
"258 0.0 中权益仓位混合型基金 \n",
"259 0.0 低权益仓位混合型基金 \n",
"\n",
"[260 rows x 15 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"id": "59633604-5bb5-474c-a352-d89c9020eb54",
"metadata": {},
"source": [
"## 1.1 Put it all totether"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "5f31e54e-ab9d-48b8-a207-8841062ec4e1",
"metadata": {},
"outputs": [],
"source": [
"def create_mutua_fund_info(trade_dt):\n",
" trade_dt = dt.datetime.strptime(trade_dt, \"%Y%m%d\")\n",
" date_3yrs_ago = trade_dt.replace(year=trade_dt.year - 3)\n",
" report_dates_begin = nearest_report_date(date_3yrs_ago.strftime(\"%Y%m%d\"))\n",
" current_date = trade_dt.strftime(\"%Y%m%d\")\n",
" \n",
" security_ids = fd_alive_funds(report_dates_begin, 2)\n",
" basic_info = fd_basicinfo(security_ids, current_date)\n",
" type_info = fd_typeclass(security_ids, current_date)\n",
" hkport_info = fd_hshkiport(security_ids, report_dates_begin, current_date)\n",
" hkport_info = hkport_info[hkport_info.INDUSTRYNAME == \"合计\"].groupby([\"SECURITYID\"], as_index=False)[[\"ACCNETMKTCAP\"]].mean()\n",
" asset_port = fd_assetportfolio(security_ids, report_dates_begin, current_date).groupby(\"SECURITYID\", as_index=False)[[\"EQUITYINVERTO\"]].mean()\n",
"\n",
" df = pd.merge(basic_info, type_info, on=\"SECURITYID\")\n",
" df = pd.merge(df, asset_port, on=\"SECURITYID\", how=\"left\")\n",
" df = pd.merge(df, hkport_info, on=\"SECURITYID\", how=\"left\").drop_duplicates()\n",
" if \"ACCNETMKTCAP\" in df:\n",
" df[\"ACCNETMKTCAP\"] = df[\"ACCNETMKTCAP\"].fillna(0)\n",
" else:\n",
" df[\"ACCNETMKTCAP\"] = 0.0\n",
" \n",
" flag = df[\"ACCNETMKTCAP\"] / df[\"EQUITYINVERTO\"] > 0.5\n",
" df.loc[flag, \"混合型(子类)\"] = \"港股通混合型基金\"\n",
" df.loc[(~flag) & (df[\"EQUITYINVERTO\"] >= 70), \"混合型(子类)\"] = \"高权益仓位混合型基金\"\n",
" df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 50) & (df[\"EQUITYINVERTO\"] < 70)), \"混合型(子类)\"] = \"中高权益仓位混合型基金\"\n",
" df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 30) & (df[\"EQUITYINVERTO\"] < 50)), \"混合型(子类)\"] = \"中权益仓位混合型基金\"\n",
" df.loc[((~flag) & (df[\"EQUITYINVERTO\"] >= 0) & (df[\"EQUITYINVERTO\"] < 30)), \"混合型(子类)\"] = \"低权益仓位混合型基金\"\n",
" \n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "8ef7a124-f9c5-4afc-b35f-44571dea387e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 4.83 s\n"
]
},
{
"data": {
"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>SECURITYID</th>\n",
" <th>FDNAME</th>\n",
" <th>SNAMECOMP</th>\n",
" <th>FSYMBOL</th>\n",
" <th>FDNATURE</th>\n",
" <th>INVESTSTYLE</th>\n",
" <th>L1CODE</th>\n",
" <th>L1NAME</th>\n",
" <th>L2CODE</th>\n",
" <th>L2NAME</th>\n",
" <th>L3CODE</th>\n",
" <th>L3NAME</th>\n",
" <th>EQUITYINVERTO</th>\n",
" <th>ACCNETMKTCAP</th>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>混合型(子类)</th>\n", " <th>混合型(子类)</th>\n",
" <th></th>\n", " <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n", " </tr>\n",
" </thead>\n", " </thead>\n",
" <tbody>\n", " <tbody>\n",
" <tr>\n", " <tr>\n",
" <th>中权益仓位混合型基金</th>\n", " <th>中权益仓位混合型基金</th>\n",
" <td>167</td>\n", " <td>143</td>\n",
" <td>143</td>\n",
" <td>103</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" <td>143</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>中高权益仓位混合型基金</th>\n", " <th>中高权益仓位混合型基金</th>\n",
" <td>240</td>\n", " <td>196</td>\n",
" <td>196</td>\n",
" <td>103</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" <td>196</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>低权益仓位混合型基金</th>\n", " <th>低权益仓位混合型基金</th>\n",
" <td>625</td>\n", " <td>507</td>\n",
" <td>507</td>\n",
" <td>425</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" <td>507</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>港股通混合型基金</th>\n", " <th>港股通混合型基金</th>\n",
" <td>17</td>\n", " <td>17</td>\n",
" <td>17</td>\n",
" <td>6</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" <td>17</td>\n",
" </tr>\n", " </tr>\n",
" <tr>\n", " <tr>\n",
" <th>高权益仓位混合型基金</th>\n", " <th>高权益仓位混合型基金</th>\n",
" <td>1661</td>\n", " <td>1190</td>\n",
" <td>1190</td>\n",
" <td>411</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" <td>1190</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" SECURITYID FDNAME SNAMECOMP FSYMBOL FDNATURE INVESTSTYLE \\\n",
"混合型(子类) \n",
"中权益仓位混合型基金 143 143 103 143 143 143 \n",
"中高权益仓位混合型基金 196 196 103 196 196 196 \n",
"低权益仓位混合型基金 507 507 425 507 507 507 \n",
"港股通混合型基金 17 17 6 17 17 17 \n",
"高权益仓位混合型基金 1190 1190 411 1190 1190 1190 \n",
"\n",
" L1CODE L1NAME L2CODE L2NAME L3CODE L3NAME EQUITYINVERTO \\\n",
"混合型(子类) \n",
"中权益仓位混合型基金 143 143 143 143 143 143 143 \n",
"中高权益仓位混合型基金 196 196 196 196 196 196 196 \n",
"低权益仓位混合型基金 507 507 507 507 507 507 507 \n",
"港股通混合型基金 17 17 17 17 17 17 17 \n",
"高权益仓位混合型基金 1190 1190 1190 1190 1190 1190 1190 \n",
"\n",
" ACCNETMKTCAP \n",
"混合型(子类) \n",
"中权益仓位混合型基金 143 \n",
"中高权益仓位混合型基金 196 \n",
"低权益仓位混合型基金 507 \n",
"港股通混合型基金 17 \n",
"高权益仓位混合型基金 1190 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"\n",
"create_mutua_fund_info(\"20211111\").groupby( \"混合型(子类)\").count()"
]
},
{
"cell_type": "markdown",
"id": "83ff48ac-58f9-408f-a1f1-ade700a4ce76",
"metadata": {},
"source": [
"# 2. 基金指数\n",
"-----------------"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e6eb55c1-8e3e-4acf-a788-90e30d26623c",
"metadata": {},
"outputs": [],
"source": [
"# 我们只计算指数的每日收益\n",
"# 在确定指数的基准日之后,可以直接使用收益计算指数的值。\n",
"# 使用 TQ_FD_DERIVEDN 获取基金的净值情况\n",
"\n",
"start_dt = \"2015-01-31\"\n",
"final_trade_dt = \"2021-11-09\"\n",
"nav_type = \"REPAIRUNITNAV\"\n",
"\n",
"rebalance_dates = [d.strftime(\"%Y%m%d\") for d in makeSchedule(start_dt, final_trade_dt, tenor=\"3M\", calendar=\"china.sse\", dateRule=BizDayConventions.ModifiedFollowing)]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2b724151-9978-4130-8103-4eae0485c3e9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20150130 20150430\n",
"20150430 20150731\n",
"20150731 20151030\n",
"20151030 20160129\n",
"20160129 20160429\n",
"20160429 20160729\n",
"20160729 20161031\n",
"20161031 20170126\n",
"20170126 20170428\n",
"20170428 20170731\n",
"20170731 20171031\n",
"20171031 20180131\n",
"20180131 20180427\n",
"20180427 20180731\n",
"20180731 20181031\n",
"20181031 20190131\n",
"20190131 20190430\n",
"20190430 20190731\n",
"20190731 20191031\n",
"20191031 20200123\n",
"20200123 20200430\n",
"20200430 20200731\n",
"20200731 20201030\n",
"20201030 20210129\n",
"20210129 20210430\n",
"20210430 20210730\n",
"20210730 20211029\n",
"20211029 20211109\n"
]
}
],
"source": [
"dfs = []\n",
"\n",
"for i, trade_dt in enumerate(rebalance_dates[1:]):\n",
" pre_trade_dt = rebalance_dates[i]\n",
" print(pre_trade_dt, trade_dt)\n",
" fund_info = create_mutua_fund_info(trade_dt)\n",
" pre_nav_info = fd_derieden(fund_info.SECURITYID.tolist(), pre_trade_dt).rename(columns={nav_type: \"PRE\" + nav_type})\n",
" nav_info = fd_derieden(fund_info.SECURITYID.tolist(), trade_dt)\n",
"\n",
" total_df = pd.merge(fund_info, nav_info, on=[\"SECURITYID\"])\n",
" total_df = pd.merge(total_df, pre_nav_info, on=[\"SECURITYID\"])\n",
" total_df[\"chg.\"] = total_df[nav_type] / total_df[\"PRE\" + nav_type] - 1.0\n",
" res = total_df.groupby(\"混合型(子类)\")[[\"chg.\"]].mean()\n",
" dfs.append(res)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "7c174454-776a-4089-be7b-dc3a06f1a071",
"metadata": {},
"outputs": [],
"source": [
"final_report = pd.concat(dfs, keys=rebalance_dates[1:]).reset_index()\n",
"final_report.pivot_table(index=\"level_0\", columns=\"混合型(子类)\", values=\"chg.\").to_excel(\"020_混合型基金_bak.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "a8f023ed-d9ce-4d0d-9efc-a3f76c0c434e",
"metadata": {},
"outputs": [
{
"data": {
"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>中权益仓位混合型基金</th>\n",
" <th>中高权益仓位混合型基金</th>\n",
" <th>低权益仓位混合型基金</th>\n",
" <th>港股通混合型基金</th>\n",
" <th>高权益仓位混合型基金</th>\n",
" </tr>\n",
" <tr>\n",
" <th>level_0</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>20150430</th>\n",
" <td>0.158706</td>\n",
" <td>0.340919</td>\n",
" <td>0.104259</td>\n",
" <td>NaN</td>\n",
" <td>0.404668</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20150731</th>\n",
" <td>-0.035837</td>\n",
" <td>-0.068951</td>\n",
" <td>0.003793</td>\n",
" <td>NaN</td>\n",
" <td>-0.119720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20151030</th>\n",
" <td>-0.000123</td>\n",
" <td>0.007219</td>\n",
" <td>0.001074</td>\n",
" <td>NaN</td>\n",
" <td>-0.010361</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160129</th>\n",
" <td>-0.069494</td>\n",
" <td>-0.116434</td>\n",
" <td>-0.016718</td>\n",
" <td>NaN</td>\n",
" <td>-0.161958</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160429</th>\n",
" <td>0.049689</td>\n",
" <td>0.073769</td>\n",
" <td>0.013842</td>\n",
" <td>NaN</td>\n",
" <td>0.084470</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20160729</th>\n",
" <td>0.028211</td>\n",
" <td>0.033609</td>\n",
" <td>0.016797</td>\n",
" <td>NaN</td>\n",
" <td>0.037625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20161031</th>\n",
" <td>0.026168</td>\n",
" <td>0.022514</td>\n",
" <td>0.012184</td>\n",
" <td>NaN</td>\n",
" <td>0.025027</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170126</th>\n",
" <td>-0.027615</td>\n",
" <td>-0.026839</td>\n",
" <td>-0.007877</td>\n",
" <td>NaN</td>\n",
" <td>-0.041254</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170428</th>\n",
" <td>0.008647</td>\n",
" <td>0.033472</td>\n",
" <td>0.007420</td>\n",
" <td>NaN</td>\n",
" <td>0.033349</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20170731</th>\n",
" <td>0.031883</td>\n",
" <td>0.033564</td>\n",
" <td>0.021043</td>\n",
" <td>NaN</td>\n",
" <td>0.034400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20171031</th>\n",
" <td>0.048306</td>\n",
" <td>0.077241</td>\n",
" <td>0.024545</td>\n",
" <td>NaN</td>\n",
" <td>0.083473</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180131</th>\n",
" <td>0.021488</td>\n",
" <td>0.022060</td>\n",
" <td>0.017642</td>\n",
" <td>NaN</td>\n",
" <td>0.000540</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180427</th>\n",
" <td>-0.056714</td>\n",
" <td>-0.055636</td>\n",
" <td>-0.019904</td>\n",
" <td>-0.076295</td>\n",
" <td>-0.060565</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20180731</th>\n",
" <td>-0.030961</td>\n",
" <td>-0.038046</td>\n",
" <td>-0.004138</td>\n",
" <td>0.013507</td>\n",
" <td>-0.052843</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20181031</th>\n",
" <td>-0.090266</td>\n",
" <td>-0.115356</td>\n",
" <td>-0.022268</td>\n",
" <td>-0.107380</td>\n",
" <td>-0.146404</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190131</th>\n",
" <td>0.013078</td>\n",
" <td>0.010755</td>\n",
" <td>0.015465</td>\n",
" <td>0.022036</td>\n",
" <td>0.012297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190430</th>\n",
" <td>0.105636</td>\n",
" <td>0.178514</td>\n",
" <td>0.042897</td>\n",
" <td>0.149138</td>\n",
" <td>0.217983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20190731</th>\n",
" <td>0.017517</td>\n",
" <td>0.016684</td>\n",
" <td>0.023167</td>\n",
" <td>-0.020537</td>\n",
" <td>0.016632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20191031</th>\n",
" <td>0.043256</td>\n",
" <td>0.049355</td>\n",
" <td>0.017903</td>\n",
" <td>0.039588</td>\n",
" <td>0.075795</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200123</th>\n",
" <td>0.064860</td>\n",
" <td>0.083217</td>\n",
" <td>0.031383</td>\n",
" <td>0.051023</td>\n",
" <td>0.110758</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200430</th>\n",
" <td>0.024767</td>\n",
" <td>0.034289</td>\n",
" <td>0.021946</td>\n",
" <td>0.004451</td>\n",
" <td>0.042561</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20200731</th>\n",
" <td>0.142981</td>\n",
" <td>0.237062</td>\n",
" <td>0.066755</td>\n",
" <td>0.229331</td>\n",
" <td>0.314872</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20201030</th>\n",
" <td>0.010262</td>\n",
" <td>0.006345</td>\n",
" <td>0.014590</td>\n",
" <td>0.007205</td>\n",
" <td>0.001186</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210129</th>\n",
" <td>0.072701</td>\n",
" <td>0.121873</td>\n",
" <td>0.038705</td>\n",
" <td>0.187807</td>\n",
" <td>0.155200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210430</th>\n",
" <td>-0.000810</td>\n",
" <td>-0.014574</td>\n",
" <td>0.007606</td>\n",
" <td>-0.019498</td>\n",
" <td>-0.017729</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20210730</th>\n",
" <td>0.029281</td>\n",
" <td>0.049804</td>\n",
" <td>0.017636</td>\n",
" <td>-0.027494</td>\n",
" <td>0.085796</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20211029</th>\n",
" <td>0.016123</td>\n",
" <td>0.012236</td>\n",
" <td>0.015305</td>\n",
" <td>-0.016214</td>\n",
" <td>0.013323</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20211109</th>\n",
" <td>-0.000163</td>\n",
" <td>0.001466</td>\n",
" <td>0.001518</td>\n",
" <td>-0.017195</td>\n",
" <td>0.003296</td>\n",
" </tr>\n", " </tr>\n",
" </tbody>\n", " </tbody>\n",
"</table>\n", "</table>\n",
"</div>" "</div>"
], ],
"text/plain": [ "text/plain": [
" FSYMBOL\n", "混合型(子类) 中权益仓位混合型基金 中高权益仓位混合型基金 低权益仓位混合型基金 港股通混合型基金 高权益仓位混合型基金\n",
"混合型(子类) \n", "level_0 \n",
"中权益仓位混合型基金 167\n", "20150430 0.158706 0.340919 0.104259 NaN 0.404668\n",
"中高权益仓位混合型基金 240\n", "20150731 -0.035837 -0.068951 0.003793 NaN -0.119720\n",
"低权益仓位混合型基金 625\n", "20151030 -0.000123 0.007219 0.001074 NaN -0.010361\n",
"港股通混合型基金 17\n", "20160129 -0.069494 -0.116434 -0.016718 NaN -0.161958\n",
"高权益仓位混合型基金 1661" "20160429 0.049689 0.073769 0.013842 NaN 0.084470\n",
"20160729 0.028211 0.033609 0.016797 NaN 0.037625\n",
"20161031 0.026168 0.022514 0.012184 NaN 0.025027\n",
"20170126 -0.027615 -0.026839 -0.007877 NaN -0.041254\n",
"20170428 0.008647 0.033472 0.007420 NaN 0.033349\n",
"20170731 0.031883 0.033564 0.021043 NaN 0.034400\n",
"20171031 0.048306 0.077241 0.024545 NaN 0.083473\n",
"20180131 0.021488 0.022060 0.017642 NaN 0.000540\n",
"20180427 -0.056714 -0.055636 -0.019904 -0.076295 -0.060565\n",
"20180731 -0.030961 -0.038046 -0.004138 0.013507 -0.052843\n",
"20181031 -0.090266 -0.115356 -0.022268 -0.107380 -0.146404\n",
"20190131 0.013078 0.010755 0.015465 0.022036 0.012297\n",
"20190430 0.105636 0.178514 0.042897 0.149138 0.217983\n",
"20190731 0.017517 0.016684 0.023167 -0.020537 0.016632\n",
"20191031 0.043256 0.049355 0.017903 0.039588 0.075795\n",
"20200123 0.064860 0.083217 0.031383 0.051023 0.110758\n",
"20200430 0.024767 0.034289 0.021946 0.004451 0.042561\n",
"20200731 0.142981 0.237062 0.066755 0.229331 0.314872\n",
"20201030 0.010262 0.006345 0.014590 0.007205 0.001186\n",
"20210129 0.072701 0.121873 0.038705 0.187807 0.155200\n",
"20210430 -0.000810 -0.014574 0.007606 -0.019498 -0.017729\n",
"20210730 0.029281 0.049804 0.017636 -0.027494 0.085796\n",
"20211029 0.016123 0.012236 0.015305 -0.016214 0.013323\n",
"20211109 -0.000163 0.001466 0.001518 -0.017195 0.003296"
] ]
}, },
"execution_count": 19, "execution_count": 13,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"df.groupby(\"混合型(子类)\")[[\"FSYMBOL\"]].count()" "final_report.pivot_table(index=\"level_0\", columns=\"混合型(子类)\", values=\"chg.\")"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "653f4b5e-1063-4b2a-b03d-b35146a82cfc", "id": "8022e212-9a89-4c54-8c49-1584beb8f9dc",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "e2772efb-b504-4f42-ad20-f36ab8895f80",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
......
...@@ -24,6 +24,29 @@ def nearest_report_date(date): ...@@ -24,6 +24,29 @@ def nearest_report_date(date):
return dt.date(last_year, q, last).strftime("%Y%m%d") return dt.date(last_year, q, last).strftime("%Y%m%d")
def fd_alive_funds(trade_dt, l1_code=None):
if l1_code is not None:
security_ids = read_sql(f"""
select SECURITYID from TQ_FD_TYPECLASS
WHERE
ISVALID = 1 AND
L1CODE = {l1_code} AND
BEGINDATE <= '{trade_dt}' AND
(ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
ORDER BY SECURITYID;
""")["SECURITYID"].unique().tolist()
else:
security_ids = read_sql(f"""
select SECURITYID from TQ_FD_TYPECLASS
WHERE
ISVALID = 1 AND
BEGINDATE <= '{trade_dt}' AND
(ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
ORDER BY SECURITYID;
""")["SECURITYID"].unique().tolist()
return security_ids
def fd_basicinfo(security_ids=None, trade_dt=None): def fd_basicinfo(security_ids=None, trade_dt=None):
if not trade_dt: if not trade_dt:
trade_dt = dt.datetime.today().strftime("%Y%m%d") trade_dt = dt.datetime.today().strftime("%Y%m%d")
...@@ -70,40 +93,77 @@ def fd_typeclass(security_ids, trade_dt=None): ...@@ -70,40 +93,77 @@ def fd_typeclass(security_ids, trade_dt=None):
select SECURITYID, L1CODE, L1NAME, L2CODE, L2NAME, L3CODE, L3NAME from TQ_FD_TYPECLASS select SECURITYID, L1CODE, L1NAME, L2CODE, L2NAME, L3CODE, L3NAME from TQ_FD_TYPECLASS
WHERE WHERE
ISVALID = 1 AND ISVALID = 1 AND
SECURITYID in ({sec_id_strs}) SECURITYID in ({sec_id_strs}) AND
(ENDDATE >= '{trade_dt}' or ENDDATE = '19000101')
""" """
return read_sql(query) return read_sql(query)
def fd_hshkiport(security_ids, report_dates_begin): def fd_hshkiport(security_ids, report_dates_begin, report_dates_end=None):
if isinstance(security_ids, str): if isinstance(security_ids, str):
sec_id_strs = security_ids sec_id_strs = security_ids
else: else:
sec_id_strs = ",".join(["'" + s + "'" for s in security_ids]) sec_id_strs = ",".join(["'" + s + "'" for s in security_ids])
query = f""" if report_dates_end:
select SECODE as SECURITYID, INDCLASSCODE, INDUSTRYCODE, INDUSTRYNAME, REPORTDATE, MVALUE, ACCNETMKTCAP from TQ_FD_HSHKIPORT query = f"""
WHERE select SECODE as SECURITYID, INDCLASSCODE, INDUSTRYCODE, INDUSTRYNAME, REPORTDATE, MVALUE, ACCNETMKTCAP from TQ_FD_HSHKIPORT
REPORTDATE >= '{report_dates_begin}' AND WHERE
ISVALID = 1 AND REPORTDATE >= '{report_dates_begin}' AND
INDCLASSCODE = '2102' AND REPORTDATE <= '{report_dates_end}' AND
SECODE in ({sec_id_strs}) ISVALID = 1 AND
""" INDCLASSCODE = '2102' AND
SECODE in ({sec_id_strs})
"""
else:
query = f"""
select SECODE as SECURITYID, INDCLASSCODE, INDUSTRYCODE, INDUSTRYNAME, REPORTDATE, MVALUE, ACCNETMKTCAP from TQ_FD_HSHKIPORT
WHERE
REPORTDATE >= '{report_dates_begin}' AND
ISVALID = 1 AND
INDCLASSCODE = '2102' AND
SECODE in ({sec_id_strs})
"""
return read_sql(query).sort_values("SECURITYID") return read_sql(query).sort_values("SECURITYID")
def fd_assetportfolio(security_ids, report_dates_begin): def fd_assetportfolio(security_ids, report_dates_begin, report_dates_end=None):
# 获取相关组合情况 # 获取相关组合情况
if isinstance(security_ids, str): if isinstance(security_ids, str):
sec_id_strs = security_ids sec_id_strs = security_ids
else: else:
sec_id_strs = ",".join(["'" + s + "'" for s in security_ids]) sec_id_strs = ",".join(["'" + s + "'" for s in security_ids])
if report_dates_end:
query = f"""
SELECT SECURITYID, REPORTDATE, BDRTO, CONVBDRTO, EQUITYINVERTO from TQ_FD_ASSETPORTFOLIO
WHERE
REPORTDATE >= '{report_dates_begin}' AND
REPORTDATE <= '{report_dates_end}' AND
ISVALID = 1 AND
SECURITYID in ({sec_id_strs})
"""
else:
query = f"""
SELECT SECURITYID, REPORTDATE, BDRTO, CONVBDRTO, EQUITYINVERTO from TQ_FD_ASSETPORTFOLIO
WHERE
REPORTDATE >= '{report_dates_begin}' AND
ISVALID = 1 AND
SECURITYID in ({sec_id_strs})
"""
return read_sql(query).sort_values("SECURITYID")
def fd_derieden(security_ids, trade_dt):
if isinstance(security_ids, str):
sec_id_strs = security_ids
else:
sec_id_strs = ",".join(["'" + s + "'" for s in security_ids])
query = f""" query = f"""
SELECT SECURITYID, REPORTDATE, BDRTO, CONVBDRTO, EQUITYINVERTO from TQ_FD_ASSETPORTFOLIO SELECT SECURITYID, UNITNAV, UNITACCNAV, REPAIRUNITNAV, NAVGRTD from TQ_FD_DERIVEDN
WHERE WHERE
REPORTDATE >= '{report_dates_begin}' AND ENDDATE = '{trade_dt}' AND
ISVALID = 1 AND ISVALID = 1 AND
SECURITYID in ({sec_id_strs}) SECURITYID in ({sec_id_strs})
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment