Welcome to xalpha’s documentation!¶
快速开始¶
xalpha 可以用来对场外基金和指数进行方便的追踪和研究, 同时可以实现投资情况的汇总管理与数据分析,并且支持一些简单的基金购买策略回测。
本文仅简述最基本的模块使用的一小部分,关于更多的函数和用法尤其是可视化的部分,请参考具体示例 具体示例。 关于数据结构和内部的模块设计,请参考高级用法 高级用法。
基金和指数的信息¶
使用 xalpha.info.fundinfo
来获取场外基金的基本信息和历史每日净值情况。
其中净值以 pandas.DataFrame
的格式存储。
Note
基金信息只支持按净值法结算的场外基金,也即大部分货币基金不被支持。
代码示例:
>>> import xalpha as xa
>>> zzyl = xa.fundinfo('000968')
>>> zzyl
广发养老指数A
>>> zzyl.info()
fund name: 广发养老指数A
fund code: 000968
fund purchase fee: 0.12%
fund redemption fee info: ['小于7天', '1.50%', '大于等于7天,小于1年', '0.50%', '大于等于1年,小于2年', '0.30%', '大于等于2年', '0.00%']
>>> zzyl.price[zzyl.price['date']<='2015-02-27']
comment date netvalue totvalue
0 0 2015-02-13 1.0000 1.0000
1 0 2015-02-17 1.0000 1.0000
2 0 2015-02-27 1.0123 1.0123
使用 xalpha.info.indexinfo
来获取相应指数的每日净值情况。
Note
indexinfo() 对应的指数代码为7位数,其中后六位是正常的指数代码,第一位用来标记市场,0是沪市,1是深市。
代码示例:
>>> zzyli = xa.indexinfo('1399812')
>>> zzyli
养老产业
>>> zzyli.price[zzyli.price['date']=='2018-08-01']
comment date netvalue totvalue
1 0 2018-08-01 7.603842 7524.4807
Note
对应的 indexinfo().price 表中,netvalue 栏为以初始日归一化后的净值,而 totvalue 栏则是真实的指数值。
单一标的交易处理¶
使用 xalpha.trade.trade
来处理交易情况。
为了生成交易,需要提供标的类 xalpha.info
和交易账单 status table。
账单的具体的数据结构请参考高级用法 高级用法。
代码示例:
>>> yyws = xa.fundinfo('001180') # 交易标的信息
>>> statb = xa.record(path).status # path位置的交易账单csv
>>> yyws_t = xa.trade(yyws, statb)
>>> yyws_t.dailyreport()
{'currentshare': 630.39,
'currentvalue': 504.12,
'date': datetime.datetime(2018, 8, 5, 0, 0),
'originalvalue': 523.86,
'returnrate': -3.7682,
'unitcost': 0.831,
'unitvalue': 0.79969999999999997}
>>> yyws_t.xirrrate('2018-08-01')
-0.01764033506484772
基金投资组合的管理分析¶
使用 xalpha.multiple.mul
可以将多个基金交易类归总,或者根据 status 表格上记录的基金代码自动汇总。
如果选择 xalpha.multiple.mulfix
归总交易情况的话,则所有交易视作封闭系统,资金进出由虚拟的货币基金调节。
代码示例:
>>> invclose = xa.mulfix(yyws_t, totmoney = 6000)
>>> invclose.combsummary()
基金代码 基金名称 基金成本 基金收益率 基金现值
0 001180 广发医药卫生联接A 523.86 -3.7682 504.12
1 mf 货币基金 5476.15 7.3475 5878.51
2 xxxxxx 总计 6000.01 6.3770 6382.63
>>> invopen = xa.mul(status=xa.record(path).status)
>>> invopen.combsummary('2018-07-01').iloc[-1]
基金代码 xxxxxx
基金名称 总计
基金成本 2379.52
基金收益率 -4.2559
基金现值 2278.25
Name: 5, dtype: object
>>> invopen.xirrrate('2018-07-01')
-0.05594572489624858
基金交易策略与回测¶
通过额外导入 policy 模块,使用 xalpha.policy.policy
的子类,进行按一定策略的模拟交易的 status 表格生成,
从而可以进行相关的交易分析,起到策略回测比较的作用。对应类的 self.status 属性即为相应策略的 status 交易表格,
可以用于上述的交易分析使用。
代码示例:
>>> st = xa.policy.buyandhold(yyws,'2016-01-01') # buy and hold from 2016-01-01, 且始终分红再投入
>>> st2 = xa.policy.scheduled(yyws, totmoney = 1000, times=pd.date_range('2016-01-01','2018-06-01',freq='W-THU')) # 定投 status 的生成:从2016-01-01 到 2018-06-01 每周四进行定额定投 1000 元。
交易策略的监视和定时提醒¶
使用 xalpha.realtime.review
可以实现策略的监测和邮件的发送,具体使用可以查看 示例
功能综述¶
- 鉴于此页仅涵盖了非常小一部分功能的展示,除了参考其他部分学习外,这里整理出了该模块的基本功能。
- 全部场外基金(包括货币基金)的信息获取:指定一个代码,你就能了解的基金名称,历史单位净值,历史分红送转情况,基金的折扣申购费,基金的不同持仓时长的赎回费等多样的信息。
- 全部 A 股指数的信息获取:同样是一个代码,获取指数名称和每日净值。
- 所有基金指数数据支持增量更新,csv 文件和数据库 io 的无缝支持
- 可以对多只基金和指数同时进行量化分析,给出走势分布和相关性分析。
- 虚拟可调的货币基金类型:除了前述的真实货币基金类外,还可以建立虚拟的货币基金类,来模拟理财等的行为,或单纯作为量化的基准,可以实现更灵活的仓位管理。
- 只需最简的账单外加一个代码就可以精确模拟一只基金你的全部交易行为,并可以输出各种量化数据和可视化。
- 大量基于回测的量化数据和基于趋势交易的技术面指标工具箱。
- 只需一个最简的账单,就可实现多基金投资系统的投资精确模拟,同时提供总金额固定和总金额变动两个选项,可以显示全部基金投资的总结表和多样的持仓与交易量化,包括折线图,河流图,饼图,柱形图等。所有可视化均为可交互的 web 级可视化方案。
- 可以非常简便的制定各种基于日期和点数的定投策略,包括变额定投和复杂的网格策略均可以一行完成,并进行详细的回测分析与可视化展示。
- 可以基于净值或各种技术指标的交叉,点位设计复杂的交易策略,并回测效果进行定量分析。
- 可以根据自定义的策略,建立邮件按时提醒脚本,从此实现按计划买入和对市场的实时监控,尤其适合复杂网格策略的执行,不需要自己再去看盘和计算执行条件和金额。
具体示例¶
这里将列举一些通过 Jupyter Notebook,使用 xalpha 进行研究管理和可视化的具体例子。请按照下边的连接浏览。
高级用法¶
主要模块的关系和逻辑¶
xalpha.cons
模块主要提供一些基础的函数和常量, xalpha.remain
则专门提供了一些处理分时持仓表 remtable 的函数。
xalpha.record
用于统一的处理 status 记账单,同时自身实例化可以读取 csv 文件的原有账单。且可被其他具有 status 属性的类继承,作为广泛的 status 账单处理的工具箱。 而 xalpha.policy
则用于制定虚拟的 status 记账单,来进行不同策略投资的回测,其也继承了 xalpha.record.record
中一般的记账单处理函数。
xalpha.indicator
被具有净值表或可生成净值表的类继承,提供了一揽子净值量化分析和可视化的工具箱。其被 xalpha.info.basicinfo
和 xalpha.multiple.mulfix
继承和使用,后者需要通过设定 benchmark 的函数来初始化净值表。
xalpha.realtime
则是围绕基金的实时净值获取,策略集成和监视提醒为主的模块,可以用于每日按照多样的策略自动提醒投资情况。
其他四个系统的核心模块,所具有的核心数据表(都是 pandas.DataFrame 的形式),以及相互之间的关系,如下图所示。

主要的数据结构¶
- 记账单 status
- 净值表 price
- 现金流量表 cftable
- 仓位分时表 remtable
xalpha API¶
xalpha package¶
xalpha.cons module¶
basic constants and utility functions
-
xalpha.cons.
convert_date
(date)¶ convert date into datetime object
Parameters: date – string of form ‘2017-01-01’ or datetime object Returns: corresponding datetime object
-
xalpha.cons.
myround
(num, label=1)¶ correct implementation of round with round half up, round to 2 decimals
Parameters: - num – the floating number, to be rounded
- label – integer 1 or 2, 1 for round half up while 2 for always round down
Returns: the float number after rounding, with two decimals
-
xalpha.cons.
today
()¶
-
xalpha.cons.
xirr
(cashflows, guess=0.1)¶ calculate the Internal Rate of Return of a series of cashflows at irregular intervals.
Parameters: - cashflows – a list, in which each element is a tuple of the form (date, amount), where date is a datetime object and amount is an integer or floating number. Cash outflows (investments) are represented with negative amounts, and cash inflows (returns) are positive amounts.
- guess – floating number, a guess at the xirr rate solution to be used as a starting point for the numerical solution
Returns: the IRR as a single floating number
-
xalpha.cons.
xnpv
(rate, cashflows)¶ give the current cash value based on future cashflows
Parameters: - rate – float, the preset year rate
- cashflows – a list, in which each element is a tuple of the form (date, amount), where date is a datetime object and amount is an integer or floating number. Cash outflows (investments) are represented with negative amounts, and cash inflows (returns) are positive amounts.
Returns: a single float value which is the NPV of the given cash flows
-
xalpha.cons.
yesterday
()¶
-
xalpha.cons.
yesterdaydash
()¶
-
xalpha.cons.
yesterdayobj
()¶
xalpha.evaluate module¶
modules for evaluation and comparison on multiple object with price dataframe
-
class
xalpha.evaluate.
evaluate
(*fundobjs, start=None)¶ Bases:
object
多个 info 对象的比较类,比较的对象只要实现了 price 属性,该属性为具有 date 和 netvalue 列的 pandas.DataFrame 即可。 更进一步,也可讲做过 bcmkset 的
xalpha.multiple.mulfix
类作为输入,只不过此时需要提前额外指定以下该对象的 name 和 code 两个属性。 由于该类需要各基金净值表可以严格对齐,因此需要对节假日和国内不同的 QDII 基金进行补齐,由于第一个基金为基准,因此第一个输入不建议是 QDII 基金Parameters: - fundobjs – info object,或者如前所述一切具有 price 表的对象
- start – date string or object, 比较的起始时间,默认使用所有 price 表中最近的起始时间。 但需要注意,由于拉取的基金净值表,往往在开始几天缺失净值数据,即使使用默认时间也可能无法对齐所有净值数据。 因此建议手动设置起始时间到最近的起始时间一周后左右。
-
correlation_table
(end=datetime.datetime(2020, 3, 6, 0, 0))¶ give the correlation coefficient amongst referenced funds and indexes
Parameters: end – string or object of date, the end date of the line Returns: pandas DataFrame, with correlation coefficient as elements
-
v_correlation
(end=datetime.datetime(2020, 3, 6, 0, 0), vopts=None)¶ 各基金净值的相关程度热力图可视化
Parameters: end – string or object of date, the end date of the line Returns: pyecharts.charts.Heatmap.render_notebook object
-
v_netvalue
(end=datetime.datetime(2020, 3, 6, 0, 0), vopts=None)¶ 起点对齐归一的,各参考基金或指数的净值比较可视化
Parameters: - end – string or object of date, the end date of the line
- vkwds – pyechart line.add() options
- vopts – dict, options for pyecharts instead of builtin settings
Returns: pyecharts.charts.Line.render_notebook()
xalpha.indicator module¶
module for implementation of indicator class, which is designed as MinIn for systems with netvalues
-
class
xalpha.indicator.
indicator
¶ Bases:
object
MixIn class provide quant indicator tool box which is desinged as interface for mulfix class as well as info class, who are both treated as a single fund with price table of net value. Most of the quant indexes, their name conventions, definitions and calculations are from joinquant. Make sure first run obj.bcmkset() before you want to use functions in this class.
-
algorithm_volatility
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
alpha
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
annualized_returns
(start, date=datetime.datetime(2020, 3, 6, 0, 0))¶ Parameters: - price – price table of info().price
- start – datetime obj for starting date of calculation
- date – datetime obj for ending date of calculation
Returns: float, annualized returns of the price table
-
bbi
(col='netvalue')¶ 多空指标 give bull and bear line in column BBI in price table
Parameters: col – string, column name in dataframe you want to calculate
-
bcmkset
(infoobj, start=None, riskfree=0.0371724, name='基金组合')¶ Once you want to utilize the indicator tool box for analysis, first run bcmkset function to set the benchmark, otherwise most of the functions would raise error.
Parameters: - infoobj – info obj, whose netvalue are used as benchmark
- start – datetime obj, indicating the starting date of all analysis. Note if use default start, there may be problems for some fundinfo obj, as lots of funds lack netvalues of several days from our API, resulting unequal length between benchmarks and fund net values.
- riskfree – float, annual rate in the unit of 100%, strongly suggest make this value consistent with the interest parameter when instanciate cashinfo() class
-
benchmark_annualized_returns
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
benchmark_volatility
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
beta
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
bias
(window=10, col='netvalue')¶ 乖离率 give the bias as BIAS column in price table
Parameters: - window – int, MA_window
- col – string, column name in dataframe you want to calculate
-
boll
(window=10, deviation=2, col='netvalue')¶ 布林线上下轨计算 give the bolling upper and lower band in the price table, the middle line is just ma line
Parameters: - window – int, the date window for ma and md
- deviation – int or float, how many times deviation of sigma
- col – string, column name in dataframe you want to calculate
-
comparison
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ Returns: tuple of two pd.Dataframe, the first is for aim and the second if for the benchmark index all netvalues are normalized and set equal 1.00 on the self.start date
-
correlation_coefficient
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ - correlation coefficient between aim and benchmark values,
- 可以很好地衡量指数基金的追踪效果
Returns: float between -1 and 1
-
dma
(fast_window=10, slow_window=50, ama_window=10, col='netvalue')¶ 平行线差指标 give different of moving average as columns DMA and AMA in price table
Parameters: - fast_window – int
- slow_window – int
- ama_window – int
- col – string, column name in dataframe you want to calculate
-
ema
(window=5, col='netvalue')¶ 指数平均数指标 give the exponential moving average as a new column ‘EMA’ in the price table, return None
Parameters: - window – the span of date, where the decay factor alpha=2/(1+window)
- col – string, column name in dataframe you want to calculate
-
information_ratio
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
kdj
(rsv_window=9, k_window=3, d_window=3, col='netvalue')¶ KDJ 随机指标 由于该模块不涉及日内高低价的信息,因此区间最高价最低价都由极值收盘价代替,因此和其他软件计算的 kdj 指标可能存在出入。 give k,d,j indexes as three columns KDJ_K/D/J in price table
Parameters: - rsv_window – int
- k_window – int
- d_window – int
- col – string, column name in dataframe you want to calculate
-
ma
(window=5, col='netvalue')¶ 移动平均线指标 give the moving average as a new column ‘MA’ in the price table, return None
Parameters: - window – the date window of the MA calculation
- col – string, column name in dataframe you want to calculate
-
macd
(fast_window=12, slow_window=26, signal_window=9, col='netvalue')¶ 指数平滑异同移动平均线 give the MACD index as three new columns ‘MACD_DIFF/DEM/OSC’ in the price table, return None
Parameters: - fast_window – int,
- slow_window – int,
- signal_window – int, the ema window of the signal line
- col – string, column name in dataframe you want to calculate
-
max_drawdown
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ 回测时间段的最大回撤
Parameters: date – date obj or string Returns: three elements tuple, the first two are the date obj of start and end of the time window, the third one is the drawdown amplitude in unit 1.
-
md
(window=5, col='netvalue')¶ 移动标准差指标 give the moving standard deviation as a new column ‘MD’ in the price table, return None
Parameters: - window – the date window of the MD calculation
- col – string, column name in dataframe you want to calculate
-
mtm
(window=10, col='netvalue')¶ 动量指标,并未附加动量的平均线指标,如需计算动量平均线指标,使用ma或emca函数,col参数选择MTM列即可 give the MTM as a new column ‘MTM’ in the price table, return None
Parameters: - window – int, the difference between price now and window days ago
- col – string, column name in dataframe you want to calculate
-
psy
(count_window=12, ma_window=6, col='netvalue')¶ 心理线指标(衡量过去 count_window 天涨幅天数) give psy and psyma as column PSY and PSYMA in price table
Parameters: - count_window – int
- ma_window – int
- col – string, column name in dataframe you want to calculate
-
ratedaily
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
roc
(window=10, col='netvalue')¶ 变动率指标 give the ROC as a new column ‘ROC’ in the price table, return None, the ROC is in the unit of 1 instead of 1%
Parameters: - window – int, the change rate between price now and window days ago
- col – string, column name in dataframe you want to calculate
-
rsi
(window=14, col='netvalue')¶ 相对强弱指标 give the rsi as RSI column in price table
Parameters: - window – int, MA_window
- col – string, column name in dataframe you want to calculate
-
sharpe
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
total_annualized_returns
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
total_return
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
trix
(window=10, ma_window=10, col='netvalue')¶ 三重指数平滑平均线 give the trix index in column TRIX, TRMA
Parameters: - window – int
- col – string, column name in dataframe you want to calculate
-
v_netvalue
(end=datetime.datetime(2020, 3, 6, 0, 0), benchmark=True, vopts=None)¶ visulaization on netvalue curve
Parameters: - end – dateobject for indicating the end date in the figure, default to yesterday
- benchmark – bool, whether include benchmark’s netvalue curve, default true
- vopts – dict, options for pyecharts instead of builtin settings
-
v_techindex
(end=datetime.datetime(2020, 3, 6, 0, 0), col=None, vopts=None)¶ visualization on netvalue curve and specified indicators
Parameters: - end – date string or obj, the end date of the figure
- col – list, list of strings for price col name, eg.[‘MA5’,’BBI’] remember generate these indicators before the visualization, these cols don’t automatically generate for visualization
- vopts – dict, options for pyecharts instead of builtin settings
-
volatility
(date=datetime.datetime(2020, 3, 6, 0, 0))¶
-
wnr
(window=14, col='netvalue')¶ 威廉指标,这里取超卖结果接近0的约定(wnr*-1),事实上就是 rsv, 同样的区间极值价用极值收盘价替代 give williams %R in WNR column in price table
Parameters: - window – int
- col – string, column name in dataframe you want to calculate
-
xalpha.info module¶
modules of info class, including cashinfo, indexinfo and fundinfo class
-
class
xalpha.info.
basicinfo
(code, fetch=False, save=False, path='', form='csv', label=1)¶ Bases:
xalpha.indicator.indicator
Base class for info of fund, index or even cash, which cannot be directly instantiate, the basic implementation consider redemption fee as zero when shuhui() function is implemented
Parameters: - code – string of code for specific product
- fetch – boolean, when open the fetch option, the class will try fetching from local files first in the init
- save – boolean, when open the save option, automatically save the class to files
- path – string, the file path prefix of IO. Or in sql case, path is the engine from sqlalchemy.
- form – string, the format of IO, options including: ‘csv’,’sql’
- label – int, 1 or 2, label to the different round scheme of shares, reserved for fundinfo class
-
fetch
(path, form=None)¶ fetch info from files
Parameters: - path – string of the folder path prefix! end with / in csv case; engine from sqlalchemy.create_engine() in sql case.
- form – string, option:’csv’ or ‘sql
-
info
()¶ print basic info on the class
-
save
(path, form=None, option='r', delta=None)¶ save info to files, this function is designed to redirect to more specific functions
Parameters: - path – string of the folder path prefix! or engine obj from sqlalchemy
- form – string, option:’csv’
- option – string, r for replace and a for append output
- delta – if option is a, you have to specify the delta which is the incremental part of price table
-
shengou
(value, date)¶ give the realdate deltacash deltashare tuple based on purchase date and purchase amount if the date is not a trade date, then the purchase would happen on the next trade day, if the date is in the furture, then the trade date is taken as yesterday.
Parameters: - value – the money for purchase
- date – string or object of date
Returns: three elements tuple, the first is the actual dateobj of commit the second is a negative float for cashin, the third is a positive float for share increase
-
shuhui
(share, date, rem)¶ give the cashout considering redemption rates as zero. if the date is not a trade date, then the purchase would happen on the next trade day, if the date is in the furture, then the trade date is taken as yesterday.
Parameters: - share – float or int, number of shares to be sold
- date – string or object of date
Returns: three elements tuple, the first is dateobj the second is a positive float for cashout, the third is a negative float for share decrease
-
update
()¶ 对类的价格表进行增量更新,并进行增量存储,适合 fetch 打开的情形
Returns: the incremental part of price table or None if no incremental part exsits
-
class
xalpha.info.
cashinfo
(interest=0.0001, start='2012-01-01')¶ Bases:
xalpha.info.basicinfo
A virtual class for remaining cash manage: behave like monetary fund
Parameters: - interest – float, daily rate in the unit of 100%, note this is not a year return rate!
- start – str of date or dateobj, the virtual starting date of the cash fund
-
class
xalpha.info.
fundinfo
(code, label=1, fetch=False, save=False, path='', form='csv')¶ Bases:
xalpha.info.basicinfo
class for specific fund with basic info and every day values 所获得的基金净值数据一般截止到昨日。但注意QDII基金的净值数据会截止的更早,因此部分时间默认昨日的函数可能出现问题, 处理QDII基金时,需要额外注意。
Parameters: - code – str, 基金六位代码字符
- label – integer 1 or 2, 取2表示基金申购时份额直接舍掉小数点两位之后。当基金处于 cons.droplist 名单中时, label 总会被自动设置为2。非名单内基金可以显式令 label=2.
- fetch – boolean, when open the fetch option, the class will try fetching from local files first in the init
- save – boolean, when open the save option, automatically save the class to files
- path – string, the file path prefix of IO
- form – string, the format of IO, options including: ‘csv’
-
feedecision
(day)¶ give the redemption rate in percent unit based on the days difference between purchase and redemption
Parameters: day – integer, 赎回与申购时间之差的自然日数 Returns: float,赎回费率,以%为单位
-
info
()¶ print basic info on the class
-
shuhui
(share, date, rem)¶ give the cashout based on rem term considering redemption rates
Returns: three elements tuple, the first is dateobj the second is a positive float for cashout, the third is a negative float for share decrease
-
update
()¶ function to incrementally update the pricetable after fetch the old one
-
class
xalpha.info.
indexinfo
(code, fetch=False, save=False, path='', form='csv')¶ Bases:
xalpha.info.basicinfo
Get everyday close price of specific index. In self.price table, totvalue column is the real index while netvalue comlumn is normalized to 1 for the start date. In principle, this class can also be used to save stock prices but the price is without adjusted.
Parameters: - code – string with seven digitals! note the code here has an extra digit at the beginning, 0 for sh and 1 for sz.
- fetch – boolean, when open the fetch option, the class will try fetching from local files first in the init
- save – boolean, when open the save option, automatically save the class to files
- path – string, the file path prefix of IO
- form – string, the format of IO, options including: ‘csv’
-
update
()¶ 对类的价格表进行增量更新,并进行增量存储,适合 fetch 打开的情形
Returns: the incremental part of price table or None if no incremental part exsits
-
class
xalpha.info.
mfundinfo
(code, fetch=False, save=False, path='', form='csv')¶ Bases:
xalpha.info.basicinfo
真实的货币基金类,可以通过货币基金六位代码,来获取真实的货币基金业绩,并进行交易回测等
Parameters: - code – string of six digitals, code of real monetnary fund
- fetch – boolean, when open the fetch option, the class will try fetching from local files first in the init
- save – boolean, when open the save option, automatically save the class to files
- path – string, the file path prefix of IO
- form – string, the format of IO, options including: ‘csv’
-
update
()¶ function to incrementally update the pricetable after fetch the old one
xalpha.multiple module¶
module for mul and mulfix class: fund combination management
-
class
xalpha.multiple.
mul
(*fundtradeobj, status=None, fetch=False, save=False, path='', form='csv')¶ Bases:
object
multiple fund positions manage class
Parameters: - fundtradeobj – list of trade obj which you want to analyse together
- status – the status table of trade, all code in this table would be considered. one must provide one of the two paramters, if both are offered, status will be overlooked
- fetch – boolean, when open the fetch option, info class will try fetching from local files first in the init
- save – boolean, when open the save option, info classes automatically save the class to files
- path – string, the file path prefix of IO, or object or engine from sqlalchemy to connect sql database
- form – string, the format of IO, options including: ‘csv’,’sql’
-
combsummary
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ brief report table of every funds and the combination investment
Parameters: date – string or obj of date, show info of the date given Returns: empty dict if nothing is remaining that date dict of various data on the trade positions
-
evaluation
(start=None)¶ give the evaluation object to analysis funds properties themselves instead of trades
Returns: xalpha.evaluate.evaluate
object, with referenced funds the same as funds we invested
-
tot
(prop='基金现值', date=datetime.datetime(2020, 3, 6, 0, 0))¶ sum of all the values from one prop of fund daily report, of coures many of the props make no sense to sum
Parameters: prop – string defined in the daily report dict, typical one is ‘currentvalue’ or ‘originalpurchase’
-
v_positions
(date=datetime.datetime(2020, 3, 6, 0, 0), vopts=None)¶ pie chart visualization of positions ratio in combination
-
v_positions_history
(end='2020-03-06', **vkwds)¶ river chart visulization of positions ratio history use text size to avoid legend overlap in some sense, eg. legend_text_size=8
-
v_tradevolume
(freq='D')¶ visualization on trade summary of the funds combination
Parameters: freq – one character string, frequency label, now supporting D for date, W for week and M for month, namely the trade volume is shown based on the time unit :returns: pyecharts.Bar()
-
xirrrate
(date=datetime.datetime(2020, 3, 6, 0, 0), guess=0.1)¶ xirr rate evauation of the whole invest combination
-
class
xalpha.multiple.
mulfix
(*fundtradeobj, status=None, fetch=False, save=False, path='', form='csv', totmoney=100000, cashobj=None)¶ Bases:
xalpha.multiple.mul
,xalpha.indicator.indicator
introduce cash to make a closed investment system, where netvalue analysis can be applied namely the totcftable only has one row at the very beginning
Parameters: - fundtradeobj – trade obj to be include
- status – status table, if no trade obj is provided, it will include all fund based on code in status table
- fetch – boolean, when open the fetch option, info class will try fetching from local files first in the init
- save – boolean, when open the save option, info classes automatically save the class to files
- path – string, the file path prefix of IO, or object or engine from sqlalchemy to connect sql database
- form – string, the format of IO, options including: ‘csv’,’sql’
- totmoney – positive float, the total money as the input at the beginning
- cashobj – cashinfo object, which is designed to balance the cash in and out
-
unitvalue
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ Returns: float at unitvalue of the whole investment combination
xalpha.policy module¶
modules for policy making: generate status table for backtesting
-
class
xalpha.policy.
buyandhold
(infoobj, start, end='2020-03-06', totmoney=100000)¶ Bases:
xalpha.policy.policy
simple policy class where buy at the start day and hold forever, 始终选择分红再投入
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
-
class
xalpha.policy.
grid
(infoobj, buypercent, sellpercent, start, end='2020-03-06', totmoney=100000)¶ Bases:
xalpha.policy.policy
网格投资类,用于指导网格投资策略的生成和模拟。这一简单的网格,买入仓位基于均分总金额,每次的卖出仓位基于均分总份额。 因此实际上每次卖出的份额都不到对应原来档位买入的份额,从而可能实现更多的收益。
Parameters: - infoobj – info object, trading aim of the grid policy
- buypercent – list of positive int or float, the grid of points when purchasing, in the unit of percent 比如 [5,5,5,5] 表示以 start 这天的价格为基准,每跌5%,就加一次仓,总共加四次仓
- sellpercent – list of positive int or float, the grid of points for selling 比如 [8,8,8,8] 分别对应上面各买入仓位应该涨到的百分比从而决定卖出的点位,两个列表都是靠前的是高价位仓,两列表长度需一致
- start – date str of policy starting
- end – date str of policy ending
- totmoney – 总钱数,平均分给各个网格买入仓位
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
class
xalpha.policy.
indicator_cross
(infoobj, col, start, end='2020-03-06', totmoney=100000)¶ Bases:
xalpha.policy.policy
制定两个任意技术指标之间(或和净值之间)交叉时买入卖出的策略。若收盘时恰好交叉,不操作,等第二日趋势确认。
Parameters: - info – info object, trading aim of the policy
- col – a tuple with two strings, eg (‘netvalue’,’MA10’), when the left one is over the right one, we buy and otherwise we sell, that is the core of cross policy, you can choose any two columns as you like, as long as you generate them on the info object before input 也即左栏数据从下向上穿过右栏数据时,买入;反之亦然
- start – date str of policy starting
- end – date str of policy ending
- totmoney – float or int, total money, in the cross policy, we dont have position division, instead we buy all or sell all on the given cross
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
class
xalpha.policy.
indicator_points
(infoobj, start, col, buy, sell=None, buylow=True, end='2020-03-06', totmoney=100000)¶ Bases:
xalpha.policy.policy
基于技术指标的策略生成类之一,给出技术指标的多个阈值,基于这些点数值进行交易
Parameters: - infoobj – info object, trading aim of the policy
- col – str, stands for the tracking column of price table, eg. ‘netvalue’ or ‘PSY’
- buy – list of tuple, eg [(0.1,1),(0.2,2),(0.3,5)]. buy 1/(1+2+5) of totmoney, when the col value approach 0.1 and so on.
- sell – similar list of tuple as buy input. the difference is you can omit setting of sell list, this implies you don’t want to sell. 初始化不设置sell参数,在col设为netvalue时,用于进行金字塔底仓购买特别有效. 注意不论是 sell 还是 buy 列表,都要将更难实现(离中间值更远)的点位列在后边。比如如果现在是低买模式, 那么 buy 列表越考后的点数就越小。此外,不建议设置的买点卖点有重叠区域,可能会出现策略逻辑错误。
- buylow – Bool, Ture 代表,对应点位是跌破买,涨破卖,如果是 False 则反之,默认是 True
- start – date str of policy starting
- end – date str of policy ending
- totmoney – float or int, total money, in the points policy, we share them as different positions, based on the instruction of sell and buy list
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
class
xalpha.policy.
policy
(infoobj, start, end='2020-03-06', totmoney=100000)¶ Bases:
xalpha.record.record
base class for policy making, self.status to get the generating status table
Parameters: - infoobj – info object as evidence for policy making
- start – string or object of date, the starting date for policy running
- end – string or object of date, the ending date for policy running
- totmoney – float or int, characteristic money value, not necessary to be the total amount of money
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
class
xalpha.policy.
scheduled
(infoobj, totmoney, times)¶ Bases:
xalpha.policy.policy
fixed schduled purchase for given date list
Parameters: - infoobj – info obj
- totmoney – float, money value for purchase every time
- times – datelist of datetime object for purchase date, eg [‘2017-01-01’,‘2017-07-07’,…] we recommend you use pd.date_range() to generate the schduled list
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
class
xalpha.policy.
scheduled_tune
(infoobj, totmoney, times, piece)¶ Bases:
xalpha.policy.scheduled
定期不定额的方式进行投资,基于净值点数分段进行投资
-
status_gen
(date)¶ give policy decision based on given date
Parameters: date – date object Returns: float, positive for buying money, negative for selling shares
-
xalpha.realtime module¶
module for realtime watch and notfication
-
xalpha.realtime.
mail
(title, content, sender=None, receiver=None, password=None, server=None, port=None, sender_name='sender', receiver_name=None)¶ send email
Parameters: - title – str, title of the email
- content – str, content of the email, plain text only
- conf – all other paramters can be import as a dictionay, eg.conf = {‘sender’: ‘aaa@bb.com’, ‘sender_name’:’name’, ‘receiver’:[‘aaa@bb.com’,’ccc@dd.com’], ‘password’:‘123456’, ‘server’:’smtp.bb.com’,’port’:123, ‘receiver_name’:[‘me’,’guest’]}. The receiver_name and sender_name options can be omitted.
-
class
xalpha.realtime.
review
(policylist, namelist=None, date=datetime.datetime(2020, 3, 7, 0, 0))¶ Bases:
object
review policys and give the realtime purchase suggestions
Parameters: - policylist – list of policy object
- namelist – list of names of corresponding policy, default as 0 to n-1
- date – object of datetime, check date, today is prefered, date other than is not guaranteed
-
notification
(conf)¶ send email of self.content, at least support for qq email sender
Parameters: conf – the configuration dictionary for email send settings, no ** before the dict in needed. eg.conf = {‘sender’: ‘aaa@bb.com’, ‘sender_name’:’name’, ‘receiver’:[‘aaa@bb.com’,’ccc@dd.com’], ‘password’:‘123456’, ‘server’:’smtp.bb.com’,’port’:123, ‘receiver_name’:[‘me’,’guest’]}. The receiver_name and sender_name options can be omitted.
-
xalpha.realtime.
rfundinfo
(code, label=1, fetch=False, save=False, path='', form='csv')¶ give a fundinfo object with todays estimate netvalue at running time
Parameters: - code – string of six digitals for funds
- fetch – boolean, when open the fetch option, info class will try fetching from local files first in the init
- save – boolean, when open the save option, info classes automatically save the class to files
- path – string, the file path prefix of IO
- form – string, the format of IO, options including: ‘csv’
Returns: the fundinfo object
-
class
xalpha.realtime.
rtdata
(code)¶ Bases:
object
get real time data of specific funds
Parameters: code – string of six digitals for funds
xalpha.record module¶
module for status table IO
-
class
xalpha.record.
record
(path='input.csv', format='matrix', **readkwds)¶ Bases:
object
basic class for status table read in from csv file. staus table 是关于对应基金的申赎寄账单,不同的行代表不同日期,不同的列代表不同基金, 第一行各单元格分别为 date, 及基金代码。第一列各单元格分别为 date 及各个交易日期,形式 eg. 20170129 表格内容中无交易可以直接为空或0,申购为正数,对应申购金额(申购费扣费前状态),赎回为负数,对应赎回份额, 注意两者不同,恰好对应基金的金额申购份额赎回原则,记录精度均只完美支持一位小数。 几个更具体的特殊标记:
- 小数点后第二位如果是5,且当日恰好为对应基金分红日,标志着选择了分红再投入的方式,否则默认分红拿现金
2. 对于赎回的负数,如果是一个绝对值小于 0.005 的数,标记了赎回的份额占当时总份额的比例而非赎回的份额数目, 其中0.005对应全部赎回,线性类推。eg. 0.001对应赎回20%。
Parameters: - path – string for the csv file path
- readkwds – keywords options for pandas.read_csv() function. eg. skiprows=1, skipfooter=2, see more on pandas doc.
-
save_csv
(path=None, index=False, **tocsvkwds)¶ save the status table to csv file in path, no returns
Parameters: - path – string of file path
- index – boolean, whether save the index to the csv file, default False
- tocsvkwds –
keywords options for pandas.to_csv() function, see pandas doc.
-
sellout
(date=datetime.datetime(2020, 3, 6, 0, 0), ratio=1)¶ Sell all the funds in the same ratio on certain day, it is a virtual process, so it can happen before the last action exsiting in the cftable, by sell out earlier, it means all actions behind vanish. The status table in self.status would be directly changed.
Parameters: - date – string or datetime obj of the selling date
- ratio – float between 0 to 1, the ratio of selling for each funds
xalpha.remain module¶
provide class functions to adjust rem form data based on old rem form data such datastructure is useful when first-in-first-out mechanism considered in selling funds and it is also useful when converting the shares of funds.
as the nested list structure is very fragile and tend to induce unpredicatble behaviors, we strongly recommended anytime when rem data serves as function paramters, only utilize functions from this module
-
xalpha.remain.
buy
(remc, share, date)¶ Parameters: - remc – array of two-elements arrays, eg [[pd.Timestamp(), 50],[pd.Timestamp(), 30] the first element in tuple is pandas.Timestamp object for date while the second element is positive float for remaining shares, tuples in rem MUST be time ordered.
- share – positive float, only 2 decimal is meaningful.
- date – string in the date form or datetime object
Returns: new rem after the buying
-
xalpha.remain.
copy
(remc)¶ copy the rem form data so that the return is independent of the input
-
xalpha.remain.
sell
(remc, share, date)¶ Returns: tuple, (sold rem, new rem) sold rem is the positions being sold while new rem is the positions being held
-
xalpha.remain.
trans
(remc, coef, date)¶ 在基金份额折算时,将之前持有的仓位按现值折算,相当于前复权
Parameters: - coef – the factor shown in comment column of fundinfo().price, but with positive value
- date – string in date form or datetime obj
Returns: new rem after converting
xalpha.trade module¶
module for trade class
-
xalpha.trade.
bottleneck
(cftable)¶ find the max total input in the history given cftable with cash column
Parameters: cftable – pd.DataFrame of cftable
-
class
xalpha.trade.
trade
(infoobj, status)¶ Bases:
object
Trade class with fundinfo obj as input and its main attrs are cftable and remtable:
1. cftable: pd.Dataframe, 现金流量表,每行为不同变更日期,三列分别为 date,cash, share,标记对于某个投资标的 现金的进出和份额的变化情况,所有的份额数据为交易当时的不复权数据。基金份额折算通过流量表中一次性的份额增减体现。
2. remtable:pd.Dataframe, 持仓情况表,每行为不同变更日期,两列分别为 date 和 rem, rem 数据结构是一个嵌套的列表, 包含了不同时间买入仓位的剩余情况,详情参见 remain 模块。这一表格如非必需,避免任何直接调用。
Parameters: - infoobj – info object as the trading aim
- status – status table, obtained from record class
-
briefdailyreport
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ quick summary of highly used attrs for trade
Parameters: date – string or object of datetime Returns: dict with several attrs: date, unitvalue, currentshare, currentvalue
-
dailyreport
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ breif report dict of certain date status on the fund investment
Parameters: date – string or obj of date, show info of the date given Returns: dict of various data on the trade positions
-
unitcost
(date=datetime.datetime(2020, 3, 6, 0, 0))¶ give the unitcost of fund positions
Parameters: date – string or object of datetime Returns: float number of unitcost
-
v_totvalue
(end=datetime.datetime(2020, 3, 6, 0, 0), vopts=None)¶ visualization on the total values daily change of the aim
-
v_tradecost
(start=None, end=datetime.datetime(2020, 3, 6, 0, 0), vopts=None)¶ visualization giving the average cost line together with netvalue line
Parameters: vopts – global option for line in pyecharts Returns: pyecharts.line
-
v_tradevolume
(freq='D')¶ visualization on trade summary
Parameters: freq – string, “D”, “W” and “M” are supported Returns: pyecharts.charts.bar.render_notebook()
-
xirrrate
(date=datetime.datetime(2020, 3, 6, 0, 0), guess=0.1)¶ give the xirr rate for all the trade of the aim before date (virtually sold out on date)
Parameters: date – string or obj of datetime, the virtually sell-all date
-
xalpha.trade.
turnoverrate
(cftable, end=datetime.datetime(2020, 3, 6, 0, 0))¶ calculate the annualized turnoverrate
Parameters: - cftable – pd.DataFrame of cftable
- end – str or obj of datetime for the end date of the estimation
-
xalpha.trade.
vtradevolume
(cftable, freq='D')¶ aid function on visualization of trade summary
Parameters: - cftable – cftable (pandas.DataFrame) with at least date and cash columns
- freq – one character string, frequency label, now supporting D for date, W for week and M for month, namely the trade volume is shown based on the time unit
Returns: the Bar object
-
xalpha.trade.
xirrcal
(cftable, trades, date, guess)¶ calculate the xirr rate
Parameters: - cftable – cftable (pd.Dateframe) with date and cash column
- trades – list [trade1, …], every item is an trade object, whose shares would be sold out virtually
- date – string of date or datetime object, the date when virtually all holding positions being sold
- guess – floating number, a guess at the xirr rate solution to be used as a starting point for the numerical solution
Returns: the IRR as a single floating number