├── .gitignore ├── FP1.1_Preprocess_Data.ipynb ├── FP1.2_Preprocess_Factors.ipynb ├── FP1.3_Factor_Modeling.ipynb ├── FP1.4_Backtesting.ipynb ├── Final Project.pptx ├── README.md ├── backtesting.png ├── backtesting_noncumulative.png ├── comparison1.png ├── comparison2.png ├── csi_500_constituent_info.gz ├── csi_500_data_preprocessed.csv ├── csi_500_data_preprocessed.gz ├── csi_500_data_raw.gz ├── factor_data.csv ├── factor_data.gz ├── factors_corr.png ├── final_project.py ├── industry_data.gz ├── pvalues.png ├── test_return.gz ├── winsorized_factors.gz └── workflow.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /FP1.1_Preprocess_Data.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Preprocess Data" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 2, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "%matplotlib inline\n", 17 | "\n", 18 | "import matplotlib\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import numpy as np\n", 21 | "import pandas as pd\n", 22 | "import tushare as ts\n", 23 | "from WindPy import *\n", 24 | "import datetime\n", 25 | "import time\n", 26 | "\n", 27 | "%run final_project.py\n", 28 | "\n", 29 | "matplotlib.rcParams[\"figure.figsize\"] = (16, 9)" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "Welcome to use Wind Quant API for Python (WindPy)!\n", 42 | "\n", 43 | "COPYRIGHT (C) 2017 WIND INFORMATION CO., LTD. ALL RIGHTS RESERVED.\n", 44 | "IN NO CIRCUMSTANCE SHALL WIND BE RESPONSIBLE FOR ANY DAMAGES OR LOSSES CAUSED BY USING WIND QUANT API FOR Python.\n" 45 | ] 46 | }, 47 | { 48 | "data": { 49 | "text/plain": [ 50 | ".ErrorCode=0\n", 51 | ".Data=[OK!]" 52 | ] 53 | }, 54 | "execution_count": 2, 55 | "metadata": {}, 56 | "output_type": "execute_result" 57 | } 58 | ], 59 | "source": [ 60 | "w.start()" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "metadata": {}, 66 | "source": [ 67 | "### 1. Get CSI 500 constituent stocks and weights" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 3, 73 | "metadata": {}, 74 | "outputs": [], 75 | "source": [ 76 | "# get current constituent stocks and weights of CSI 500 Index\n", 77 | "csi_500_constituent = w.wset(\"indexconstituent\", \"date=2019-04-26;windcode=000905.SH\")\n", 78 | "csi_500_constituent = pd.DataFrame(csi_500_constituent.Data, index=csi_500_constituent.Fields)\n", 79 | "csi_500_constituent = csi_500_constituent.T\n", 80 | "csi_500_constituent = csi_500_constituent.drop(columns=[\"date\"])" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": {}, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "text/html": [ 91 | "
\n", 92 | "\n", 105 | "\n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | "
wind_codesec_namei_weight
0000006.SZ深振业A0.159
1000008.SZ神州高铁0.26
2000009.SZ中国宝安0.36
3000012.SZ南玻A0.154
4000021.SZ深科技0.172
\n", 147 | "
" 148 | ], 149 | "text/plain": [ 150 | " wind_code sec_name i_weight\n", 151 | "0 000006.SZ 深振业A 0.159\n", 152 | "1 000008.SZ 神州高铁 0.26\n", 153 | "2 000009.SZ 中国宝安 0.36\n", 154 | "3 000012.SZ 南玻A 0.154\n", 155 | "4 000021.SZ 深科技 0.172" 156 | ] 157 | }, 158 | "execution_count": 4, 159 | "metadata": {}, 160 | "output_type": "execute_result" 161 | } 162 | ], 163 | "source": [ 164 | "csi_500_constituent.head()" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 5, 170 | "metadata": {}, 171 | "outputs": [], 172 | "source": [ 173 | "csi_500_constituent.to_pickle(\"csi_500_constituent_info.gz\")" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "### 2. Get monthly data of 500 constituent stocks from 2015-01-01 to 2019-04-26" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": null, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "stock_data = pd.DataFrame(columns=[\"WINDCODE\", \"SEC_NAME\", \"INDEXCODE_SW\", \"INDUSTRY_SW\", \n", 190 | " \"EV\", \"PE_TTM\", \"PB_MRQ\", \"PS_TTM\", \"PCF_OCF_TTM\", \"EV2_TO_EBITDA\", \n", 191 | " \"ROE\", \"ROIC\", \"PROFITTOGR\", \"YOYPROFIT\", \"YOY_TR\", \"TURN\", \"CLOSE\"])\n", 192 | "\n", 193 | "show_time(\"start loop\")\n", 194 | "\n", 195 | "for code in csi_500_constituent.wind_code:\n", 196 | " apidata = w.wsd(code, \n", 197 | " \"windcode,sec_name,indexcode_sw,industry_sw,ev,pe_ttm,pb_mrq,ps_ttm,pcf_ocf_ttm,ev2_to_ebitda,roe,roic,profittogr,yoyprofit,yoy_tr,turn,close\", \n", 198 | " \"2015-01-01\", \"2019-4-26\", \n", 199 | " \"industryType=1;unit=1;Period=M;Fill=Previous,PriceAdj=F\")\n", 200 | " df = apidata_to_df(apidata)\n", 201 | " stock_data = pd.concat([stock_data, df], axis=0, join=\"outer\")\n", 202 | " \n", 203 | "show_time(\"end loop\")" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 7, 209 | "metadata": {}, 210 | "outputs": [], 211 | "source": [ 212 | "# convert index into datetime object\n", 213 | "stock_data[\"date\"] = pd.to_datetime(stock_data.index, format=\"%Y-%m-%d\")\n", 214 | "stock_data.set_index(\"date\", inplace=True)\n", 215 | "# save as pickle file for convenience\n", 216 | "stock_data.to_pickle(\"csi_500_data_raw.gz\")" 217 | ] 218 | }, 219 | { 220 | "cell_type": "markdown", 221 | "metadata": {}, 222 | "source": [ 223 | "### 3. Preprocess data" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": 3, 229 | "metadata": {}, 230 | "outputs": [], 231 | "source": [ 232 | "data = pd.read_pickle(\"csi_500_data_raw.gz\")" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 4, 238 | "metadata": {}, 239 | "outputs": [ 240 | { 241 | "data": { 242 | "text/html": [ 243 | "
\n", 244 | "\n", 257 | "\n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | "
WINDCODESEC_NAMEINDEXCODE_SWINDUSTRY_SWEVPE_TTMPB_MRQPS_TTMPCF_OCF_TTMEV2_TO_EBITDAROEROICPROFITTOGRYOYPROFITYOY_TRTURNCLOSE
date
2015-01-30000006.SZ深振业A801180.SI房地产8.77497e+0917.44012.239573.78038-9.3429413.0551NoneNoneNoneNoneNone50.85446.5
2015-02-27000006.SZ深振业A801180.SI房地产8.86947e+0917.62792.263693.82109-9.4435513.1681NoneNoneNoneNoneNone16.56376.57
2015-03-31000006.SZ深振业A801180.SI房地产1.188e+1023.61123.032045.11805-12.648917.78064.76033.03115.1535597.159428.38791.68818.8
2015-04-30000006.SZ深振业A801180.SI房地产1.57679e+1023.22463.636014.56375-9.0296722.43374.76033.03115.1535597.159428.387124.39911.68
2015-05-29000006.SZ深振业A801180.SI房地产2.10599e+1031.01924.856326.09542-12.060228.76714.76033.03115.1535597.159428.387102.96515.6
\n", 403 | "
" 404 | ], 405 | "text/plain": [ 406 | " WINDCODE SEC_NAME INDEXCODE_SW INDUSTRY_SW EV PE_TTM \\\n", 407 | "date \n", 408 | "2015-01-30 000006.SZ 深振业A 801180.SI 房地产 8.77497e+09 17.4401 \n", 409 | "2015-02-27 000006.SZ 深振业A 801180.SI 房地产 8.86947e+09 17.6279 \n", 410 | "2015-03-31 000006.SZ 深振业A 801180.SI 房地产 1.188e+10 23.6112 \n", 411 | "2015-04-30 000006.SZ 深振业A 801180.SI 房地产 1.57679e+10 23.2246 \n", 412 | "2015-05-29 000006.SZ 深振业A 801180.SI 房地产 2.10599e+10 31.0192 \n", 413 | "\n", 414 | " PB_MRQ PS_TTM PCF_OCF_TTM EV2_TO_EBITDA ROE ROIC \\\n", 415 | "date \n", 416 | "2015-01-30 2.23957 3.78038 -9.34294 13.0551 None None \n", 417 | "2015-02-27 2.26369 3.82109 -9.44355 13.1681 None None \n", 418 | "2015-03-31 3.03204 5.11805 -12.6489 17.7806 4.7603 3.031 \n", 419 | "2015-04-30 3.63601 4.56375 -9.02967 22.4337 4.7603 3.031 \n", 420 | "2015-05-29 4.85632 6.09542 -12.0602 28.7671 4.7603 3.031 \n", 421 | "\n", 422 | " PROFITTOGR YOYPROFIT YOY_TR TURN CLOSE \n", 423 | "date \n", 424 | "2015-01-30 None None None 50.8544 6.5 \n", 425 | "2015-02-27 None None None 16.5637 6.57 \n", 426 | "2015-03-31 15.1535 597.159 428.387 91.6881 8.8 \n", 427 | "2015-04-30 15.1535 597.159 428.387 124.399 11.68 \n", 428 | "2015-05-29 15.1535 597.159 428.387 102.965 15.6 " 429 | ] 430 | }, 431 | "execution_count": 4, 432 | "metadata": {}, 433 | "output_type": "execute_result" 434 | } 435 | ], 436 | "source": [ 437 | "data.head()" 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": 123, 443 | "metadata": {}, 444 | "outputs": [ 445 | { 446 | "data": { 447 | "text/plain": [ 448 | "SEC_NAME False\n", 449 | "INDEXCODE_SW False\n", 450 | "INDUSTRY_SW False\n", 451 | "EV False\n", 452 | "PE_TTM False\n", 453 | "PB_MRQ False\n", 454 | "PS_TTM False\n", 455 | "PCF_OCF_TTM False\n", 456 | "EV2_TO_EBITDA True\n", 457 | "ROE False\n", 458 | "ROIC True\n", 459 | "PROFITTOGR False\n", 460 | "YOYPROFIT False\n", 461 | "YOY_TR False\n", 462 | "TURN False\n", 463 | "CLOSE False\n", 464 | "dtype: bool" 465 | ] 466 | }, 467 | "execution_count": 123, 468 | "metadata": {}, 469 | "output_type": "execute_result" 470 | } 471 | ], 472 | "source": [ 473 | "# fill nan with data of the nearest month\n", 474 | "for code in csi_500_constituent.wind_code:\n", 475 | " data[data[\"WINDCODE\"] == code] = data[data[\"WINDCODE\"] == code].fillna(method=\"ffill\", axis=0)\n", 476 | " data[data[\"WINDCODE\"] == code] = data[data[\"WINDCODE\"] == code].fillna(method=\"bfill\", axis=0)\n", 477 | "# check if there're still nans left\n", 478 | "pd.isnull(full_data).any()" 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 127, 484 | "metadata": {}, 485 | "outputs": [ 486 | { 487 | "data": { 488 | "text/plain": [ 489 | "True" 490 | ] 491 | }, 492 | "execution_count": 127, 493 | "metadata": {}, 494 | "output_type": "execute_result" 495 | } 496 | ], 497 | "source": [ 498 | "# locate nans\n", 499 | "bools_1 = pd.isnull(data[\"EV2_TO_EBITDA\"])\n", 500 | "bools_2 = pd.isnull(data[\"ROIC\"])\n", 501 | "ind_1 = []\n", 502 | "for i in range(len(bools_1)):\n", 503 | " if bools_1[i]:\n", 504 | " ind_1.append(i)\n", 505 | "ind_2 = []\n", 506 | "for j in range(len(bools_2)):\n", 507 | " if bools_2[j]:\n", 508 | " ind_2.append(j)\n", 509 | "ind_1 == ind_2 # nans in EV/EBITDA and ROIC appearing from same companies" 510 | ] 511 | }, 512 | { 513 | "cell_type": "code", 514 | "execution_count": 128, 515 | "metadata": {}, 516 | "outputs": [ 517 | { 518 | "name": "stdout", 519 | "output_type": "stream", 520 | "text": [ 521 | "{'非银金融', '银行'}\n" 522 | ] 523 | } 524 | ], 525 | "source": [ 526 | "# figure out the corresponding industries\n", 527 | "ind_code = []\n", 528 | "for ind in ind_1:\n", 529 | " ind_code.append(data[\"INDUSTRY_SW\"][ind])\n", 530 | "print(set(ind_code)) # 10 companies in banking and non-bank financial industries have missing data" 531 | ] 532 | }, 533 | { 534 | "cell_type": "code", 535 | "execution_count": 143, 536 | "metadata": {}, 537 | "outputs": [ 538 | { 539 | "name": "stdout", 540 | "output_type": "stream", 541 | "text": [ 542 | "start loading: 2019-04-27 23:16:56:863190\n", 543 | "end loading: 2019-04-27 23:16:58:359194\n" 544 | ] 545 | } 546 | ], 547 | "source": [ 548 | "# get related industries' data from Wind to calculate the industries's average EV/EBITDA and ROIC\n", 549 | "\n", 550 | "show_time(\"start loading\")\n", 551 | "\n", 552 | "industry_mktcap = w.wses(\"1000012612000000,1000012613000000\", \"sec_mkt_cap_today_sum_chn\", \"2015-01-01\", \"2019-04-26\", \"Period=M;Fill=Previous\")\n", 553 | "industry_ebitdatosales = w.wses(\"1000012612000000,1000012613000000\", \"sec_ebitdatosales_overall_glb\", \"2015-01-01\", \"2019-04-26\", \"Period=M;Fill=Previous\")\n", 554 | "industry_gr = w.wses(\"1000012612000000,1000012613000000\", \"sec_gr_sum_chn\", \"2015-01-01\", \"2019-04-26\", \"Period=M;Fill=Previous\")\n", 555 | "industry_roic = w.wses(\"1000012612000000,1000012613000000\", \"sec_roic_avg_glb\", \"2015-01-01\", \"2019-04-26\", \"Period=M;Fill=Previous\")\n", 556 | "\n", 557 | "show_time(\"end loading\")" 558 | ] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "execution_count": 144, 563 | "metadata": {}, 564 | "outputs": [], 565 | "source": [ 566 | "# convert the data into dataframe\n", 567 | "df1 = to_industry_df(industry_mktcap)\n", 568 | "df2 = to_industry_df(industry_ebitdatosales)\n", 569 | "df3 = to_industry_df(industry_gr)\n", 570 | "df4 = to_industry_df(industry_roic)\n", 571 | "# concat dataframes together\n", 572 | "industry_data = pd.concat([df1, df2[\"SEC_EBITDATOSALES_OVERALL_GLB\"], df3[\"SEC_GR_SUM_CHN\"], df4[\"SEC_ROIC_AVG_GLB\"]], \n", 573 | " axis=1, join=\"outer\")\n", 574 | "# convert index into datetime object\n", 575 | "industry_data[\"date\"] = pd.to_datetime(industry_data.index, format=\"%Y-%m-%d\")\n", 576 | "industry_data.set_index(\"date\", inplace=True)\n", 577 | "# fill nan with data of the nearest month\n", 578 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"].fillna(method=\"ffill\", axis=0)\n", 579 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"].fillna(method=\"bfill\", axis=0)\n", 580 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"].fillna(method=\"ffill\", axis=0)\n", 581 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"].fillna(method=\"bfill\", axis=0)" 582 | ] 583 | }, 584 | { 585 | "cell_type": "code", 586 | "execution_count": 152, 587 | "metadata": {}, 588 | "outputs": [], 589 | "source": [ 590 | "# calculate industries' EV/EBITDA \n", 591 | "industry_data[\"EV2_TO_EBITDA\"] = industry_data[\"SEC_MKT_CAP_TODAY_SUM_CHN\"] / (industry_data[\"SEC_EBITDATOSALES_OVERALL_GLB\"] * industry_data[\"SEC_GR_SUM_CHN\"])\n", 592 | "# deal with the abnormal values\n", 593 | "for i in range(len(industry_data)):\n", 594 | " if np.isinf(industry_data[\"EV2_TO_EBITDA\"][i]):\n", 595 | " industry_data[\"EV2_TO_EBITDA\"][i] = np.nan\n", 596 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"].fillna(method=\"ffill\", axis=0)\n", 597 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"].fillna(method=\"bfill\", axis=0)\n", 598 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"].fillna(method=\"ffill\", axis=0)\n", 599 | "industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"] = industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"].fillna(method=\"bfill\", axis=0)\n", 600 | "# drop needless columns\n", 601 | "industry_data = industry_data.drop(columns=[\"SEC_MKT_CAP_TODAY_SUM_CHN\", \"SEC_EBITDATOSALES_OVERALL_GLB\", \"SEC_GR_SUM_CHN\"])" 602 | ] 603 | }, 604 | { 605 | "cell_type": "code", 606 | "execution_count": 164, 607 | "metadata": {}, 608 | "outputs": [], 609 | "source": [ 610 | "industry_data.to_pickle(\"industry_data.gz\")" 611 | ] 612 | }, 613 | { 614 | "cell_type": "code", 615 | "execution_count": 168, 616 | "metadata": {}, 617 | "outputs": [], 618 | "source": [ 619 | "# fill the nans with industry's average\n", 620 | "for ind in ind_1: # loop through the nans\n", 621 | " if data[\"INDUSTRY_SW\"][ind] == \"银行\": # see which industry it belongs to\n", 622 | " date = data.index[ind]\n", 623 | " for index, row in industry_data[industry_data[\"INDUSTRY_SW\"] == \"银行\"].iterrows():\n", 624 | " if index == date:\n", 625 | " data[\"EV2_TO_EBITDA\"][ind] = row[\"EV2_TO_EBITDA\"]\n", 626 | " data[\"ROIC\"][ind] = row[\"SEC_ROIC_AVG_GLB\"]\n", 627 | " if data[\"INDUSTRY_SW\"][ind] == \"非银金融\":\n", 628 | " date = data.index[ind]\n", 629 | " for index, row in industry_data[industry_data[\"INDUSTRY_SW\"] == \"非银金融\"].iterrows():\n", 630 | " if index == date:\n", 631 | " data[\"EV2_TO_EBITDA\"][ind] = row[\"EV2_TO_EBITDA\"]\n", 632 | " data[\"ROIC\"][ind] = row[\"SEC_ROIC_AVG_GLB\"]" 633 | ] 634 | }, 635 | { 636 | "cell_type": "code", 637 | "execution_count": 170, 638 | "metadata": {}, 639 | "outputs": [ 640 | { 641 | "data": { 642 | "text/plain": [ 643 | "WINDCODE False\n", 644 | "SEC_NAME False\n", 645 | "INDEXCODE_SW False\n", 646 | "INDUSTRY_SW False\n", 647 | "EV False\n", 648 | "PE_TTM False\n", 649 | "PB_MRQ False\n", 650 | "PS_TTM False\n", 651 | "PCF_OCF_TTM False\n", 652 | "EV2_TO_EBITDA False\n", 653 | "ROE False\n", 654 | "ROIC False\n", 655 | "PROFITTOGR False\n", 656 | "YOYPROFIT False\n", 657 | "YOY_TR False\n", 658 | "TURN False\n", 659 | "CLOSE False\n", 660 | "dtype: bool" 661 | ] 662 | }, 663 | "execution_count": 170, 664 | "metadata": {}, 665 | "output_type": "execute_result" 666 | } 667 | ], 668 | "source": [ 669 | "pd.isnull(data).any() # check if there're still nans" 670 | ] 671 | }, 672 | { 673 | "cell_type": "code", 674 | "execution_count": 173, 675 | "metadata": {}, 676 | "outputs": [], 677 | "source": [ 678 | "data.to_pickle(\"csi_500_data_preprocessed.gz\")" 679 | ] 680 | } 681 | ], 682 | "metadata": { 683 | "kernelspec": { 684 | "display_name": "Python 3", 685 | "language": "python", 686 | "name": "python3" 687 | }, 688 | "language_info": { 689 | "codemirror_mode": { 690 | "name": "ipython", 691 | "version": 3 692 | }, 693 | "file_extension": ".py", 694 | "mimetype": "text/x-python", 695 | "name": "python", 696 | "nbconvert_exporter": "python", 697 | "pygments_lexer": "ipython3", 698 | "version": "3.7.3" 699 | } 700 | }, 701 | "nbformat": 4, 702 | "nbformat_minor": 2 703 | } 704 | -------------------------------------------------------------------------------- /FP1.2_Preprocess_Factors.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Preprocess Factors" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 2, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "%matplotlib inline\n", 17 | "\n", 18 | "import matplotlib\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import numpy as np\n", 21 | "import pandas as pd\n", 22 | "import tushare as ts\n", 23 | "from WindPy import *\n", 24 | "import datetime\n", 25 | "import time\n", 26 | "import math \n", 27 | "from statsmodels import regression, stats\n", 28 | "import statsmodels.api as sm\n", 29 | "\n", 30 | "%run final_project.py\n", 31 | "\n", 32 | "matplotlib.rcParams[\"figure.figsize\"] = (16, 9)" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 3, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "csi_500_data = pd.read_pickle(\"csi_500_data_preprocessed.gz\")" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "### 1. Calculate next month's return" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 4, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "# calculate monthly return\n", 58 | "# increase the scale to make factor betas easier to read\n", 59 | "csi_500_data[\"NEXT_RETURN\"] = (csi_500_data[\"CLOSE\"] / csi_500_data[\"CLOSE\"].shift(1) - 1) * 100\n", 60 | "csi_500_data[\"NEXT_RETURN\"] = csi_500_data[\"NEXT_RETURN\"].shift(-1)\n", 61 | "# trim the last month with no next month's return\n", 62 | "csi_500_data = csi_500_data[\"2015-01-01\":\"2019-03-31\"]\n", 63 | "# sort the data by index for cross-sectional regression\n", 64 | "csi_500_data = csi_500_data.sort_index()" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 5, 70 | "metadata": {}, 71 | "outputs": [ 72 | { 73 | "data": { 74 | "text/html": [ 75 | "
\n", 76 | "\n", 89 | "\n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | "
WINDCODESEC_NAMEINDEXCODE_SWINDUSTRY_SWEVPE_TTMPB_MRQPS_TTMPCF_OCF_TTMEV2_TO_EBITDAROEROICPROFITTOGRYOYPROFITYOY_TRTURNCLOSENEXT_RETURN
date
2015-01-30000006.SZ深振业A801180.SI房地产8.77497e+0917.44012.239573.78038-9.3429413.05514.76033.03115.1535597.159428.38750.85446.51.07692
2015-01-30000656.SZ金科股份801180.SI房地产2.17947e+1030.36532.712921.25632-2.4980851.01881.0530.23686.2844-62.3157-13.703398.802215.811.45478
2015-01-30002517.SZ恺英网络801130.SI传媒2.54769e+09-122.0024.083977.134812939.07-154.1250.70140.71925.0912145.8313.16492.0515314.410
2015-01-30600872.SH中炬高新801120.SI食品饮料9.66321e+0933.71974.24413.7250347.204421.87792.23581.98038.9345-25.7219-2.862952.802812.139.15087
2015-01-30002544.SZ杰赛科技801770.SI通信1.4529e+10151.60513.35917.95045-124.90486.26761.0651.09673.0641-3.873510.910430.554828.173.26589
\n", 242 | "
" 243 | ], 244 | "text/plain": [ 245 | " WINDCODE SEC_NAME INDEXCODE_SW INDUSTRY_SW EV PE_TTM \\\n", 246 | "date \n", 247 | "2015-01-30 000006.SZ 深振业A 801180.SI 房地产 8.77497e+09 17.4401 \n", 248 | "2015-01-30 000656.SZ 金科股份 801180.SI 房地产 2.17947e+10 30.3653 \n", 249 | "2015-01-30 002517.SZ 恺英网络 801130.SI 传媒 2.54769e+09 -122.002 \n", 250 | "2015-01-30 600872.SH 中炬高新 801120.SI 食品饮料 9.66321e+09 33.7197 \n", 251 | "2015-01-30 002544.SZ 杰赛科技 801770.SI 通信 1.4529e+10 151.605 \n", 252 | "\n", 253 | " PB_MRQ PS_TTM PCF_OCF_TTM EV2_TO_EBITDA ROE ROIC \\\n", 254 | "date \n", 255 | "2015-01-30 2.23957 3.78038 -9.34294 13.0551 4.7603 3.031 \n", 256 | "2015-01-30 2.71292 1.25632 -2.49808 51.0188 1.053 0.2368 \n", 257 | "2015-01-30 4.08397 7.13481 2939.07 -154.125 0.7014 0.7192 \n", 258 | "2015-01-30 4.2441 3.72503 47.2044 21.8779 2.2358 1.9803 \n", 259 | "2015-01-30 13.3591 7.95045 -124.904 86.2676 1.065 1.0967 \n", 260 | "\n", 261 | " PROFITTOGR YOYPROFIT YOY_TR TURN CLOSE NEXT_RETURN \n", 262 | "date \n", 263 | "2015-01-30 15.1535 597.159 428.387 50.8544 6.5 1.07692 \n", 264 | "2015-01-30 6.2844 -62.3157 -13.7033 98.8022 15.81 1.45478 \n", 265 | "2015-01-30 5.0912 145.83 13.1649 2.05153 14.41 0 \n", 266 | "2015-01-30 8.9345 -25.7219 -2.8629 52.8028 12.13 9.15087 \n", 267 | "2015-01-30 3.0641 -3.8735 10.9104 30.5548 28.17 3.26589 " 268 | ] 269 | }, 270 | "execution_count": 5, 271 | "metadata": {}, 272 | "output_type": "execute_result" 273 | } 274 | ], 275 | "source": [ 276 | "csi_500_data.head()" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 6, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "53347050139.36038\n", 289 | "1611123200.0\n", 290 | "52.0827\n", 291 | "-49.3532\n" 292 | ] 293 | } 294 | ], 295 | "source": [ 296 | "# print(csi_500_data.loc[\"2015-02-27\", \"EV\"].max())\n", 297 | "# print(csi_500_data.loc[\"2015-02-27\", \"EV\"].min())\n", 298 | "# print(csi_500_data.loc[\"2015-02-27\", \"ROE\"].max())\n", 299 | "# print(csi_500_data.loc[\"2015-02-27\", \"ROE\"].min())" 300 | ] 301 | }, 302 | { 303 | "cell_type": "markdown", 304 | "metadata": {}, 305 | "source": [ 306 | "### 2. Winsorize, standardize and neutralize factor values" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": 58, 312 | "metadata": {}, 313 | "outputs": [], 314 | "source": [ 315 | "factor_cols = [\"EV\", \"PE_TTM\", \"PB_MRQ\", \"PS_TTM\", \"PCF_OCF_TTM\", \"EV2_TO_EBITDA\", \n", 316 | " \"ROE\", \"ROIC\", \"PROFITTOGR\", \"YOYPROFIT\", \"YOY_TR\", \"TURN\"]" 317 | ] 318 | }, 319 | { 320 | "cell_type": "markdown", 321 | "metadata": {}, 322 | "source": [ 323 | "#### 2.1 Winsorize\n", 324 | "Trim the outliers at the tail (here we use 2.5 percentile as limit)." 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "execution_count": 7, 330 | "metadata": {}, 331 | "outputs": [], 332 | "source": [ 333 | "def winsorize(df, factor, min=0.025, max=0.975):\n", 334 | " \"\"\" Quantile Method \"\"\"\n", 335 | " sort = df[factor].sort_values()\n", 336 | " q = sort.quantile([min, max])\n", 337 | " return np.clip(df[factor], q.iloc[0], q.iloc[1])\n", 338 | "\n", 339 | "# def winsorize(series, n=3):\n", 340 | "# \"\"\" Median Absolute Deviation Method \"\"\"\n", 341 | "# median = series.quantile(n)\n", 342 | "# new_median = ((series - median).abs()).quantile(n)\n", 343 | "# max_range = median + new_median * n\n", 344 | "# min_range = median - new_median * n\n", 345 | "# return np.clip(series, min_range, max_range)" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": 8, 351 | "metadata": {}, 352 | "outputs": [ 353 | { 354 | "name": "stdout", 355 | "output_type": "stream", 356 | "text": [ 357 | "start loop: 2019-04-30 10:09:55:675264\n", 358 | "end loop: 2019-04-30 10:27:38:808778\n" 359 | ] 360 | } 361 | ], 362 | "source": [ 363 | "show_time(\"start loop\")\n", 364 | "\n", 365 | "for date in csi_500_data.index:\n", 366 | " for factor in factor_cols:\n", 367 | " csi_500_data.loc[date, factor] = winsorize(csi_500_data.loc[date], factor)\n", 368 | " \n", 369 | "show_time(\"end loop\") # run for about 20 mins, inefficient code needed to be improved" 370 | ] 371 | }, 372 | { 373 | "cell_type": "code", 374 | "execution_count": 9, 375 | "metadata": {}, 376 | "outputs": [ 377 | { 378 | "name": "stdout", 379 | "output_type": "stream", 380 | "text": [ 381 | "35778658816.96001\n", 382 | "3276000000.0\n", 383 | "26.54500000000001\n", 384 | "-3.4263000000000003\n" 385 | ] 386 | } 387 | ], 388 | "source": [ 389 | "print(csi_500_data.loc[\"2015-02-27\", \"EV\"].max())\n", 390 | "print(csi_500_data.loc[\"2015-02-27\", \"EV\"].min())\n", 391 | "print(csi_500_data.loc[\"2015-02-27\", \"ROE\"].max())\n", 392 | "print(csi_500_data.loc[\"2015-02-27\", \"ROE\"].min())" 393 | ] 394 | }, 395 | { 396 | "cell_type": "markdown", 397 | "metadata": {}, 398 | "source": [ 399 | "#### 2.2 Standardize\n", 400 | "Convert factor values into z-scores." 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": 46, 406 | "metadata": {}, 407 | "outputs": [], 408 | "source": [ 409 | "# standardize factor values\n", 410 | "def standardize(df, factor_cols):\n", 411 | " df[factor_cols] = (df[factor_cols] - df[factor_cols].groupby(\"date\").sum() / 500) / df[factor_cols].groupby(\"date\").std()\n", 412 | " return df" 413 | ] 414 | }, 415 | { 416 | "cell_type": "code", 417 | "execution_count": 47, 418 | "metadata": {}, 419 | "outputs": [], 420 | "source": [ 421 | "csi_500_factors = standardize(csi_500_data, factor_cols)" 422 | ] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "execution_count": 48, 427 | "metadata": {}, 428 | "outputs": [ 429 | { 430 | "data": { 431 | "text/html": [ 432 | "
\n", 433 | "\n", 446 | "\n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | "
WINDCODESEC_NAMEINDEXCODE_SWINDUSTRY_SWEVPE_TTMPB_MRQPS_TTMPCF_OCF_TTMEV2_TO_EBITDAROEROICPROFITTOGRYOYPROFITYOY_TRTURNCLOSENEXT_RETURN
date
2015-01-30000006.SZ深振业A801180.SI房地产-0.788196-0.384012-0.69018-0.359667-0.364825-0.6361060.2788370.08234150.3752123.584474.06479-0.1114526.51.07692
2015-01-30000656.SZ金科股份801180.SI房地产0.909253-0.24109-0.591124-0.709688-0.3164790.816005-0.386612-0.540042-0.265779-0.556602-0.6095870.97258715.811.45478
2015-01-30002517.SZ恺英网络801130.SI传媒-1.5242-1.92591-0.3042070.1055054.10622-1.13014-0.449723-0.432591-0.3520140.848102-0.0838537-1.2148214.410
2015-01-30600872.SH中炬高新801120.SI食品饮料-0.672391-0.203998-0.270697-0.3673430.0345743-0.298632-0.174303-0.151693-0.0742496-0.309643-0.397472-0.067399812.139.15087
2015-01-30002544.SZ杰赛科技801770.SI通信-0.03801951.099531.636770.218613-1.181042.16427-0.384458-0.348507-0.498517-0.162196-0.127968-0.570428.173.26589
\n", 599 | "
" 600 | ], 601 | "text/plain": [ 602 | " WINDCODE SEC_NAME INDEXCODE_SW INDUSTRY_SW EV PE_TTM \\\n", 603 | "date \n", 604 | "2015-01-30 000006.SZ 深振业A 801180.SI 房地产 -0.788196 -0.384012 \n", 605 | "2015-01-30 000656.SZ 金科股份 801180.SI 房地产 0.909253 -0.24109 \n", 606 | "2015-01-30 002517.SZ 恺英网络 801130.SI 传媒 -1.5242 -1.92591 \n", 607 | "2015-01-30 600872.SH 中炬高新 801120.SI 食品饮料 -0.672391 -0.203998 \n", 608 | "2015-01-30 002544.SZ 杰赛科技 801770.SI 通信 -0.0380195 1.09953 \n", 609 | "\n", 610 | " PB_MRQ PS_TTM PCF_OCF_TTM EV2_TO_EBITDA ROE ROIC \\\n", 611 | "date \n", 612 | "2015-01-30 -0.69018 -0.359667 -0.364825 -0.636106 0.278837 0.0823415 \n", 613 | "2015-01-30 -0.591124 -0.709688 -0.316479 0.816005 -0.386612 -0.540042 \n", 614 | "2015-01-30 -0.304207 0.105505 4.10622 -1.13014 -0.449723 -0.432591 \n", 615 | "2015-01-30 -0.270697 -0.367343 0.0345743 -0.298632 -0.174303 -0.151693 \n", 616 | "2015-01-30 1.63677 0.218613 -1.18104 2.16427 -0.384458 -0.348507 \n", 617 | "\n", 618 | " PROFITTOGR YOYPROFIT YOY_TR TURN CLOSE NEXT_RETURN \n", 619 | "date \n", 620 | "2015-01-30 0.375212 3.58447 4.06479 -0.111452 6.5 1.07692 \n", 621 | "2015-01-30 -0.265779 -0.556602 -0.609587 0.972587 15.81 1.45478 \n", 622 | "2015-01-30 -0.352014 0.848102 -0.0838537 -1.21482 14.41 0 \n", 623 | "2015-01-30 -0.0742496 -0.309643 -0.397472 -0.0673998 12.13 9.15087 \n", 624 | "2015-01-30 -0.498517 -0.162196 -0.127968 -0.5704 28.17 3.26589 " 625 | ] 626 | }, 627 | "execution_count": 48, 628 | "metadata": {}, 629 | "output_type": "execute_result" 630 | } 631 | ], 632 | "source": [ 633 | "csi_500_factors.head()" 634 | ] 635 | }, 636 | { 637 | "cell_type": "markdown", 638 | "metadata": {}, 639 | "source": [ 640 | "#### 2.3 Neutralize\n", 641 | "For instance, P/B in banking industry is much lower than that in TMT. Therefore, we should eliminate the impact of industrial betas to avoid concentration of our stock selection model, by extracting residual in multiple linear regression between factor value and dummy variables of industires." 642 | ] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "execution_count": 27, 647 | "metadata": {}, 648 | "outputs": [ 649 | { 650 | "name": "stdout", 651 | "output_type": "stream", 652 | "text": [ 653 | "start loop: 2019-04-30 10:49:37:841766\n", 654 | "end loop: 2019-04-30 10:54:59:545887\n" 655 | ] 656 | } 657 | ], 658 | "source": [ 659 | "show_time(\"start loop\")\n", 660 | "\n", 661 | "# add dummy variables to each row on the basis of corresponding industry\n", 662 | "industry_list = list(set(csi_500_factors[\"INDUSTRY_SW\"]))\n", 663 | "industry_df = pd.DataFrame(columns=industry_list, index=csi_500_factors.index)\n", 664 | "industry_df = pd.concat([csi_500_factors, industry_df], axis=1, join=\"outer\")\n", 665 | "# set the corresponding industry column to 1\n", 666 | "for i in range(len(industry_df)):\n", 667 | " industry_name = industry_df.iloc[i, 3]\n", 668 | " cols = list(industry_df.columns)\n", 669 | " for j in range(len(cols)):\n", 670 | " if cols[j] == industry_name:\n", 671 | " col_num = j\n", 672 | " industry_df.iloc[i, col_num] = 1\n", 673 | "# set the value of dummy variables of other industries to 0\n", 674 | "industry_df = industry_df.fillna(0)\n", 675 | "\n", 676 | "show_time(\"end loop\")" 677 | ] 678 | }, 679 | { 680 | "cell_type": "code", 681 | "execution_count": 64, 682 | "metadata": {}, 683 | "outputs": [ 684 | { 685 | "data": { 686 | "text/html": [ 687 | "
\n", 688 | "\n", 701 | "\n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | "
WINDCODESEC_NAMEINDEXCODE_SWINDUSTRY_SWEVPE_TTMPB_MRQPS_TTMPCF_OCF_TTMEV2_TO_EBITDA...休闲服务交通运输建筑装饰医药生物汽车综合钢铁房地产公用事业传媒
date
2015-01-30000006.SZ深振业A801180.SI房地产-0.788196-0.383454-0.249332-0.112060-0.138478-0.761099...0000000100
2015-01-30000656.SZ金科股份801180.SI房地产0.909253-0.142172-0.290587-0.549539-0.1213180.798007...0000000100
2015-01-30002517.SZ恺英网络801130.SI传媒-1.524204-2.132754-0.758481-0.5169063.636857-1.456548...0000000001
2015-01-30600872.SH中炬高新801120.SI食品饮料-0.672391-0.021666-0.169467-0.1434360.1328260.052961...0000000000
2015-01-30002544.SZ杰赛科技801770.SI通信-0.0380201.2629481.6219210.062658-1.3607392.008192...0000000000
\n", 875 | "

5 rows × 46 columns

\n", 876 | "
" 877 | ], 878 | "text/plain": [ 879 | " WINDCODE SEC_NAME INDEXCODE_SW INDUSTRY_SW EV PE_TTM \\\n", 880 | "date \n", 881 | "2015-01-30 000006.SZ 深振业A 801180.SI 房地产 -0.788196 -0.383454 \n", 882 | "2015-01-30 000656.SZ 金科股份 801180.SI 房地产 0.909253 -0.142172 \n", 883 | "2015-01-30 002517.SZ 恺英网络 801130.SI 传媒 -1.524204 -2.132754 \n", 884 | "2015-01-30 600872.SH 中炬高新 801120.SI 食品饮料 -0.672391 -0.021666 \n", 885 | "2015-01-30 002544.SZ 杰赛科技 801770.SI 通信 -0.038020 1.262948 \n", 886 | "\n", 887 | " PB_MRQ PS_TTM PCF_OCF_TTM EV2_TO_EBITDA ... 休闲服务 交通运输 \\\n", 888 | "date ... \n", 889 | "2015-01-30 -0.249332 -0.112060 -0.138478 -0.761099 ... 0 0 \n", 890 | "2015-01-30 -0.290587 -0.549539 -0.121318 0.798007 ... 0 0 \n", 891 | "2015-01-30 -0.758481 -0.516906 3.636857 -1.456548 ... 0 0 \n", 892 | "2015-01-30 -0.169467 -0.143436 0.132826 0.052961 ... 0 0 \n", 893 | "2015-01-30 1.621921 0.062658 -1.360739 2.008192 ... 0 0 \n", 894 | "\n", 895 | " 建筑装饰 医药生物 汽车 综合 钢铁 房地产 公用事业 传媒 \n", 896 | "date \n", 897 | "2015-01-30 0 0 0 0 0 1 0 0 \n", 898 | "2015-01-30 0 0 0 0 0 1 0 0 \n", 899 | "2015-01-30 0 0 0 0 0 0 0 1 \n", 900 | "2015-01-30 0 0 0 0 0 0 0 0 \n", 901 | "2015-01-30 0 0 0 0 0 0 0 0 \n", 902 | "\n", 903 | "[5 rows x 46 columns]" 904 | ] 905 | }, 906 | "execution_count": 64, 907 | "metadata": {}, 908 | "output_type": "execute_result" 909 | } 910 | ], 911 | "source": [ 912 | "industry_df.head()" 913 | ] 914 | }, 915 | { 916 | "cell_type": "code", 917 | "execution_count": 33, 918 | "metadata": {}, 919 | "outputs": [], 920 | "source": [ 921 | "def neutralize(df, factor):\n", 922 | " y = df[factor]\n", 923 | " x = df.iloc[:, 18:46]\n", 924 | " result = sm.OLS(y, x).fit()\n", 925 | " return result.resid # return residual" 926 | ] 927 | }, 928 | { 929 | "cell_type": "code", 930 | "execution_count": 35, 931 | "metadata": {}, 932 | "outputs": [ 933 | { 934 | "name": "stdout", 935 | "output_type": "stream", 936 | "text": [ 937 | "start loop: 2019-04-30 11:00:07:874836\n", 938 | "end loop: 2019-04-30 11:41:56:515849\n" 939 | ] 940 | } 941 | ], 942 | "source": [ 943 | "show_time(\"start loop\")\n", 944 | "\n", 945 | "# replace factor values with residuals\n", 946 | "for date in industry_df.index:\n", 947 | " for factor in factor_cols:\n", 948 | " industry_df.loc[date, factor] = neutralize(industry_df.loc[date], factor)\n", 949 | " \n", 950 | "show_time(\"end loop\")" 951 | ] 952 | }, 953 | { 954 | "cell_type": "code", 955 | "execution_count": 37, 956 | "metadata": {}, 957 | "outputs": [], 958 | "source": [ 959 | "factor_data = industry_df.drop(columns=industry_list)" 960 | ] 961 | }, 962 | { 963 | "cell_type": "code", 964 | "execution_count": 38, 965 | "metadata": {}, 966 | "outputs": [], 967 | "source": [ 968 | "factor_data.to_pickle(\"factor_data.gz\")" 969 | ] 970 | } 971 | ], 972 | "metadata": { 973 | "kernelspec": { 974 | "display_name": "Python 3", 975 | "language": "python", 976 | "name": "python3" 977 | }, 978 | "language_info": { 979 | "codemirror_mode": { 980 | "name": "ipython", 981 | "version": 3 982 | }, 983 | "file_extension": ".py", 984 | "mimetype": "text/x-python", 985 | "name": "python", 986 | "nbconvert_exporter": "python", 987 | "pygments_lexer": "ipython3", 988 | "version": "3.7.3" 989 | } 990 | }, 991 | "nbformat": 4, 992 | "nbformat_minor": 2 993 | } 994 | -------------------------------------------------------------------------------- /FP1.4_Backtesting.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Backtesting" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 39, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "%matplotlib inline\n", 17 | "\n", 18 | "import seaborn as sns\n", 19 | "import matplotlib\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "import numpy as np\n", 22 | "import pandas as pd\n", 23 | "import tushare as ts\n", 24 | "from WindPy import *\n", 25 | "import datetime\n", 26 | "import time\n", 27 | "import math \n", 28 | "from statsmodels import regression, stats\n", 29 | "import statsmodels.api as sm\n", 30 | "from pandas.plotting import register_matplotlib_converters\n", 31 | "\n", 32 | "register_matplotlib_converters()\n", 33 | "\n", 34 | "%run final_project.py\n", 35 | "\n", 36 | "matplotlib.rcParams[\"figure.figsize\"] = (16, 9)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": {}, 42 | "source": [ 43 | "### 1. Get CSI 500 Index price information" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 2, 49 | "metadata": {}, 50 | "outputs": [], 51 | "source": [ 52 | "tsapi = \"4f025f8dd1a96fd251f95c75d65a1023db3a27f8c9f3bc964ebd51d9\"\n", 53 | "pro = ts.pro_api(tsapi)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "df = pro.index_daily(ts_code='000905.SH', start_date='20180101', end_date='20190426')" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 4, 68 | "metadata": {}, 69 | "outputs": [], 70 | "source": [ 71 | "converted_timestamp = pd.to_datetime(df[\"trade_date\"], format=\"%Y-%m-%d\")\n", 72 | "df.index = converted_timestamp\n", 73 | "df = df.drop(columns=[\"trade_date\"])\n", 74 | "df = df.sort_index()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 5, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "data": { 84 | "text/html": [ 85 | "
\n", 86 | "\n", 99 | "\n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | "
ts_codecloseopenhighlowpre_closechangepct_chgvolamount
trade_date
2019-04-22000905.SH5723.04175821.02295824.52075704.97695810.1798-87.1381-1.4997158161026.0143410616.8
2019-04-23000905.SH5628.06245710.73345710.73345610.73535723.0417-94.9793-1.6596149871461.0133768248.9
2019-04-24000905.SH5679.72565636.40165682.47885568.40805628.062451.66320.9180134784412.0121970724.6
2019-04-25000905.SH5458.41945652.00565662.78985457.82545679.7256-221.3062-3.8964151401718.0132098714.9
2019-04-26000905.SH5408.03065427.62285496.03535407.19425458.4194-50.3888-0.9231124279880.0108970816.5
\n", 196 | "
" 197 | ], 198 | "text/plain": [ 199 | " ts_code close open high low pre_close \\\n", 200 | "trade_date \n", 201 | "2019-04-22 000905.SH 5723.0417 5821.0229 5824.5207 5704.9769 5810.1798 \n", 202 | "2019-04-23 000905.SH 5628.0624 5710.7334 5710.7334 5610.7353 5723.0417 \n", 203 | "2019-04-24 000905.SH 5679.7256 5636.4016 5682.4788 5568.4080 5628.0624 \n", 204 | "2019-04-25 000905.SH 5458.4194 5652.0056 5662.7898 5457.8254 5679.7256 \n", 205 | "2019-04-26 000905.SH 5408.0306 5427.6228 5496.0353 5407.1942 5458.4194 \n", 206 | "\n", 207 | " change pct_chg vol amount \n", 208 | "trade_date \n", 209 | "2019-04-22 -87.1381 -1.4997 158161026.0 143410616.8 \n", 210 | "2019-04-23 -94.9793 -1.6596 149871461.0 133768248.9 \n", 211 | "2019-04-24 51.6632 0.9180 134784412.0 121970724.6 \n", 212 | "2019-04-25 -221.3062 -3.8964 151401718.0 132098714.9 \n", 213 | "2019-04-26 -50.3888 -0.9231 124279880.0 108970816.5 " 214 | ] 215 | }, 216 | "execution_count": 5, 217 | "metadata": {}, 218 | "output_type": "execute_result" 219 | } 220 | ], 221 | "source": [ 222 | "df.tail()" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "metadata": {}, 228 | "source": [ 229 | "### 2. Compare the return of the index and our enhanced indexing strategy" 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "metadata": {}, 235 | "source": [ 236 | "2.1 Cumulative monthly return" 237 | ] 238 | }, 239 | { 240 | "cell_type": "code", 241 | "execution_count": 21, 242 | "metadata": {}, 243 | "outputs": [], 244 | "source": [ 245 | "test_return = pd.read_pickle(\"test_return.gz\")" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 7, 251 | "metadata": {}, 252 | "outputs": [], 253 | "source": [ 254 | "test_return[\"NEXT_RETURN\"] = test_return[\"NEXT_RETURN\"].cumsum() # strategy's cumulative return" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 8, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "text/html": [ 265 | "
\n", 266 | "\n", 279 | "\n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | "
NEXT_RETURN
2018-01-31-4.74539
2018-02-2828.5398
2018-03-3024.1962
2018-04-2726.1281
2018-05-3113.8019
2018-06-2916.6309
2018-07-318.91487
2018-08-318.03425
2018-09-28-3.5057
2018-10-316.82129
2018-11-304.23708
2018-12-284.83581
2019-01-3131.6054
2019-02-2840.82
2019-03-2942.3805
\n", 349 | "
" 350 | ], 351 | "text/plain": [ 352 | " NEXT_RETURN\n", 353 | "2018-01-31 -4.74539\n", 354 | "2018-02-28 28.5398\n", 355 | "2018-03-30 24.1962\n", 356 | "2018-04-27 26.1281\n", 357 | "2018-05-31 13.8019\n", 358 | "2018-06-29 16.6309\n", 359 | "2018-07-31 8.91487\n", 360 | "2018-08-31 8.03425\n", 361 | "2018-09-28 -3.5057\n", 362 | "2018-10-31 6.82129\n", 363 | "2018-11-30 4.23708\n", 364 | "2018-12-28 4.83581\n", 365 | "2019-01-31 31.6054\n", 366 | "2019-02-28 40.82\n", 367 | "2019-03-29 42.3805" 368 | ] 369 | }, 370 | "execution_count": 8, 371 | "metadata": {}, 372 | "output_type": "execute_result" 373 | } 374 | ], 375 | "source": [ 376 | "test_return" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 23, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "# calculate next month's returns of the index\n", 386 | "dates = test_return.index\n", 387 | "df_dates = df.loc[dates]\n", 388 | "df_dates[\"NEXT_RETURN\"] = (df_dates[\"close\"] / df_dates[\"close\"].shift(1) - 1) * 100\n", 389 | "df_dates[\"NEXT_RETURN\"] = df_dates[\"NEXT_RETURN\"].shift(-1)\n", 390 | "# add next month's return for the last month here\n", 391 | "df_dates.iloc[-1, -1] = (df_dates.iloc[-1, 1] / df.iloc[-1, 1] - 1) * 100" 392 | ] 393 | }, 394 | { 395 | "cell_type": "code", 396 | "execution_count": 10, 397 | "metadata": {}, 398 | "outputs": [], 399 | "source": [ 400 | "df_dates[\"NEXT_RETURN\"] = df_dates[\"NEXT_RETURN\"].cumsum() # index's cumulative return" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": 11, 406 | "metadata": {}, 407 | "outputs": [ 408 | { 409 | "data": { 410 | "text/plain": [ 411 | "2018-01-31 -2.676606\n", 412 | "2018-02-28 -1.164885\n", 413 | "2018-03-30 -5.314770\n", 414 | "2018-04-27 -7.132025\n", 415 | "2018-05-31 -16.458859\n", 416 | "2018-06-29 -17.015567\n", 417 | "2018-07-31 -24.221451\n", 418 | "2018-08-31 -24.514192\n", 419 | "2018-09-28 -35.516208\n", 420 | "2018-10-31 -33.079741\n", 421 | "2018-11-30 -37.846280\n", 422 | "2018-12-28 -37.643845\n", 423 | "2019-01-31 -17.320064\n", 424 | "2019-02-28 -6.925347\n", 425 | "2019-03-29 -4.343529\n", 426 | "Name: NEXT_RETURN, dtype: float64" 427 | ] 428 | }, 429 | "execution_count": 11, 430 | "metadata": {}, 431 | "output_type": "execute_result" 432 | } 433 | ], 434 | "source": [ 435 | "df_dates[\"NEXT_RETURN\"]" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "execution_count": 12, 441 | "metadata": {}, 442 | "outputs": [], 443 | "source": [ 444 | "diff = test_return[\"NEXT_RETURN\"] - df_dates[\"NEXT_RETURN\"] # difference between strategy's return and index's return" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "execution_count": 13, 450 | "metadata": {}, 451 | "outputs": [ 452 | { 453 | "data": { 454 | "text/plain": [ 455 | "2018-01-31 -2.06879\n", 456 | "2018-02-28 29.7047\n", 457 | "2018-03-30 29.5109\n", 458 | "2018-04-27 33.2601\n", 459 | "2018-05-31 30.2608\n", 460 | "2018-06-29 33.6464\n", 461 | "2018-07-31 33.1363\n", 462 | "2018-08-31 32.5484\n", 463 | "2018-09-28 32.0105\n", 464 | "2018-10-31 39.901\n", 465 | "2018-11-30 42.0834\n", 466 | "2018-12-28 42.4797\n", 467 | "2019-01-31 48.9255\n", 468 | "2019-02-28 47.7454\n", 469 | "2019-03-29 46.7241\n", 470 | "Name: NEXT_RETURN, dtype: object" 471 | ] 472 | }, 473 | "execution_count": 13, 474 | "metadata": {}, 475 | "output_type": "execute_result" 476 | } 477 | ], 478 | "source": [ 479 | "diff" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 14, 485 | "metadata": {}, 486 | "outputs": [ 487 | { 488 | "data": { 489 | "image/png": "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\n", 490 | "text/plain": [ 491 | "
" 492 | ] 493 | }, 494 | "metadata": { 495 | "needs_background": "light" 496 | }, 497 | "output_type": "display_data" 498 | } 499 | ], 500 | "source": [ 501 | "fig, ax = plt.subplots(figsize=(16, 9))\n", 502 | "plt.plot(test_return[\"NEXT_RETURN\"], \"r-\", label=\"Strategy's Return\")\n", 503 | "plt.plot(df_dates[\"NEXT_RETURN\"], \"g-\", label=\"CSI 500 Index's Return\")\n", 504 | "plt.bar(diff.index, diff, width=10, label=\"Active Return\")\n", 505 | "plt.legend(loc=\"lower right\")\n", 506 | "plt.grid(axis=\"y\")\n", 507 | "plt.ylabel(\"Return(%)\")\n", 508 | "plt.savefig(\"backtesting.png\")" 509 | ] 510 | }, 511 | { 512 | "cell_type": "markdown", 513 | "metadata": {}, 514 | "source": [ 515 | "2.2 Noncumulative monthly return" 516 | ] 517 | }, 518 | { 519 | "cell_type": "code", 520 | "execution_count": 48, 521 | "metadata": {}, 522 | "outputs": [ 523 | { 524 | "data": { 525 | "text/html": [ 526 | "
\n", 527 | "\n", 540 | "\n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | "
strategy return
2018-01-31 00:00:00-4.74539
2018-02-28 00:00:0033.2852
2018-03-30 00:00:00-4.34367
2018-04-27 00:00:001.93191
2018-05-31 00:00:00-12.3262
2018-06-29 00:00:002.82897
2018-07-31 00:00:00-7.71601
2018-08-31 00:00:00-0.880618
2018-09-28 00:00:00-11.5399
2018-10-31 00:00:0010.327
2018-11-30 00:00:00-2.58421
2018-12-28 00:00:000.598739
2019-01-31 00:00:0026.7696
2019-02-28 00:00:009.21462
2019-03-29 00:00:001.56049
\n", 610 | "
" 611 | ], 612 | "text/plain": [ 613 | " strategy return\n", 614 | "2018-01-31 00:00:00 -4.74539\n", 615 | "2018-02-28 00:00:00 33.2852\n", 616 | "2018-03-30 00:00:00 -4.34367\n", 617 | "2018-04-27 00:00:00 1.93191\n", 618 | "2018-05-31 00:00:00 -12.3262\n", 619 | "2018-06-29 00:00:00 2.82897\n", 620 | "2018-07-31 00:00:00 -7.71601\n", 621 | "2018-08-31 00:00:00 -0.880618\n", 622 | "2018-09-28 00:00:00 -11.5399\n", 623 | "2018-10-31 00:00:00 10.327\n", 624 | "2018-11-30 00:00:00 -2.58421\n", 625 | "2018-12-28 00:00:00 0.598739\n", 626 | "2019-01-31 00:00:00 26.7696\n", 627 | "2019-02-28 00:00:00 9.21462\n", 628 | "2019-03-29 00:00:00 1.56049" 629 | ] 630 | }, 631 | "execution_count": 48, 632 | "metadata": {}, 633 | "output_type": "execute_result" 634 | } 635 | ], 636 | "source": [ 637 | "test_return" 638 | ] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "execution_count": 49, 643 | "metadata": {}, 644 | "outputs": [ 645 | { 646 | "data": { 647 | "text/plain": [ 648 | "2018-01-31 -2.676606\n", 649 | "2018-02-28 1.511721\n", 650 | "2018-03-30 -4.149885\n", 651 | "2018-04-27 -1.817255\n", 652 | "2018-05-31 -9.326834\n", 653 | "2018-06-29 -0.556708\n", 654 | "2018-07-31 -7.205884\n", 655 | "2018-08-31 -0.292742\n", 656 | "2018-09-28 -11.002015\n", 657 | "2018-10-31 2.436467\n", 658 | "2018-11-30 -4.766539\n", 659 | "2018-12-28 0.202436\n", 660 | "2019-01-31 20.323781\n", 661 | "2019-02-28 10.394717\n", 662 | "2019-03-29 2.581818\n", 663 | "Name: NEXT_RETURN, dtype: float64" 664 | ] 665 | }, 666 | "execution_count": 49, 667 | "metadata": {}, 668 | "output_type": "execute_result" 669 | } 670 | ], 671 | "source": [ 672 | "df_dates[\"NEXT_RETURN\"]" 673 | ] 674 | }, 675 | { 676 | "cell_type": "code", 677 | "execution_count": 31, 678 | "metadata": {}, 679 | "outputs": [], 680 | "source": [ 681 | "test_return = test_return.rename(index=str, columns={\"NEXT_RETURN\": \"strategy return\"})\n", 682 | "comp = pd.concat([test_return, df_dates[\"NEXT_RETURN\"]], axis=1, join=\"outer\")\n", 683 | "comp = comp.rename(index=str, columns={\"NEXT_RETURN\": \"index return\"})\n", 684 | "comp[\"diff\"] = comp[\"strategy return\"] - comp[\"index return\"]" 685 | ] 686 | }, 687 | { 688 | "cell_type": "code", 689 | "execution_count": 47, 690 | "metadata": {}, 691 | "outputs": [ 692 | { 693 | "data": { 694 | "text/html": [ 695 | "
\n", 696 | "\n", 709 | "\n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | "
strategy returnindex returndiff
2018-01-31 00:00:00-4.74539-2.676606-2.06879
2018-02-28 00:00:0033.28521.51172131.7735
2018-03-30 00:00:00-4.34367-4.149885-0.193786
2018-04-27 00:00:001.93191-1.8172553.74917
2018-05-31 00:00:00-12.3262-9.326834-2.99934
2018-06-29 00:00:002.82897-0.5567083.38568
2018-07-31 00:00:00-7.71601-7.205884-0.510125
2018-08-31 00:00:00-0.880618-0.292742-0.587877
2018-09-28 00:00:00-11.5399-11.002015-0.537933
2018-10-31 00:00:0010.3272.4364677.89052
2018-11-30 00:00:00-2.58421-4.7665392.18233
2018-12-28 00:00:000.5987390.2024360.396303
2019-01-31 00:00:0026.769620.3237816.44582
2019-02-28 00:00:009.2146210.394717-1.1801
2019-03-29 00:00:001.560492.581818-1.02133
\n", 811 | "
" 812 | ], 813 | "text/plain": [ 814 | " strategy return index return diff\n", 815 | "2018-01-31 00:00:00 -4.74539 -2.676606 -2.06879\n", 816 | "2018-02-28 00:00:00 33.2852 1.511721 31.7735\n", 817 | "2018-03-30 00:00:00 -4.34367 -4.149885 -0.193786\n", 818 | "2018-04-27 00:00:00 1.93191 -1.817255 3.74917\n", 819 | "2018-05-31 00:00:00 -12.3262 -9.326834 -2.99934\n", 820 | "2018-06-29 00:00:00 2.82897 -0.556708 3.38568\n", 821 | "2018-07-31 00:00:00 -7.71601 -7.205884 -0.510125\n", 822 | "2018-08-31 00:00:00 -0.880618 -0.292742 -0.587877\n", 823 | "2018-09-28 00:00:00 -11.5399 -11.002015 -0.537933\n", 824 | "2018-10-31 00:00:00 10.327 2.436467 7.89052\n", 825 | "2018-11-30 00:00:00 -2.58421 -4.766539 2.18233\n", 826 | "2018-12-28 00:00:00 0.598739 0.202436 0.396303\n", 827 | "2019-01-31 00:00:00 26.7696 20.323781 6.44582\n", 828 | "2019-02-28 00:00:00 9.21462 10.394717 -1.1801\n", 829 | "2019-03-29 00:00:00 1.56049 2.581818 -1.02133" 830 | ] 831 | }, 832 | "execution_count": 47, 833 | "metadata": {}, 834 | "output_type": "execute_result" 835 | } 836 | ], 837 | "source": [ 838 | "comp" 839 | ] 840 | }, 841 | { 842 | "cell_type": "code", 843 | "execution_count": 46, 844 | "metadata": {}, 845 | "outputs": [ 846 | { 847 | "data": { 848 | "image/png": "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\n", 849 | "text/plain": [ 850 | "
" 851 | ] 852 | }, 853 | "metadata": { 854 | "needs_background": "light" 855 | }, 856 | "output_type": "display_data" 857 | } 858 | ], 859 | "source": [ 860 | "fig, ax = plt.subplots(figsize=(16, 9))\n", 861 | "plt.plot(comp[\"strategy return\"], \"r-\", label=\"Strategy's Return\")\n", 862 | "plt.plot(comp[\"index return\"], \"g-\", label=\"CSI 500 Index's Return\")\n", 863 | "plt.bar(comp.index, comp[\"diff\"], width=0.8, label=\"Active Return\")\n", 864 | "plt.legend(loc=\"lower right\")\n", 865 | "plt.grid(axis=\"y\")\n", 866 | "plt.ylabel(\"Return(%)\")\n", 867 | "plt.xticks(rotation=45)\n", 868 | "plt.savefig(\"backtesting_noncumulative.png\")" 869 | ] 870 | } 871 | ], 872 | "metadata": { 873 | "kernelspec": { 874 | "display_name": "Python 3", 875 | "language": "python", 876 | "name": "python3" 877 | }, 878 | "language_info": { 879 | "codemirror_mode": { 880 | "name": "ipython", 881 | "version": 3 882 | }, 883 | "file_extension": ".py", 884 | "mimetype": "text/x-python", 885 | "name": "python", 886 | "nbconvert_exporter": "python", 887 | "pygments_lexer": "ipython3", 888 | "version": "3.7.3" 889 | } 890 | }, 891 | "nbformat": 4, 892 | "nbformat_minor": 2 893 | } 894 | -------------------------------------------------------------------------------- /Final Project.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/Final Project.pptx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Final Project: Multi-Factor Model (Regression Method) 2 | 3 | ### Objectives: 4 | Use Multi-Factor Model to build an enhanced indexing strategy for CSI 500 Index; 5 | Capture a relatively high active return. 6 | 7 | ### Outlines: 8 | 1. Get data of CSI 500 constituent stocks from Chinese local information server, Wind, and preprocess the data; 9 | 2. Select factors such as size (market cap), value (P/E, P/B, P/S, P/CF, EV/EBITDA), profitability (net profit margin, ROE, ROIC), growth (year-on-year revenue growth rate, year-on-year net income growth rate), trade (turnover rate); 10 | 3. Use OLS (or LASSO which might be more optimal) to define factor's sensitivity, test each factor’s effectiveness and eliminate redundant factors with multicollinearity and low r-square; 11 | 4. Build an algo to allocate active weights on different constituent stocks on the basis of the expected next month's return predicted by the regression model (give more weights on stocks with relatively higher expected return and vice versa); 12 | 5. Backtesting: test the effectiveness of the model and check the portfolio’s alpha over the benchmark. 13 | -------------------------------------------------------------------------------- /backtesting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/backtesting.png -------------------------------------------------------------------------------- /backtesting_noncumulative.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/backtesting_noncumulative.png -------------------------------------------------------------------------------- /comparison1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/comparison1.png -------------------------------------------------------------------------------- /comparison2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/comparison2.png -------------------------------------------------------------------------------- /csi_500_constituent_info.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/csi_500_constituent_info.gz -------------------------------------------------------------------------------- /csi_500_data_preprocessed.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/csi_500_data_preprocessed.gz -------------------------------------------------------------------------------- /csi_500_data_raw.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/csi_500_data_raw.gz -------------------------------------------------------------------------------- /factor_data.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/factor_data.gz -------------------------------------------------------------------------------- /factors_corr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/factors_corr.png -------------------------------------------------------------------------------- /final_project.py: -------------------------------------------------------------------------------- 1 | import matplotlib 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | import pandas as pd 5 | import tushare as ts 6 | from WindPy import * 7 | import datetime 8 | import time 9 | import math 10 | from statsmodels import regression, stats 11 | import statsmodels.api as sm 12 | 13 | matplotlib.rcParams["figure.figsize"] = (14, 6) 14 | 15 | 16 | def show_time(label_string): 17 | t = time.time() 18 | st = datetime.datetime.fromtimestamp(t).strftime("%Y-%m-%d %H:%M:%S:%f") 19 | print(label_string + ": " + st) 20 | 21 | 22 | def apidata_to_df(apidata): 23 | df = pd.DataFrame(apidata.Data, index=apidata.Fields, columns=apidata.Times) 24 | df = df.T 25 | return df 26 | 27 | 28 | def to_industry_df(apidata): 29 | df1 = pd.DataFrame(apidata.Data[0], index=apidata.Times, columns=apidata.Fields) 30 | df1["INDUSTRY_SW"] = "银行" 31 | df2 = pd.DataFrame(apidata.Data[1], index=apidata.Times, columns=apidata.Fields) 32 | df2["INDUSTRY_SW"] = "非银金融" 33 | df = pd.concat([df1, df2], axis=0, join="outer") 34 | return df 35 | 36 | -------------------------------------------------------------------------------- /industry_data.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/industry_data.gz -------------------------------------------------------------------------------- /pvalues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/pvalues.png -------------------------------------------------------------------------------- /test_return.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/test_return.gz -------------------------------------------------------------------------------- /winsorized_factors.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chichihua/Multi-Factor-Model/f5cbcf0f7d65b11810e1d71523506a395fc44c2c/winsorized_factors.gz -------------------------------------------------------------------------------- /workflow.md: -------------------------------------------------------------------------------- 1 | # Final Project: Enhanced Indexing Strategy with Multi-Factor Model 2 | 3 | Group: 4 4 | 5 | Members: Jiahua Jiang, Bo Sun, Baowen Cao 6 | 7 | Date: 2019/04/30 8 | 9 | ## Project Introduction 10 | 11 | In this project, we built up an Enhanced Indexing Strategy of China Securities Index (CSI) 500 on the basis of Arbitrage Pricing Theory (APT), by applying the Multi-Factor Model with regression method to predict the expected return of CSI 500 constituent stocks and determining the active weights in accord with our prediction. 12 | 13 | ## Dataset 14 | 15 | The stock price and financial data were retrieved from Chinese information server Wind and Tushare. 16 | 17 | ## Workflow 18 | 19 | * Collect and Preprocess Data 20 | - Get current CSI 500 constituent stocks and weights from Wind (csi_500_constituent_info.gz) 21 | - Get monthly price and factor information of 500 constituent stocks from 2015-01-01 to 2019-04-26 (csi_500_data_raw.gz) 22 | - Size 23 | - Market Capitalization: "EV" 24 | - Value 25 | - Trailing Twelve Months P/E Ratio: "PE_TTM" 26 | - Most Resent Quarter P/B Ratio: "PB_MRQ" 27 | - Trailing Twelve Months P/S Ratio: "PS_TTM" 28 | - Trailing Twelve Months P/CF(Operating Cash Flow) Ratio: "PCF_OCF_TTM" 29 | - EV/EBITDA Ratio: "EV2_TO_EBITDA" 30 | - Profitability 31 | - Return on Equity: "ROE" 32 | - Return on Invested Capital: "ROIC" 33 | - Net Profit Margin: "PROFITTOGR" 34 | - Growth 35 | - Year-over-Year Net Income Growth Rate: "YOYPROFIT" 36 | - Year-over-Year Revenue Growth Rate: "YOY_TR" 37 | - Trading 38 | - Turnover Rate: "TURN" 39 | - Preprocess data (csi_500_data_preprocessed.gz) 40 | - Fill nans with data of the nearest month 41 | - Check if there're any nans left and locate them 42 | - EV/EBITDA and ROIC of 10 companies in banking and non-bank financial industries are missing 43 | - Fill nans remaining with industry's average 44 | * Preprocess Factors 45 | - Calculate next month's return as dependent variable for future regression 46 | - Winsorize, standardize and neutralize factor values (factor_data.gz) 47 | - Winsorize: Trim the outliers at the tail (2.5 percentile) to avoid anomalies 48 | - Standardize: Convert factor values into z-scores to eliminate discrepancies in number scale 49 | - Neutralize: Eliminate the impact of industrial betas to avoid concentration of our stock selection model, by extracting residual in multiple linear regression between factor value and dummy variables of industries 50 | * Factor Modeling and Strategy Construction 51 | - Separate the data into training and testing 52 | - Training data: 2015-01-01 to 2017-12-31 53 | - Testing Data: 2018-01-01 to 2019-04-26 54 | - Multiple linear regression (OLS) between next month's return and factor values 55 | - Improve the regression model 56 | - Sort the p-values to check the significance level of each factor's exposure (slope coefficient) 57 | - 58 | - Plot a heatmap of the correlation matrix of factors to tell if there's multicollinearity 59 | - 60 | - Remove redundant factors of high correlation with other factors and high p-values (low significance level) 61 | - Factor remaining: "EV", "PB_MRQ", "EV2_TO_EBITDA", "ROE", "YOYPROFIT", "YOY_TR", "TURN" 62 | - Rerun multiple linear regression and compare the results 63 | - 64 | - 65 | - Build up an enhanced indexing strategy on the basis of model prediction 66 | - Clearing all positions and opening new positions at the end of each month 67 | - Using the multi-factor model to generate the score (prediction of expected return) of each constituent stock 68 | - Sort the constituent stocks by their scores and separate them into 10 groups 69 | - Set a multiplier for each group to put more weight on high-score stocks and vice versa 70 | - Clean up if there's still weight remaining 71 | - Evenly separated into 10 parts to buy top 10 stocks 72 | - Record the weighted return 73 | * Backtesting 74 | - Get CSI 500 price information from Tushare 75 | - Check the active return: compare the return of the index and our enhanced indexing strategy 76 | - Cumulative Monthly Return 77 | 78 | - Noncumulative Monthly Return 79 | 80 | - Performance evaluation 81 | - Cumulative return of the testing period: 42.38% 82 | - Cumulative active return: 46.72% 83 | - Information ratio: 0.36 84 | 85 | ## Summary 86 | * Benefits: 87 | - The enhanced indexing strategy outperforms the benchmark index to a considerable extent in 7 among 15 months, and has low drawbacks the month it performs worse than the benchmark 88 | - The model is meaningful on both statistical and economic aspects given the predictions are made on the basis of different catogories of factors 89 | - Since CSI 500 has a large sample size and the testing period is long, the multi-factor model tends to be more effective 90 | - Algorithmic model can be better than subjective judgment when dealing with stock selection in a large stock pool such as CSI 500 91 | * Limitations: 92 | - The model ignores trading cost which will narrower the active return 93 | - The model ignores free-float market capitalization which may lead to problems in stock trading 94 | - The model ignores specific investment amount when using 1 as total weight, not taking liquidity need and market impact in consideration 95 | - The OLS method might not be optimal given it has a low r-squared and the process of removing redundant factors is subjective, though the slope coefficients are significant, using LASSO (Least Absolute Shrinkage and Selection Operator) instead might be better 96 | - The effectiveness of the model might be changing over time --------------------------------------------------------------------------------