Commit 77cc7cfd authored by Dr.李's avatar Dr.李

update algorithms

parent 2efc48ff
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 13,
"id": "6470d267-ad02-44e2-acc3-e1427f606a82",
"metadata": {},
"outputs": [],
......@@ -26,18 +26,20 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 31,
"id": "73399fb6-ea5c-48bb-872d-a35b555c1b00",
"metadata": {},
"outputs": [],
"source": [
"trade_dt = adjustDateByCalendar(\"china.sse\", \"2021-06-30\").strftime(\"%Y%m%d\")\n",
"model = \"short\""
"trade_dt = \"2021-06-30\"\n",
"adjust_trade_dt = adjustDateByCalendar(\"china.sse\", trade_dt).strftime(\"%Y-%m-%d\")\n",
"trade_end_dt = \"2021-09-30\"\n",
"adjust_trade_end_dt = adjustDateByCalendar(\"china.sse\", trade_end_dt).strftime(\"%Y-%m-%d\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 32,
"id": "b547e094-4e2a-4ce8-b6c3-16b84f7d7d43",
"metadata": {},
"outputs": [
......@@ -62,93 +64,95 @@
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pid</th>\n",
" <th>security_code</th>\n",
" <th>SKNAME</th>\n",
" <th>HOLDMKTCAP</th>\n",
" <th>HOLDAMT</th>\n",
" <th>NAVRTO</th>\n",
" <th>weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1030000006</td>\n",
" <td>2010000045</td>\n",
" <td>海信视像</td>\n",
" <td>71468410.0</td>\n",
" <td>4228900.0</td>\n",
" <td>1.61</td>\n",
" <td>0.021116</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1030000006</td>\n",
" <td>2010000121</td>\n",
" <td>中青旅</td>\n",
" <td>33714502.5</td>\n",
" <td>3210905.0</td>\n",
" <td>0.76</td>\n",
" <td>0.009961</td>\n",
" <th>12</th>\n",
" <td>2010001333</td>\n",
" <td>0.142966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1030000006</td>\n",
" <td>2010000171</td>\n",
" <td>复星医药</td>\n",
" <td>48781519.0</td>\n",
" <td>676300.0</td>\n",
" <td>1.10</td>\n",
" <td>0.014413</td>\n",
" <th>39</th>\n",
" <td>2010029450</td>\n",
" <td>0.105894</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1030000006</td>\n",
" <td>2010000377</td>\n",
" <td>片仔癀</td>\n",
" <td>89447057.5</td>\n",
" <td>199525.0</td>\n",
" <td>2.02</td>\n",
" <td>0.026428</td>\n",
" <th>41</th>\n",
" <td>2010030168</td>\n",
" <td>0.103439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1030000006</td>\n",
" <td>2010000438</td>\n",
" <td>贵州茅台</td>\n",
" <td>136307792.5</td>\n",
" <td>66275.0</td>\n",
" <td>3.08</td>\n",
" <td>0.040273</td>\n",
" <td>0.101700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>2010001111</td>\n",
" <td>0.099646</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>2010003333</td>\n",
" <td>0.098622</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>2010030642</td>\n",
" <td>0.089532</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>2010022818</td>\n",
" <td>0.088176</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>2010001684</td>\n",
" <td>0.087206</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <td>2010031726</td>\n",
" <td>0.082818</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" pid security_code SKNAME HOLDMKTCAP HOLDAMT NAVRTO weight\n",
"0 1030000006 2010000045 海信视像 71468410.0 4228900.0 1.61 0.021116\n",
"1 1030000006 2010000121 中青旅 33714502.5 3210905.0 0.76 0.009961\n",
"2 1030000006 2010000171 复星医药 48781519.0 676300.0 1.10 0.014413\n",
"3 1030000006 2010000377 片仔癀 89447057.5 199525.0 2.02 0.026428\n",
"4 1030000006 2010000438 贵州茅台 136307792.5 66275.0 3.08 0.040273"
" security_code weight\n",
"12 2010001333 0.142966\n",
"39 2010029450 0.105894\n",
"41 2010030168 0.103439\n",
"4 2010000438 0.101700\n",
"9 2010001111 0.099646\n",
"16 2010003333 0.098622\n",
"42 2010030642 0.089532\n",
"32 2010022818 0.088176\n",
"14 2010001684 0.087206\n",
"44 2010031726 0.082818"
]
},
"execution_count": 4,
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 获取指定基金在基准日的持仓(portfolio date)\n",
"portfolio = fd_skdetail(\"1030000006\", trade_dt=trade_dt)\n",
"portfolio.head()"
"base_portfolio = fd_skdetail(\"1030000006\", trade_dt=trade_dt)\n",
"base_portfolio = base_portfolio[[\"security_code\", \"weight\"]].sort_values(\"weight\", ascending=False)[:10]\n",
"base_portfolio[\"weight\"] /= base_portfolio[\"weight\"].sum()\n",
"base_portfolio"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 33,
"id": "470f668b-3547-4b49-8597-9d001ae8f9a7",
"metadata": {},
"outputs": [
......@@ -198,17 +202,17 @@
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000045</td>\n",
" <td>-0.017</td>\n",
" <td>-0.340</td>\n",
" <td>-0.841</td>\n",
" <td>-0.234</td>\n",
" <td>-0.041</td>\n",
" <td>-0.696</td>\n",
" <td>0.755</td>\n",
" <td>-0.586</td>\n",
" <th>635</th>\n",
" <td>2021-09-29</td>\n",
" <td>2010022818</td>\n",
" <td>1.815</td>\n",
" <td>0.450</td>\n",
" <td>0.570</td>\n",
" <td>-1.269</td>\n",
" <td>-0.327</td>\n",
" <td>0.531</td>\n",
" <td>-1.246</td>\n",
" <td>-1.449</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
......@@ -222,17 +226,17 @@
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000121</td>\n",
" <td>-1.274</td>\n",
" <td>-0.758</td>\n",
" <td>-1.765</td>\n",
" <td>-0.103</td>\n",
" <td>-0.753</td>\n",
" <td>-0.247</td>\n",
" <td>1.087</td>\n",
" <td>0.589</td>\n",
" <th>636</th>\n",
" <td>2021-09-29</td>\n",
" <td>2010029450</td>\n",
" <td>2.128</td>\n",
" <td>0.341</td>\n",
" <td>1.807</td>\n",
" <td>-1.251</td>\n",
" <td>-0.685</td>\n",
" <td>0.518</td>\n",
" <td>-1.177</td>\n",
" <td>-1.069</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
......@@ -246,17 +250,17 @@
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000171</td>\n",
" <td>0.465</td>\n",
" <td>1.300</td>\n",
" <td>0.996</td>\n",
" <td>-0.862</td>\n",
" <td>1.511</td>\n",
" <td>-0.020</td>\n",
" <td>-0.778</td>\n",
" <td>-0.133</td>\n",
" <th>637</th>\n",
" <td>2021-09-29</td>\n",
" <td>2010030168</td>\n",
" <td>1.983</td>\n",
" <td>-0.149</td>\n",
" <td>1.830</td>\n",
" <td>-1.043</td>\n",
" <td>-0.571</td>\n",
" <td>0.228</td>\n",
" <td>-1.268</td>\n",
" <td>-1.231</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
......@@ -270,17 +274,17 @@
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000377</td>\n",
" <td>2.436</td>\n",
" <td>1.730</td>\n",
" <td>1.325</td>\n",
" <td>-1.262</td>\n",
" <td>-0.079</td>\n",
" <td>0.305</td>\n",
" <td>-1.297</td>\n",
" <td>-1.375</td>\n",
" <th>638</th>\n",
" <td>2021-09-29</td>\n",
" <td>2010030642</td>\n",
" <td>2.536</td>\n",
" <td>1.457</td>\n",
" <td>0.979</td>\n",
" <td>-1.283</td>\n",
" <td>0.002</td>\n",
" <td>0.648</td>\n",
" <td>-1.268</td>\n",
" <td>-0.149</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
......@@ -294,17 +298,17 @@
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000438</td>\n",
" <td>1.073</td>\n",
" <td>0.593</td>\n",
" <td>2.359</td>\n",
" <td>-0.937</td>\n",
" <td>-0.886</td>\n",
" <td>0.100</td>\n",
" <td>-1.187</td>\n",
" <td>-1.485</td>\n",
" <th>639</th>\n",
" <td>2021-09-29</td>\n",
" <td>2010031726</td>\n",
" <td>2.202</td>\n",
" <td>0.001</td>\n",
" <td>0.413</td>\n",
" <td>-1.258</td>\n",
" <td>-0.130</td>\n",
" <td>0.823</td>\n",
" <td>-1.251</td>\n",
" <td>-1.349</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
......@@ -323,43 +327,43 @@
"</div>"
],
"text/plain": [
" trade_date security_code BETA MOMENTUM SIZE EARNYILD RESVOL GROWTH \\\n",
"0 2021-06-30 2010000045 -0.017 -0.340 -0.841 -0.234 -0.041 -0.696 \n",
"1 2021-06-30 2010000121 -1.274 -0.758 -1.765 -0.103 -0.753 -0.247 \n",
"2 2021-06-30 2010000171 0.465 1.300 0.996 -0.862 1.511 -0.020 \n",
"3 2021-06-30 2010000377 2.436 1.730 1.325 -1.262 -0.079 0.305 \n",
"4 2021-06-30 2010000438 1.073 0.593 2.359 -0.937 -0.886 0.100 \n",
" trade_date security_code BETA MOMENTUM SIZE EARNYILD RESVOL \\\n",
"635 2021-09-29 2010022818 1.815 0.450 0.570 -1.269 -0.327 \n",
"636 2021-09-29 2010029450 2.128 0.341 1.807 -1.251 -0.685 \n",
"637 2021-09-29 2010030168 1.983 -0.149 1.830 -1.043 -0.571 \n",
"638 2021-09-29 2010030642 2.536 1.457 0.979 -1.283 0.002 \n",
"639 2021-09-29 2010031726 2.202 0.001 0.413 -1.258 -0.130 \n",
"\n",
" BTOP LEVERAGE ... Utilities Telecom AgriForest CHEM Media \\\n",
"0 0.755 -0.586 ... 0 0 0 0 0 \n",
"1 1.087 0.589 ... 0 0 0 0 0 \n",
"2 -0.778 -0.133 ... 0 0 0 0 0 \n",
"3 -1.297 -1.375 ... 0 0 0 0 0 \n",
"4 -1.187 -1.485 ... 0 0 0 0 0 \n",
" GROWTH BTOP LEVERAGE ... Utilities Telecom AgriForest CHEM \\\n",
"635 0.531 -1.246 -1.449 ... 0 0 0 0 \n",
"636 0.518 -1.177 -1.069 ... 0 0 0 0 \n",
"637 0.228 -1.268 -1.231 ... 0 0 0 0 \n",
"638 0.648 -1.268 -0.149 ... 0 0 0 0 \n",
"639 0.823 -1.251 -1.349 ... 0 0 0 0 \n",
"\n",
" IronSteel NonBankFinan ELECEQP AERODEF Conglomerates \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
" Media IronSteel NonBankFinan ELECEQP AERODEF Conglomerates \n",
"635 0 0 0 0 0 0 \n",
"636 0 0 0 0 0 0 \n",
"637 0 0 0 0 0 0 \n",
"638 0 0 0 0 0 0 \n",
"639 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 40 columns]"
]
},
"execution_count": 5,
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"risk_exp = risk_exposure(trade_dt, trade_dt, portfolio.security_code)\n",
"risk_exp.head()"
"risk_exp = risk_exposure(adjust_trade_dt, advanceDateByCalendar(\"china.sse\", adjust_trade_end_dt, \"-1b\").strftime(\"%Y-%m-%d\"), base_portfolio.security_code)\n",
"risk_exp.tail()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 34,
"id": "c75c33b2-c69e-412c-9151-8f6671c00cec",
"metadata": {},
"outputs": [
......@@ -409,65 +413,193 @@
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2021-06-30</td>\n",
" <td>0.00108</td>\n",
" <td>0.001188</td>\n",
" <td>-0.000703</td>\n",
" <td>-0.002</td>\n",
" <td>-0.002568</td>\n",
" <td>0.000804</td>\n",
" <td>0.000649</td>\n",
" <td>-0.000616</td>\n",
" <td>0.00265</td>\n",
" <th>61</th>\n",
" <td>2021-09-27</td>\n",
" <td>0.006453</td>\n",
" <td>-0.007671</td>\n",
" <td>0.004311</td>\n",
" <td>-0.000823</td>\n",
" <td>-0.000315</td>\n",
" <td>0.001725</td>\n",
" <td>-0.004201</td>\n",
" <td>-0.003717</td>\n",
" <td>-0.010185</td>\n",
" <td>...</td>\n",
" <td>0.004693</td>\n",
" <td>0.003152</td>\n",
" <td>0.026471</td>\n",
" <td>-0.024094</td>\n",
" <td>-0.008744</td>\n",
" <td>-0.019997</td>\n",
" <td>-0.006263</td>\n",
" <td>0.000689</td>\n",
" <td>-0.020568</td>\n",
" <td>-0.014515</td>\n",
" </tr>\n",
" <tr>\n",
" <th>62</th>\n",
" <td>2021-09-28</td>\n",
" <td>-0.002897</td>\n",
" <td>-0.002460</td>\n",
" <td>0.000930</td>\n",
" <td>-0.000189</td>\n",
" <td>-0.000819</td>\n",
" <td>0.000060</td>\n",
" <td>0.002638</td>\n",
" <td>0.001453</td>\n",
" <td>0.000388</td>\n",
" <td>...</td>\n",
" <td>0.034338</td>\n",
" <td>-0.002517</td>\n",
" <td>-0.013930</td>\n",
" <td>-0.000805</td>\n",
" <td>-0.012423</td>\n",
" <td>-0.004973</td>\n",
" <td>0.001485</td>\n",
" <td>0.002398</td>\n",
" <td>0.009590</td>\n",
" <td>-0.006040</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63</th>\n",
" <td>2021-09-29</td>\n",
" <td>0.000511</td>\n",
" <td>-0.002696</td>\n",
" <td>0.003687</td>\n",
" <td>-0.001386</td>\n",
" <td>-0.005773</td>\n",
" <td>-0.000356</td>\n",
" <td>-0.000997</td>\n",
" <td>-0.001306</td>\n",
" <td>-0.003878</td>\n",
" <td>...</td>\n",
" <td>-0.013787</td>\n",
" <td>-0.002528</td>\n",
" <td>0.012959</td>\n",
" <td>-0.010230</td>\n",
" <td>-0.002920</td>\n",
" <td>-0.016216</td>\n",
" <td>0.000614</td>\n",
" <td>0.011952</td>\n",
" <td>-0.017250</td>\n",
" <td>0.004462</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>2021-09-30</td>\n",
" <td>0.002472</td>\n",
" <td>0.004513</td>\n",
" <td>-0.004350</td>\n",
" <td>-0.000552</td>\n",
" <td>0.006485</td>\n",
" <td>0.000481</td>\n",
" <td>-0.000468</td>\n",
" <td>-0.000132</td>\n",
" <td>0.001100</td>\n",
" <td>...</td>\n",
" <td>-0.006972</td>\n",
" <td>0.006932</td>\n",
" <td>-0.012282</td>\n",
" <td>-0.001695</td>\n",
" <td>-0.006636</td>\n",
" <td>0.00891</td>\n",
" <td>0.000348</td>\n",
" <td>0.002113</td>\n",
" <td>0.002766</td>\n",
" <td>-0.002185</td>\n",
" <td>0.009149</td>\n",
" <td>0.000187</td>\n",
" <td>0.002262</td>\n",
" <td>0.001578</td>\n",
" <td>0.006500</td>\n",
" <td>-0.002908</td>\n",
" <td>-0.007583</td>\n",
" <td>0.004812</td>\n",
" <td>-0.005755</td>\n",
" <td>0.001625</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>2021-10-08</td>\n",
" <td>0.000385</td>\n",
" <td>-0.006492</td>\n",
" <td>-0.004499</td>\n",
" <td>-0.000696</td>\n",
" <td>-0.005204</td>\n",
" <td>-0.002520</td>\n",
" <td>0.001136</td>\n",
" <td>0.000154</td>\n",
" <td>-0.000584</td>\n",
" <td>...</td>\n",
" <td>-0.019877</td>\n",
" <td>0.004248</td>\n",
" <td>0.027150</td>\n",
" <td>-0.002731</td>\n",
" <td>0.004433</td>\n",
" <td>-0.005439</td>\n",
" <td>0.000290</td>\n",
" <td>-0.017415</td>\n",
" <td>-0.012064</td>\n",
" <td>0.000122</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1 rows × 39 columns</p>\n",
"<p>5 rows × 39 columns</p>\n",
"</div>"
],
"text/plain": [
" trade_date BETA MOMENTUM SIZE EARNYILD RESVOL GROWTH \\\n",
"0 2021-06-30 0.00108 0.001188 -0.000703 -0.002 -0.002568 0.000804 \n",
" trade_date BETA MOMENTUM SIZE EARNYILD RESVOL GROWTH \\\n",
"61 2021-09-27 0.006453 -0.007671 0.004311 -0.000823 -0.000315 0.001725 \n",
"62 2021-09-28 -0.002897 -0.002460 0.000930 -0.000189 -0.000819 0.000060 \n",
"63 2021-09-29 0.000511 -0.002696 0.003687 -0.001386 -0.005773 -0.000356 \n",
"64 2021-09-30 0.002472 0.004513 -0.004350 -0.000552 0.006485 0.000481 \n",
"65 2021-10-08 0.000385 -0.006492 -0.004499 -0.000696 -0.005204 -0.002520 \n",
"\n",
" BTOP LEVERAGE LIQUIDTY ... Utilities Telecom AgriForest \\\n",
"0 0.000649 -0.000616 0.00265 ... -0.006972 0.006932 -0.012282 \n",
" BTOP LEVERAGE LIQUIDTY ... Utilities Telecom AgriForest \\\n",
"61 -0.004201 -0.003717 -0.010185 ... 0.004693 0.003152 0.026471 \n",
"62 0.002638 0.001453 0.000388 ... 0.034338 -0.002517 -0.013930 \n",
"63 -0.000997 -0.001306 -0.003878 ... -0.013787 -0.002528 0.012959 \n",
"64 -0.000468 -0.000132 0.001100 ... 0.009149 0.000187 0.002262 \n",
"65 0.001136 0.000154 -0.000584 ... -0.019877 0.004248 0.027150 \n",
"\n",
" CHEM Media IronSteel NonBankFinan ELECEQP AERODEF \\\n",
"0 -0.001695 -0.006636 0.00891 0.000348 0.002113 0.002766 \n",
" CHEM Media IronSteel NonBankFinan ELECEQP AERODEF \\\n",
"61 -0.024094 -0.008744 -0.019997 -0.006263 0.000689 -0.020568 \n",
"62 -0.000805 -0.012423 -0.004973 0.001485 0.002398 0.009590 \n",
"63 -0.010230 -0.002920 -0.016216 0.000614 0.011952 -0.017250 \n",
"64 0.001578 0.006500 -0.002908 -0.007583 0.004812 -0.005755 \n",
"65 -0.002731 0.004433 -0.005439 0.000290 -0.017415 -0.012064 \n",
"\n",
" Conglomerates \n",
"0 -0.002185 \n",
" Conglomerates \n",
"61 -0.014515 \n",
"62 -0.006040 \n",
"63 0.004462 \n",
"64 0.001625 \n",
"65 0.000122 \n",
"\n",
"[1 rows x 39 columns]"
"[5 rows x 39 columns]"
]
},
"execution_count": 6,
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"risk_rtn = risk_return(trade_dt, trade_dt)\n",
"risk_rtn"
"\"\"\"\n",
"算法改动部分,可以通过uncomment代码启用\n",
"\"\"\"\n",
"\n",
"risk_rtn = risk_return(adjust_trade_dt, advanceDateByCalendar(\"china.sse\", adjust_trade_end_dt, \"1b\").strftime(\"%Y-%m-%d\"))\n",
"# 将风险收益向后一天平移\n",
"# risk_rtn = risk_rtn.set_index(\"trade_date\").shift(-1).reset_index().dropna()\n",
"risk_rtn.tail()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 35,
"id": "e06d5836-1e39-47e7-9e1e-3ba77433aa05",
"metadata": {},
"outputs": [],
"source": [
"spec_rtn = specific_return(adjust_trade_dt, advanceDateByCalendar(\"china.sse\", adjust_trade_end_dt, \"1b\").strftime(\"%Y-%m-%d\"), base_portfolio.security_code)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "f9fd6373-5fc6-4f8e-bd9d-dcf6daf529fa",
"metadata": {},
"outputs": [
{
"data": {
......@@ -501,64 +633,129 @@
" <tr>\n",
" <th>0</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000001</td>\n",
" <td>浦发银行</td>\n",
" <td>600000.XSHG</td>\n",
" <td>-0.041</td>\n",
" <td>2010000438</td>\n",
" <td>贵州茅台</td>\n",
" <td>600519.XSHG</td>\n",
" <td>-0.835</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000005</td>\n",
" <td>白云机场</td>\n",
" <td>600004.XSHG</td>\n",
" <td>-0.539</td>\n",
" <td>2010001111</td>\n",
" <td>泸州老窖</td>\n",
" <td>000568.XSHE</td>\n",
" <td>2.334</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000007</td>\n",
" <td>东风汽车</td>\n",
" <td>600006.XSHG</td>\n",
" <td>-0.664</td>\n",
" <td>2010001333</td>\n",
" <td>五粮液</td>\n",
" <td>000858.XSHE</td>\n",
" <td>-1.128</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000008</td>\n",
" <td>中国国贸</td>\n",
" <td>600007.XSHG</td>\n",
" <td>2.145</td>\n",
" <td>2010001684</td>\n",
" <td>歌尔股份</td>\n",
" <td>002241.XSHE</td>\n",
" <td>-3.341</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2021-06-30</td>\n",
" <td>2010000009</td>\n",
" <td>首创环保</td>\n",
" <td>600008.XSHG</td>\n",
" <td>-0.397</td>\n",
" <td>2010003333</td>\n",
" <td>爱尔眼科</td>\n",
" <td>300015.XSHE</td>\n",
" <td>1.467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>655</th>\n",
" <td>2021-10-08</td>\n",
" <td>2010022818</td>\n",
" <td>凯莱英</td>\n",
" <td>002821.XSHE</td>\n",
" <td>-4.699</td>\n",
" </tr>\n",
" <tr>\n",
" <th>656</th>\n",
" <td>2021-10-08</td>\n",
" <td>2010029450</td>\n",
" <td>药明康德</td>\n",
" <td>603259.XSHG</td>\n",
" <td>-1.766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>657</th>\n",
" <td>2021-10-08</td>\n",
" <td>2010030168</td>\n",
" <td>迈瑞医疗</td>\n",
" <td>300760.XSHE</td>\n",
" <td>-2.307</td>\n",
" </tr>\n",
" <tr>\n",
" <th>658</th>\n",
" <td>2021-10-08</td>\n",
" <td>2010030642</td>\n",
" <td>康龙化成</td>\n",
" <td>300759.XSHE</td>\n",
" <td>-3.963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>659</th>\n",
" <td>2021-10-08</td>\n",
" <td>2010031726</td>\n",
" <td>华熙生物</td>\n",
" <td>688363.XSHG</td>\n",
" <td>4.914</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>660 rows × 5 columns</p>\n",
"</div>"
],
"text/plain": [
" trade_date security_code secShortName symbol spret\n",
"0 2021-06-30 2010000001 浦发银行 600000.XSHG -0.041\n",
"1 2021-06-30 2010000005 白云机场 600004.XSHG -0.539\n",
"2 2021-06-30 2010000007 东风汽车 600006.XSHG -0.664\n",
"3 2021-06-30 2010000008 中国国贸 600007.XSHG 2.145\n",
"4 2021-06-30 2010000009 首创环保 600008.XSHG -0.397"
" trade_date security_code secShortName symbol spret\n",
"0 2021-06-30 2010000438 贵州茅台 600519.XSHG -0.835\n",
"1 2021-06-30 2010001111 泸州老窖 000568.XSHE 2.334\n",
"2 2021-06-30 2010001333 五粮液 000858.XSHE -1.128\n",
"3 2021-06-30 2010001684 歌尔股份 002241.XSHE -3.341\n",
"4 2021-06-30 2010003333 爱尔眼科 300015.XSHE 1.467\n",
".. ... ... ... ... ...\n",
"655 2021-10-08 2010022818 凯莱英 002821.XSHE -4.699\n",
"656 2021-10-08 2010029450 药明康德 603259.XSHG -1.766\n",
"657 2021-10-08 2010030168 迈瑞医疗 300760.XSHE -2.307\n",
"658 2021-10-08 2010030642 康龙化成 300759.XSHE -3.963\n",
"659 2021-10-08 2010031726 华熙生物 688363.XSHG 4.914\n",
"\n",
"[660 rows x 5 columns]"
]
},
"execution_count": 7,
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"spec_rtn = specific_return(trade_dt, trade_dt)\n",
"spec_rtn.head()"
"\"\"\"\n",
"算法改动部分,可以通过uncomment代码启用\n",
"\"\"\"\n",
"\n",
"# 将特质收益向后一天平移\n",
"# def agg_func(x):\n",
"# x = x.shift(-1)#.reset_index()\n",
"# return x\n",
"# spec_rtn = spec_rtn.set_index(\"trade_date\").groupby(\"security_code\", as_index=False).apply(agg_func).reset_index().dropna()\n",
"spec_rtn"
]
},
{
......@@ -569,56 +766,56 @@
"# 2. Risk Style Attribution\n",
"-------------------------------\n",
"\n",
"以下的归因我们都只做了 **一天** 的结果,区间归因即为每日归因的累加。"
"以下的归因我们循环中每次只做了 **一天** 的结果,区间归因即为每日归因的累加。\n",
"我们有如下假设:\n",
"\n",
"1. 基金经理只在年报、季报公布日调仓;\n",
"2. 当日持仓都是收盘持仓,所以收益是享受下一天的。"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "36e1b625-3541-4046-a6ac-6fed5883492e",
"execution_count": 37,
"id": "9f823b11-1250-4766-8166-19fbc8f2e405",
"metadata": {},
"outputs": [],
"source": [
"portfolio_risk_styple_exposure, attributed_rtn = single_style(portfolio, risk_exp, risk_rtn, spec_rtn)"
]
},
{
"cell_type": "markdown",
"id": "69d85aa1-bbfa-41ca-9de8-97bb4039a651",
"metadata": {},
"source": [
"## 2.1 风格因子暴露"
"risk_exp_groups = risk_exp.groupby(\"trade_date\")\n",
"risk_rtn_groups = risk_rtn.groupby(\"trade_date\")\n",
"spec_rtn_groups = spec_rtn.groupby(\"trade_date\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2bafbb46-6bdc-47c6-a9f3-077cb7fb8703",
"execution_count": 38,
"id": "36e1b625-3541-4046-a6ac-6fed5883492e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"BTOP -1.050610\n",
"LEVERAGE -1.005935\n",
"EARNYILD -0.926693\n",
"SIZENL -0.021670\n",
"RESVOL 0.132134\n",
"LIQUIDTY 0.362404\n",
"GROWTH 0.493346\n",
"SIZE 0.667810\n",
"MOMENTUM 0.885153\n",
"BETA 1.272002\n",
"dtype: float64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"portfolio_risk_styple_exposure.sort_values()"
"\"\"\"\n",
"算法改动部分,可以通过uncomment代码启用\n",
"\"\"\"\n",
"\n",
"attributed_rtn = []\n",
"\n",
"for k, this_risk_exp in risk_exp_groups:\n",
" this_risk_rtn = risk_rtn_groups.get_group(k)\n",
" this_spec_rtn = spec_rtn_groups.get_group(k)\n",
" if False: \n",
" # if k.strftime(\"%Y-%m-%d\") != adjust_trade_dt:\n",
" # 需要evolve持仓\n",
" stk_chg = stk_return(adjust_trade_dt, k.strftime(\"%Y-%m-%d\"), base_portfolio.security_code)\n",
" res = pd.merge(base_portfolio[[\"security_code\", \"weight\"]], stk_chg[[\"chg_pct\", \"security_code\"]], on=\"security_code\")\n",
" res[\"weight\"] = res[\"weight\"] * (1. + res[\"chg_pct\"])\n",
" res[\"weight\"] /= res[\"weight\"].sum()\n",
" this_portfolio = res[[\"security_code\", \"weight\"]]\n",
" else:\n",
" this_portfolio = base_portfolio[[\"security_code\", \"weight\"]]\n",
" \n",
" this_portfolio_risk_styple_exposure, this_attributed_rtn = single_style(this_portfolio, this_risk_exp, this_risk_rtn, this_spec_rtn)\n",
" this_attributed_rtn[\"trade_date\"] = k\n",
" attributed_rtn.append(this_attributed_rtn)\n",
"attributed_rtn = pd.concat(attributed_rtn)"
]
},
{
......@@ -631,7 +828,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 39,
"id": "5fc30cfa-2213-4415-a160-78f4d896581c",
"metadata": {},
"outputs": [
......@@ -678,61 +875,236 @@
" <th>Conglomerates</th>\n",
" <th>SPECIFIC</th>\n",
" </tr>\n",
" <tr>\n",
" <th>trade_date</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",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.001374</td>\n",
" <td>0.001052</td>\n",
" <td>-0.000469</td>\n",
" <td>0.001853</td>\n",
" <td>-0.000339</td>\n",
" <td>0.000397</td>\n",
" <td>-0.000682</td>\n",
" <td>0.00062</td>\n",
" <td>0.00096</td>\n",
" <td>0.000014</td>\n",
" <th>2021-09-23</th>\n",
" <td>0.003004</td>\n",
" <td>0.000108</td>\n",
" <td>-0.001346</td>\n",
" <td>0.000857</td>\n",
" <td>0.002057</td>\n",
" <td>0.000046</td>\n",
" <td>-0.003028</td>\n",
" <td>-0.001147</td>\n",
" <td>0.000076</td>\n",
" <td>-0.000012</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.013553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2021-09-24</th>\n",
" <td>0.011372</td>\n",
" <td>-0.000012</td>\n",
" <td>0.003104</td>\n",
" <td>0.004088</td>\n",
" <td>-0.001462</td>\n",
" <td>0.001057</td>\n",
" <td>0.002304</td>\n",
" <td>0.000857</td>\n",
" <td>-0.000695</td>\n",
" <td>-0.000070</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>-4.097016e-08</td>\n",
" <td>-1.626208e-07</td>\n",
" <td>-0.00024</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>9.822411e-09</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>-1.424358e-08</td>\n",
" <td>-0.008951</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.005116</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2021-09-27</th>\n",
" <td>0.013966</td>\n",
" <td>-0.000030</td>\n",
" <td>0.006486</td>\n",
" <td>0.000840</td>\n",
" <td>0.000151</td>\n",
" <td>0.000665</td>\n",
" <td>0.004920</td>\n",
" <td>0.003676</td>\n",
" <td>-0.001487</td>\n",
" <td>-0.000065</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.006677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2021-09-28</th>\n",
" <td>-0.006319</td>\n",
" <td>0.000048</td>\n",
" <td>0.001399</td>\n",
" <td>0.000194</td>\n",
" <td>0.000385</td>\n",
" <td>0.000023</td>\n",
" <td>-0.003121</td>\n",
" <td>-0.001448</td>\n",
" <td>0.000059</td>\n",
" <td>0.000121</td>\n",
" <td>...</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.012435</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2021-09-29</th>\n",
" <td>0.001070</td>\n",
" <td>-0.000012</td>\n",
" <td>0.005537</td>\n",
" <td>0.001426</td>\n",
" <td>0.003017</td>\n",
" <td>-0.000138</td>\n",
" <td>0.001190</td>\n",
" <td>0.001302</td>\n",
" <td>-0.000651</td>\n",
" <td>0.000307</td>\n",
" <td>...</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.001378</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1 rows × 39 columns</p>\n",
"<p>5 rows × 39 columns</p>\n",
"</div>"
],
"text/plain": [
" BETA MOMENTUM SIZE EARNYILD RESVOL GROWTH BTOP \\\n",
"0 0.001374 0.001052 -0.000469 0.001853 -0.000339 0.000397 -0.000682 \n",
" BETA MOMENTUM SIZE EARNYILD RESVOL GROWTH \\\n",
"trade_date \n",
"2021-09-23 0.003004 0.000108 -0.001346 0.000857 0.002057 0.000046 \n",
"2021-09-24 0.011372 -0.000012 0.003104 0.004088 -0.001462 0.001057 \n",
"2021-09-27 0.013966 -0.000030 0.006486 0.000840 0.000151 0.000665 \n",
"2021-09-28 -0.006319 0.000048 0.001399 0.000194 0.000385 0.000023 \n",
"2021-09-29 0.001070 -0.000012 0.005537 0.001426 0.003017 -0.000138 \n",
"\n",
" LEVERAGE LIQUIDTY SIZENL ... Telecom AgriForest CHEM \\\n",
"0 0.00062 0.00096 0.000014 ... 0.0 -4.097016e-08 -1.626208e-07 \n",
" BTOP LEVERAGE LIQUIDTY SIZENL ... Telecom AgriForest \\\n",
"trade_date ... \n",
"2021-09-23 -0.003028 -0.001147 0.000076 -0.000012 ... 0.0 0.0 \n",
"2021-09-24 0.002304 0.000857 -0.000695 -0.000070 ... 0.0 0.0 \n",
"2021-09-27 0.004920 0.003676 -0.001487 -0.000065 ... 0.0 0.0 \n",
"2021-09-28 -0.003121 -0.001448 0.000059 0.000121 ... -0.0 -0.0 \n",
"2021-09-29 0.001190 0.001302 -0.000651 0.000307 ... -0.0 0.0 \n",
"\n",
" Media IronSteel NonBankFinan ELECEQP AERODEF Conglomerates \\\n",
"0 -0.00024 0.0 0.0 9.822411e-09 0.0 -1.424358e-08 \n",
" CHEM Media IronSteel NonBankFinan ELECEQP AERODEF \\\n",
"trade_date \n",
"2021-09-23 -0.0 0.0 0.0 0.0 -0.0 0.0 \n",
"2021-09-24 -0.0 0.0 -0.0 -0.0 0.0 -0.0 \n",
"2021-09-27 -0.0 -0.0 -0.0 -0.0 0.0 -0.0 \n",
"2021-09-28 -0.0 -0.0 -0.0 0.0 0.0 0.0 \n",
"2021-09-29 -0.0 -0.0 -0.0 0.0 0.0 -0.0 \n",
"\n",
" SPECIFIC \n",
"0 -0.008951 \n",
" Conglomerates SPECIFIC \n",
"trade_date \n",
"2021-09-23 -0.0 -0.013553 \n",
"2021-09-24 -0.0 -0.005116 \n",
"2021-09-27 -0.0 0.006677 \n",
"2021-09-28 -0.0 0.012435 \n",
"2021-09-29 0.0 -0.001378 \n",
"\n",
"[1 rows x 39 columns]"
"[5 rows x 39 columns]"
]
},
"execution_count": 12,
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"attributed_rtn"
"attributed_rtn = attributed_rtn.set_index(\"trade_date\")\n",
"attributed_rtn.tail()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "dcb70a5c-6935-4fdb-869c-9e9c51665840",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Summary @ 2021-09-30\n",
"Industries rtn.: -10.91%\n",
"Styles rtn.: -5.94%\n",
"Specific rtn.: 4.00%\n",
"Total rtn.: -12.85%\n"
]
}
],
"source": [
"print(f\"Summary @ {trade_end_dt}\")\n",
"print(f\"Industries rtn.: {attributed_rtn[attributed_rtn.columns.difference(this_portfolio_risk_styple_exposure.index.tolist() + ['SPECIFIC'])].sum().sum() * 100:.2f}%\")\n",
"print(f\"Styles rtn.: {attributed_rtn[this_portfolio_risk_styple_exposure.index.tolist()].sum().sum() * 100:.2f}%\")\n",
"print(f\"Specific rtn.: {attributed_rtn['SPECIFIC'].sum().sum() * 100:.2f}%\")\n",
"print(f\"Total rtn.: {attributed_rtn.sum().sum() * 100:.2f}%\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8d3ad3c3-e236-40e3-b248-bfc28aa09750",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......@@ -751,7 +1123,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
"version": "3.9.12"
}
},
"nbformat": 4,
......
......@@ -10,6 +10,7 @@ from pathlib import Path
MSSQL_CONN = "mssql+pymssql://readdnds:reader%402021@121.37.138.1:14331/dnds"
MYSQL_CONN = "mysql+pymysql://reader:Reader#2020@121.37.138.1:13316/vision_product"
# MYSQL_CONN = "mysql+pymysql://rl_sync:rl_sync_2019@121.37.138.1:13306/vision"
RISK_STYLES = ['BETA',
'MOMENTUM',
......@@ -65,74 +66,71 @@ def read_sql(query, source="mssql"):
return pd.read_sql(query, con=engine)
def nearest_report_date(date, freq="Q", method="forward"):
# def nearest_report_date(date, freq="Q", method="forward"):
# if len(date) == 10:
# date = date.replace("-", "")
# mm = int(date[4:6])
# year = int(date[0:4])
# last_year = year
# if method == "forward":
# add = 1
# else:
# add = 0
# if freq == "Q":
# q = (mm // 3 + add) * 3 - 3
# else:
# q = (mm // 6 + add) * 6 - 6
# if q <= 0:
# q += 12
# last_year -= 1
# last = calendar.monthrange(last_year, q)[1]
# return dt.date(last_year, q, last).strftime("%Y%m%d")
def nearest_report_date(date, freq="Q"):
if len(date) == 10:
date = date.replace("-", "")
mm = int(date[4:6])
year = int(date[0:4])
last_year = year
if method == "forward":
add = 1
else:
add = 0
if freq == "Q":
q = (mm // 3 + add) * 3 - 3
q = ((mm - 1) // 3) * 3
else:
q = (mm // 6 + add) * 6 - 6
if q <= 0:
q += 12
last_year -= 1
q = ((mm - 1) // 6) * 6
if q == 0:
q = 12
last_year = year - 1
last = calendar.monthrange(last_year, q)[1]
return dt.date(last_year, q, last).strftime("%Y%m%d")
def fd_alive_funds(trade_dt, class_code=None):
# if class_code:
# if isinstance(class_code, str) or isinstance(class_code, int):
# condition = f" CLASSCODE like '{class_code}%' AND "
# else:
# condition = []
# for c in class_code:
# condition.append(f" CLASSCODE like '{c}%' ")
# condition = "OR".join(condition)
# condition = "(" + condition + ") AND"
# query = f"""
# select SECODE as SECURITYID, BEGINDATE, ENDDATE, CLASSCODE FROM TQ_FD_TYPE
# WHERE
# ISVALID = 1 AND
# {condition}
# TYPESTYLE = '22' AND
# BEGINDATE <= '{trade_dt}' AND
# (ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
# ORDER BY SECODE;
# """
# else:
# query = f"""
# select SECODE as SECURITYID,BEGINDATE, ENDDATE, CLASSCODE FROM TQ_FD_TYPE
# WHERE
# ISVALID = 1 AND
# BEGINDATE <= '{trade_dt}' AND
# TYPESTYLE = '22' AND
# (ENDDATE>='{trade_dt}' or ENDDATE = '19000101')
# ORDER BY SECODE;
# """
# return read_sql(query)
df = pd.read_csv(str(Path(__file__).parents[0] / "wind_table.csv"))
df["SECODE"] = df["SECODE"].astype(str)
df["CLASSCODE"] = df["CLASSCODE"].astype(str)
def fd_alive_funds(trade_dt, class_code):
if class_code:
df = df[df.CLASSCODE.str.contains(str(class_code))]
df.rename(columns={"SECODE": "SECURITYID"}, inplace=True)
df = df.sort_values("CLASSCODE").groupby("SECURITYID", as_index=False).last()
return df
query = f"""
select security_code as SECURITYID, begin_date as BEGINDATE, end_date as ENDDATE, l2_name as CLASSCODE FROM wd_fd_classification
WHERE
flag = 1 AND
begin_date <= '{_to_yyyy_mm_dd(trade_dt)}' AND
(end_date>='{_to_yyyy_mm_dd(trade_dt)}' or end_date = '19000101') AND
l1_name = '{class_code}'
ORDER BY security_code;
"""
else:
query = f"""
select security_code as SECURITYID, begin_date as BEGINDATE, end_date as ENDDATE, l2_name as CLASSCODE FROM wd_fd_classification
WHERE
flag = 1 AND
begin_date <= '{_to_yyyy_mm_dd(trade_dt)}' AND
(end_date>='{_to_yyyy_mm_dd(trade_dt)}' or end_date = '19000101')
ORDER BY security_code;
"""
return read_sql(query, "mysql")
def fd_basicinfo(security_ids=None, trade_dt=None):
......@@ -223,6 +221,20 @@ def fd_hshkiport(security_ids, report_dates_begin, report_dates_end=None):
return read_sql(query).sort_values("SECURITYID").reset_index(drop=True)
def _to_yyyy_mm_dd(trade_dt):
if len(trade_dt) == 10:
return trade_dt
else:
return f"{trade_dt[0:4]}-{trade_dt[4:6]}-{trade_dt[6:8]}"
def _to_yyyymmdd(trade_dt):
if len(trade_dt) == 8:
return trade_dt
else:
return f"{trade_dt[0:4]}{trade_dt[5:7]}{trade_dt[8:10]}"
def fd_assetportfolio(security_ids, report_dates_begin, report_dates_end=None):
# 获取相关组合情况
if isinstance(security_ids, str):
......@@ -231,20 +243,24 @@ def fd_assetportfolio(security_ids, report_dates_begin, report_dates_end=None):
sec_id_strs = ",".join(["'" + s + "'" for s in security_ids])
if report_dates_end:
query = f"""
SELECT security_id as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
SELECT security_code as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
WHERE
report_date >= '{_to_yyyy_mm_dd(report_dates_begin)}' AND
report_date <= '{_to_yyyy_mm_dd(report_dates_end)}' AND
report_date >= '{report_dates_begin}' AND
report_date <= '{report_dates_end}' AND
is_valid = 1 AND
security_id in ({sec_id_strs})
flag = 1 AND
publish_date != 19000101 AND
security_code in ({sec_id_strs})
"""
else:
query = f"""
SELECT security_id as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
SELECT security_code as SECURITYID, report_date as REPORTDATE, bd_rto as BDRTO, conv_bd_rto as CONVBDRTO, equity_inve_rto as EQUITYINVERTO, st_fin_bd_rto as STFINBDRTO, deposit_rto as DEPOSITRTO FROM fd_portfolio
WHERE
report_date >= '{_to_yyyy_mm_dd(report_dates_begin)}' AND
report_date >= '{report_dates_begin}' AND
is_valid = 1 AND
security_id in ({sec_id_strs})
flag = 1 AND
publish_date != 19000101 AND
security_code in ({sec_id_strs})
"""
return read_sql(query, source="mysql").sort_values("SECURITYID").reset_index(drop=True)
......@@ -265,18 +281,7 @@ def fd_qtfdnav(security_ids, trade_dt):
return read_sql(query).sort_values("SECURITYID").reset_index(drop=True)
def _to_yyyy_mm_dd(trade_dt):
if len(trade_dt) == 10:
return trade_dt
else:
return f"{trade_dt[0:4]}-{trade_dt[4:6]}-{trade_dt[6:8]}"
def _to_yyyymmdd(trade_dt):
if len(trade_dt) == 8:
return trade_dt
else:
return f"{trade_dt[0:4]}{trade_dt[5:7]}{trade_dt[8:10]}"
def _join_ids(security_ids):
......@@ -445,7 +450,7 @@ def stk_return(start_date, end_date, security_ids=None):
sec_id_strs = _join_ids(security_ids)
if sec_id_strs:
query = f"""
SELECT security_code, trade_date, `close`, lat_factor FROM stk_daily_price_pro
SELECT security_code, trade_date, `close` * lat_factor AS lat_price FROM stk_daily_price_pro
WHERE
trade_date in ('{_to_yyyy_mm_dd(start_date)}', '{_to_yyyy_mm_dd(end_date)}') AND
security_code IN ({sec_id_strs}) AND
......
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