{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "\n", " require.config({\n", " paths: {\n", " DT: '//cdn.datatables.net/1.10.20/js/jquery.dataTables.min',\n", " }\n", " });\n", " $('head').append('');\n", " $('head').append('')\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import xalpha as xa\n", "import pandas as pd\n", "\n", "xa.set_display(\"notebook\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 指数与基金信息" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 指数信息类" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "zzhli = xa.indexinfo(\"0000922\")\n", "# 指数注意需要给定的代码为七位,第一位数字代表市场情况,0 代表沪市, 1 代表深市\n", "# 本例即为沪市 000922 的指数获取,对应中证红利指数\n", "# 也可直接 xa.indexinfo(\"SH000922\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "$(element).html(`\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluetotvaluecomment
2020-04-134.0879914012.58810
2020-04-144.1400724063.70870
2020-04-154.1173364041.39180
2020-04-164.1047134029.00200
2020-04-174.1168534040.91760
2020-04-204.1406884064.31260
2020-04-214.1156174039.70470
2020-04-224.1326694056.44170
2020-04-234.1198474043.85650
2020-04-244.0949514019.41970
2020-04-274.1189604042.98540
`);\n", "\n", " require([\"DT\"], function(DT) {$(document).ready( () => {\n", " // Turn existing table into datatable\n", " $(element).find(\"table.dataframe\").DataTable({'scrollX': '100%'});\n", " })\n", " });\n", " " ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluetotvaluecomment
37112020-04-134.0879914012.58810
37122020-04-144.1400724063.70870
37132020-04-154.1173364041.39180
37142020-04-164.1047134029.00200
37152020-04-174.1168534040.91760
37162020-04-204.1406884064.31260
37172020-04-214.1156174039.70470
37182020-04-224.1326694056.44170
37192020-04-234.1198474043.85650
37202020-04-244.0949514019.41970
37212020-04-274.1189604042.98540
\n", "
" ], "text/plain": [ " date netvalue totvalue comment\n", "3711 2020-04-13 4.087991 4012.5881 0\n", "3712 2020-04-14 4.140072 4063.7087 0\n", "3713 2020-04-15 4.117336 4041.3918 0\n", "3714 2020-04-16 4.104713 4029.0020 0\n", "3715 2020-04-17 4.116853 4040.9176 0\n", "3716 2020-04-20 4.140688 4064.3126 0\n", "3717 2020-04-21 4.115617 4039.7047 0\n", "3718 2020-04-22 4.132669 4056.4417 0\n", "3719 2020-04-23 4.119847 4043.8565 0\n", "3720 2020-04-24 4.094951 4019.4197 0\n", "3721 2020-04-27 4.118960 4042.9854 0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.price[zzhli.price[\"date\"] >= \"2020-04-11\"]\n", "# 指数的价格表,数据类型为 pandas.DataFrame, 净值栏为初始值归一化的1的值,总值栏对应指数的真实值,注释栏均为空" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('中证红利', '0000922')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.name, zzhli.code # 指数类的部分属性" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "zzhli.bcmkset(xa.indexinfo(\"SH000300\"), start=\"2014-01-01\")\n", "# 设定中证红利的比较基准为沪深300指数,以便于接下来更多量化分析\n", "# 同时设定比较分析的区间段是从13年开始的" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.v_netvalue()\n", "# 指数与基准指数的可视化\n", "# 二者都在研究区间的初始日归一" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.01574527073375659, 0.9521439752795914)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.alpha(), zzhli.beta() # 计算中证红利指数相对于沪深300的 alpha 和 beta 收益" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9546502342557672" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.correlation_coefficient(\"2020-01-01\") # 计算两个指数截止2019年底的相关系数" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.2380163305711998, 0.2387765132801344)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.algorithm_volatility(), zzhli.benchmark_volatility()\n", "# 计算中证红利和基准沪深300,截止目前的年化波动率" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0956, 0.082)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.total_annualized_returns(), zzhli.benchmark_annualized_returns()\n", "# 计算中证红利和基准沪深300的年化收益率" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.1074014053052625, 3.8186585488765177)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zzhli.information_ratio(\"2015-06-01\"), zzhli.sharpe(\"2015-06-01\")\n", "# 计算指数截止 2015-06-01 的信息比率和夏普比率" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* 简单的研究已就得到了充分的量化数据和可视化\n", "* 同时可以轻松得出中证红利可以视为沪深300增强的结论\n", "* 以此类推,利用该模块功能的一角,就可 diy 很多好玩的研究" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 基金信息类" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "fgzzhl = xa.fundinfo(\"100032\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "$(element).html(`\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluecommenttotvalue
2010-01-141.4100.2451.863
2011-01-191.1510.1301.718
2012-01-160.9690.0261.542
2015-01-201.3850.0562.073
2016-02-021.1180.3502.167
2017-01-171.0870.3002.469
2018-01-181.2150.1882.825
2020-02-280.9840.1102.689
`);\n", "\n", " require([\"DT\"], function(DT) {$(document).ready( () => {\n", " // Turn existing table into datatable\n", " $(element).find(\"table.dataframe\").DataTable({'scrollX': '100%'});\n", " })\n", " });\n", " " ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluecommenttotvalue
2432010-01-141.4100.2451.863
4882011-01-191.1510.1301.718
7292012-01-160.9690.0261.542
14582015-01-201.3850.0562.073
17122016-02-021.1180.3502.167
19452017-01-171.0870.3002.469
21912018-01-181.2150.1882.825
27012020-02-280.9840.1102.689
\n", "
" ], "text/plain": [ " date netvalue comment totvalue\n", "243 2010-01-14 1.410 0.245 1.863\n", "488 2011-01-19 1.151 0.130 1.718\n", "729 2012-01-16 0.969 0.026 1.542\n", "1458 2015-01-20 1.385 0.056 2.073\n", "1712 2016-02-02 1.118 0.350 2.167\n", "1945 2017-01-17 1.087 0.300 2.469\n", "2191 2018-01-18 1.215 0.188 2.825\n", "2701 2020-02-28 0.984 0.110 2.689" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fgzzhl.special # 发生分红或折算的细节" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fund name: 富国中证红利指数增强A\n", "fund code: 100032\n", "fund purchase fee: 0.15%\n", "fund redemption fee info: ['小于7天', '1.50%', '大于等于7天', '0.50%']\n" ] } ], "source": [ "fgzzhl.info()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Timestamp('2010-01-14 00:00:00'),\n", " Timestamp('2011-01-19 00:00:00'),\n", " Timestamp('2012-01-16 00:00:00'),\n", " Timestamp('2015-01-20 00:00:00'),\n", " Timestamp('2016-02-02 00:00:00'),\n", " Timestamp('2017-01-17 00:00:00'),\n", " Timestamp('2018-01-18 00:00:00'),\n", " Timestamp('2020-02-28 00:00:00')]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fgzzhl.fenhongdate\n", "# 基金分红日期" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fgzzhl.zhesuandate\n", "# 该基金未发生过份额折算" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "$(element).html(`\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluecommenttotvalue
2010-01-141.4100.2451.863
2011-01-191.1510.1301.718
2012-01-160.9690.0261.542
2015-01-201.3850.0562.073
2016-02-021.1180.3502.167
2017-01-171.0870.3002.469
2018-01-181.2150.1882.825
2020-02-280.9840.1102.689
`);\n", "\n", " require([\"DT\"], function(DT) {$(document).ready( () => {\n", " // Turn existing table into datatable\n", " $(element).find(\"table.dataframe\").DataTable({'scrollX': '100%'});\n", " })\n", " });\n", " " ], "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datenetvaluecommenttotvalue
2432010-01-141.4100.2451.863
4882011-01-191.1510.1301.718
7292012-01-160.9690.0261.542
14582015-01-201.3850.0562.073
17122016-02-021.1180.3502.167
19452017-01-171.0870.3002.469
21912018-01-181.2150.1882.825
27012020-02-280.9840.1102.689
\n", "
" ], "text/plain": [ " date netvalue comment totvalue\n", "243 2010-01-14 1.410 0.245 1.863\n", "488 2011-01-19 1.151 0.130 1.718\n", "729 2012-01-16 0.969 0.026 1.542\n", "1458 2015-01-20 1.385 0.056 2.073\n", "1712 2016-02-02 1.118 0.350 2.167\n", "1945 2017-01-17 1.087 0.300 2.469\n", "2191 2018-01-18 1.215 0.188 2.825\n", "2701 2020-02-28 0.984 0.110 2.689" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fgzzhl.price[fgzzhl.price[\"date\"].isin(fgzzhl.specialdate)]\n", "# 基金产生分红或折算的日期对应的price表格\n", "# 其中 comment 栏正数表示每份额分红的金额, 负数表示现在每份额折算的份额数,常见于分级连接基金" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* 同样的和指数类相似,基金类也可以用 .bcmkset() 来设置比较基准,既可以是指数也可以是基金,从而进行多样的量化和可视化分析\n", "* 但需要注意的是像这种出现过分红的基金用净值进行分析相当于无复权数据,会出现偏差,即使使用总值栏数据,也未处理分红的得到的现金\n", "* 强烈建议使用 policy 模块的 buyandhold 类来处理这种基金的效果分析, 具体细节请参考相关示例" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 虚拟货币基金类" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "除了指数类和基金类,为了方便,还准备了虚拟的货币基金类。\n", "需要注意的是真实的货币基金无法用基金类获取,基金类只支持净值法计价的基金。" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "vca = xa.cashinfo(interest=0.00012, start=\"2018-01-01\")\n", "# 初始化一个日利率 0.00012,建立于 2018 年的货币基金" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
commentdatenetvaluetotvalue
21802018-08-071.0265041.026504
\n", "
" ], "text/plain": [ " comment date netvalue totvalue\n", "218 0 2018-08-07 1.026504 1.026504" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vca.price.iloc[-2:-1]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('mf', '货币基金')" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vca.code, vca.name\n", "# 虚拟货币基金的代码默认为 mf, 名称为货币基金" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "注意:货币基金类也可以作为基准或是标的,进行同上的量化分析" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 真实货币基金类" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "huobi = xa.mfundinfo(\"004331\") # 拉取真实的货币基金数据" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fund name: 太平日日鑫货币B\n", "fund code: 004331\n", "fund purchase fee: 0%\n" ] } ], "source": [ "huobi.info()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "huobi.bcmkset(xa.cashinfo(interest=0.00011), start=\"2017-05-01\") # 和一个虚拟的货币基金比较" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.042599999999999999" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "huobi.total_annualized_returns() # 该货币基金的平均年化是 4.26%" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.94913838927244121" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "huobi.correlation_coefficient() # 和一个平稳的虚拟货币基金的关联是 0.95" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 增量IO\n", "为了提升基金数据的复用率,减少获取数据的时间,也可以开启本地增量 IO 的选项,将数据本地化\n", "\n", "* csv 格式" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "ioconf = {\n", " \"save\": True,\n", " \"fetch\": True,\n", " \"path\": \"../../../sknife/dataset/\",\n", " \"form\": \"csv\",\n", "}\n", "# 可以先生成IO的设置字典,save 字段表示每一个info对象会自动将信息本地化,fetch 字段表示初始化时先尝试本地获取,\n", "# path 字段是存储的路径和前缀, form 字段表示存储的格式是 csv\n", "# 指数,基金和货币基金类都可以使用这种增量更新策略来提速" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no saved copy of this index\n" ] } ], "source": [ "zzhli = xa.indexinfo(\"1399922\", **ioconf) # 如果是 fetch 时还没有存档,会提醒打印消息,之后按原初始化方法获取" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "zzhli = xa.indexinfo(\"1399922\", **ioconf) # 数据本地化后,对象初始化速度大幅提升" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* sql 格式" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 需要借助 sqlalchemy 库, 实现方式如下\n", "from sqlalchemy import create_engine\n", "\n", "engine = create_engine(\"mysql://user:pass@host/db_name?charset=utf8\")\n", "sqlconf = {\"save\": True, \"fetch\": True, \"path\": engine, \"form\": \"sql\"}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zzhli = xa.indexinfo(\"1399922\", **sqlconf) # 设定好 sql 选项后,其他部分均和 csv 类似" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "关于本地缓存与增量 IO,推荐新用户直接使用 ``xa.set_backend()`` 界面设定,而不再需要向 info obj 传入参数。\n", "set_backend 的支持参数请查阅文档。" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }