In [3]:
import xalpha as xa
import pandas as pd

xa.set_display("notebook")

指数与基金信息

指数信息类

In [2]:
zzhli = xa.indexinfo("0000922")
# 指数注意需要给定的代码为七位,第一位数字代表市场情况,0 代表沪市, 1 代表深市
# 本例即为沪市 000922 的指数获取,对应中证红利指数
# 也可直接 xa.indexinfo("SH000922")
In [7]:
zzhli.price[zzhli.price["date"] >= "2020-04-11"]
# 指数的价格表,数据类型为 pandas.DataFrame, 净值栏为初始值归一化的1的值,总值栏对应指数的真实值,注释栏均为空
Out[7]:
In [8]:
zzhli.name, zzhli.code  # 指数类的部分属性
Out[8]:
('中证红利', '0000922')
In [9]:
zzhli.bcmkset(xa.indexinfo("SH000300"), start="2014-01-01")
# 设定中证红利的比较基准为沪深300指数,以便于接下来更多量化分析
# 同时设定比较分析的区间段是从13年开始的
In [10]:
zzhli.v_netvalue()
# 指数与基准指数的可视化
# 二者都在研究区间的初始日归一
Out[10]:
In [11]:
zzhli.alpha(), zzhli.beta()  # 计算中证红利指数相对于沪深300的 alpha 和 beta 收益
Out[11]:
(0.01574527073375659, 0.9521439752795914)
In [12]:
zzhli.correlation_coefficient("2020-01-01")  # 计算两个指数截止2019年底的相关系数
Out[12]:
0.9546502342557672
In [13]:
zzhli.algorithm_volatility(), zzhli.benchmark_volatility()
# 计算中证红利和基准沪深300,截止目前的年化波动率
Out[13]:
(0.2380163305711998, 0.2387765132801344)
In [14]:
zzhli.total_annualized_returns(), zzhli.benchmark_annualized_returns()
#  计算中证红利和基准沪深300的年化收益率
Out[14]:
(0.0956, 0.082)
In [15]:
zzhli.information_ratio("2015-06-01"), zzhli.sharpe("2015-06-01")
# 计算指数截止 2015-06-01 的信息比率和夏普比率
Out[15]:
(2.1074014053052625, 3.8186585488765177)
  • 简单的研究已就得到了充分的量化数据和可视化
  • 同时可以轻松得出中证红利可以视为沪深300增强的结论
  • 以此类推,利用该模块功能的一角,就可 diy 很多好玩的研究

基金信息类

In [16]:
fgzzhl = xa.fundinfo("100032")
In [17]:
fgzzhl.special  # 发生分红或折算的细节
Out[17]:
In [18]:
fgzzhl.info()
fund name: 富国中证红利指数增强A
fund code: 100032
fund purchase fee: 0.15%
fund redemption fee info: ['小于7天', '1.50%', '大于等于7天', '0.50%']
In [19]:
fgzzhl.fenhongdate
# 基金分红日期
Out[19]:
[Timestamp('2010-01-14 00:00:00'),
 Timestamp('2011-01-19 00:00:00'),
 Timestamp('2012-01-16 00:00:00'),
 Timestamp('2015-01-20 00:00:00'),
 Timestamp('2016-02-02 00:00:00'),
 Timestamp('2017-01-17 00:00:00'),
 Timestamp('2018-01-18 00:00:00'),
 Timestamp('2020-02-28 00:00:00')]
In [38]:
fgzzhl.zhesuandate
# 该基金未发生过份额折算
Out[38]:
[]
In [20]:
fgzzhl.price[fgzzhl.price["date"].isin(fgzzhl.specialdate)]
# 基金产生分红或折算的日期对应的price表格
# 其中 comment 栏正数表示每份额分红的金额, 负数表示现在每份额折算的份额数,常见于分级连接基金
Out[20]:
  • 同样的和指数类相似,基金类也可以用 .bcmkset() 来设置比较基准,既可以是指数也可以是基金,从而进行多样的量化和可视化分析
  • 但需要注意的是像这种出现过分红的基金用净值进行分析相当于无复权数据,会出现偏差,即使使用总值栏数据,也未处理分红的得到的现金
  • 强烈建议使用 policy 模块的 buyandhold 类来处理这种基金的效果分析, 具体细节请参考相关示例

虚拟货币基金类

除了指数类和基金类,为了方便,还准备了虚拟的货币基金类。 需要注意的是真实的货币基金无法用基金类获取,基金类只支持净值法计价的基金。

In [40]:
vca = xa.cashinfo(interest=0.00012, start="2018-01-01")
# 初始化一个日利率 0.00012,建立于 2018 年的货币基金
In [41]:
vca.price.iloc[-2:-1]
Out[41]:
comment date netvalue totvalue
218 0 2018-08-07 1.026504 1.026504
In [42]:
vca.code, vca.name
# 虚拟货币基金的代码默认为 mf, 名称为货币基金
Out[42]:
('mf', '货币基金')

注意:货币基金类也可以作为基准或是标的,进行同上的量化分析

真实货币基金类

In [21]:
huobi = xa.mfundinfo("004331")  # 拉取真实的货币基金数据
In [22]:
huobi.info()
fund name: 太平日日鑫货币B
fund code: 004331
fund purchase fee: 0%
In [14]:
huobi.bcmkset(xa.cashinfo(interest=0.00011), start="2017-05-01")  # 和一个虚拟的货币基金比较
In [15]:
huobi.total_annualized_returns()  # 该货币基金的平均年化是 4.26%
Out[15]:
0.042599999999999999
In [16]:
huobi.correlation_coefficient()  # 和一个平稳的虚拟货币基金的关联是 0.95
Out[16]:
0.94913838927244121

增量IO

为了提升基金数据的复用率,减少获取数据的时间,也可以开启本地增量 IO 的选项,将数据本地化

  • csv 格式
In [6]:
ioconf = {
    "save": True,
    "fetch": True,
    "path": "../../../sknife/dataset/",
    "form": "csv",
}
# 可以先生成IO的设置字典,save 字段表示每一个info对象会自动将信息本地化,fetch 字段表示初始化时先尝试本地获取,
# path 字段是存储的路径和前缀, form 字段表示存储的格式是 csv
# 指数,基金和货币基金类都可以使用这种增量更新策略来提速
In [7]:
zzhli = xa.indexinfo("1399922", **ioconf)  # 如果是 fetch 时还没有存档,会提醒打印消息,之后按原初始化方法获取
no saved copy of this index
In [8]:
zzhli = xa.indexinfo("1399922", **ioconf)  # 数据本地化后,对象初始化速度大幅提升
  • sql 格式
In [ ]:
# 需要借助 sqlalchemy 库, 实现方式如下
from sqlalchemy import create_engine

engine = create_engine("mysql://user:[email protected]/db_name?charset=utf8")
sqlconf = {"save": True, "fetch": True, "path": engine, "form": "sql"}
In [ ]:
zzhli = xa.indexinfo("1399922", **sqlconf)  # 设定好 sql 选项后,其他部分均和 csv 类似

关于本地缓存与增量 IO,推荐新用户直接使用 xa.set_backend() 界面设定,而不再需要向 info obj 传入参数。 set_backend 的支持参数请查阅文档。