API

ffn

core 模块

class ffn.core.GroupStats(*prices)[source]

基础类:dict

GroupStats 允许人们并排比较多个系列。 它是一个围绕 {price.name: PerformanceStats} 字典的包装器, 并提供了许多便捷的方法。

传入的系列顺序将被保留。 可以通过索引位置或名称通过[]访问器访问单个PerformanceStats对象。

Args:
  • 价格(Series):要比较的多个价格序列。

Attributes:
  • stats (DataFrame): Dataframe containing stats for each

    提供了系列。行中显示统计信息,列中显示系列。

  • lookback_returns (DataFrame): Returns for diffrent

    回顾周期(1个月,3个月,6个月,年初至今…) 周期在行中,系列在列中。

  • 价格 (DataFrame): 合并并重新基准化的价格。

display()[source]

显示汇总统计表。

display_lookback_returns()[source]

显示每个系列的当前回溯回报。

plot(freq=None, figsize=(15, 5), title=None, logy=False, **kwargs)[source]

用于绘制序列的辅助函数。

Args:
  • freq (str): Data frequency used for display purposes.

    请参考pandas文档以获取有效的频率字符串。

  • figsize ((x,y)): 图形大小

  • 标题 (str): 如果默认值不合适,则使用此标题

  • logy (bool): y轴的对数刻度

  • kwargs: 传递给pandas的plot方法

plot_correlation(freq=None, title=None, figsize=(12, 6), **kwargs)[source]

用于绘制相关性的实用函数。

Args:
  • freq (str): Pandas 数据频率别名字符串

  • 标题 (str): 图表标题

  • figsize (元组 (x,y)): 图形大小

  • kwargs: 传递给Pandas的plot_corr_heatmap函数

plot_histograms(freq=None, title=None, figsize=(10, 10), **kwargs)[source]

围绕pandas的hist的包装器。

Args:
  • freq (str): Data frequency used for display purposes.

    请参考pandas文档以获取有效的频率字符串。

  • figsize ((x,y)): 图形大小

  • 标题 (str): 如果默认不合适,则使用此标题

  • kwargs: 传递给 pandas 的 hist 方法

plot_scatter_matrix(freq=None, title=None, figsize=(10, 10), **kwargs)[source]

围绕pandas的scatter_matrix的封装。

Args:
  • freq (str): Data frequency used for display purposes.

    请参考pandas文档以获取有效的频率字符串。

  • figsize ((x,y)): 图形大小

  • 标题 (str): 如果默认值不合适,则使用此标题

  • kwargs: 传递给pandas的scatter_matrix方法

set_date_range(start=None, end=None)[source]

更新统计、图表等的日期范围。如果为None,则使用原始日期范围。因此,要重置为原始范围,只需不带参数调用。

Args:
  • 开始 (date): 开始日期

  • 结束 (end): 结束日期

set_riskfree_rate(rf)[source]

设置年度无风险利率属性并正确计算年度化的月利率和日利率。然后重新计算绩效统计数据。仅影响作为此GroupStats对象子级的PerformanceStats实例。

Args:
  • rf (float, Series): 年无风险利率或无风险利率价格序列

to_csv(sep=',', path=None)[source]

返回一个带有适当格式的CSV字符串。 如果路径不为None,字符串将被保存到指定路径的文件中。

Args:
  • sep (char): 分隔符

  • path (str): If None, CSV string returned. Else file

    写入指定路径。

class ffn.core.PerformanceStats(prices, rf=0.0, annualization_factor=252)[source]

基础类:object

PerformanceStats 是一个用于价格序列性能评估的便利类。它包含各种辅助函数,帮助绘图,并包含大量描述性统计信息。

Args:
  • 价格 (Series): 一个价格序列。

  • rf (float, Series): Risk-free rate used in various calculation. Should be

    如果它是一个浮点数,则表示为年度(年化)回报。否则,rf 应该是一个价格序列。

Attributes:
  • name (str): 名称,来源于价格系列名称

  • return_table (DataFrame): A table of monthly returns with

    年初至今的数据也是如此。

  • lookback_returns (Series): Returns for different

    回溯周期(1个月、3个月、6个月、年初至今…)

  • stats (Series): 包含所有统计数据的系列

  • annualization_factor (float): 用于各种计算的年化因子;也称为nperiods, 252

display()[source]

显示包含所提供Series的描述性统计的概览。

display_lookback_returns()[source]

显示当前的回溯回报。

display_monthly_returns()[source]

显示一个表格,包含每年范围内的月度回报和年初至今的回报。

plot(freq=None, figsize=(15, 5), title=None, logy=False, **kwargs)[来源]

用于绘制序列的辅助函数。

Args:
  • freq (str): Data frequency used for display purposes.

    请参考pandas文档以获取有效的频率字符串。

  • figsize ((x,y)): 图形大小

  • 标题 (str): 如果默认不合适,则使用此标题

  • logy (bool): y轴的对数刻度

  • kwargs: 传递给pandas的plot方法

plot_histogram(freq=None, figsize=(15, 5), title=None, bins=20, **kwargs)[source]

绘制给定回报频率的回报直方图。

Args:
  • freq (str): Data frequency used for display purposes.

    这将决定返回的类型 (每日回报,每月回报,…) 请参考pandas文档以获取有效的周期字符串。

  • figsize ((x,y)): 图形大小

  • 标题 (str): 如果默认不合适,则使用此标题

  • bins (int): 直方图的箱数

  • kwargs: 传递给 pandas 的 hist 方法

set_date_range(start=None, end=None)[source]

更新统计、图表等的日期范围。如果为None,则使用原始日期。因此,要重置为原始范围,只需不带参数调用。

Args:
  • 开始 (date): 开始日期

  • 结束 (end): 结束日期

set_riskfree_rate(rf)[source]

设置年度无风险利率属性并正确计算年度化的月利率和日利率。然后重新计算性能统计数据。仅影响此PerformanceStats实例。

Args:
to_csv(sep=',', path=None)[source]

返回一个带有适当格式的CSV字符串。 如果路径不为None,字符串将被保存到指定路径的文件中。

Args:
  • sep (char): 分隔符

  • path (str): If None, CSV string returned. Else file written

    到指定路径。

ffn.core.annualize(returns, durations, one_year=365.0)[source]

使用各自的持续时间对收益进行年化。

Formula used is:

(1 + 收益) ** (1 / (持续时间 / 一年)) - 1

ffn.core.asfreq_actual(series, freq, method='ffill', how='end', normalize=False)[source]

类似于pandas的asfreq,但保留实际日期。 例如,如果一月的最后一个数据点在29日, 将使用该日期而不是31日。

ffn.core.calc_cagr(prices)[source]

计算给定价格序列的CAGR(复合年增长率)

Args:
  • 价格 (pandas.Series): 一系列价格。

Returns:
  • 浮动 – 复合年增长率。

ffn.core.calc_calmar_ratio(prices)[source]

计算给定一系列价格的Calmar比率

Args:
  • 价格 (Series, DataFrame): 价格序列

ffn.core.calc_clusters(returns, n=None, plot=False)[source]

基于k-means聚类计算集群。

Args:
  • 返回 (pd.DataFrame): 收益的DataFrame

  • n (int): Specify # of clusters. If None, this

    将自动确定

  • plot (bool): 显示图表?

Returns:
  • 具有结构的字典:{cluster# : [列名]}

ffn.core.calc_erc_weights(returns, initial_weights=None, risk_weights=None, covar_method='ledoit-wolf', risk_parity_method='ccd', maximum_iterations=100, tolerance=1e-08)[source]

计算给定收益DataFrame的等风险贡献/风险平价权重。

Args:
  • 返回 (DataFrame): 返回多个证券的收益。

  • initial_weights (list): 初始资产权重 [默认逆波动率]。

  • risk_weights (list): 风险目标权重 [默认等权重]。

  • covar_method (str): Covariance matrix estimation method.
    Currently supported:
  • risk_parity_method (str): Risk parity estimation method.
    Currently supported:
    • ccd(循环坐标下降)[默认]

    • slsqp(scipy的顺序最小二乘编程实现)

  • maximum_iterations (int): 迭代解决方案中的最大迭代次数。

  • tolerance (float): 迭代解中的容差水平。

Returns:

系列 {col_name: weight}

ffn.core.calc_ftca(returns, threshold=0.5)[source]

实现David Varadi的快速阈值聚类算法(FTCA)

http://cssanalytics.wordpress.com/2013/11/26/fast-threshold-clustering-algorithm-ftca/ # NOQA

对于聚类目的,比k-means更稳定。 如果你想要更多的聚类,使用更高的阈值。

Args:
  • returns - expects a pandas dataframe of returns where

    每一列是给定证券的名称。

  • threshold (float): Threshold parameter - use higher value

    用于更多集群。基本上控制系列必须有多相似(相关)。

Returns:

集群名称(一个数字)和集群中证券列表的字典

ffn.core.calc_information_ratio(returns, benchmark_returns)[source]

计算信息比率(或来自维基百科)。

ffn.core.calc_inv_vol_weights(returns)[source]

计算与每列的反波动率成比例的权重。

返回与列的波动性成反比的权重,从而产生一组投资组合权重,其中每个头寸具有相同的波动性水平。

请注意,所有回报均为NaN或0的资产将从投资组合中排除(它们的权重设置为NaN)。

Returns:

系列 {col_name: weight}

ffn.core.calc_max_drawdown(prices)[source]

计算价格序列的最大回撤。如果你想要实际回撤序列,请使用to_drawdown_series。

ffn.core.calc_mean_var_weights(returns, weight_bounds=(0.0, 1.0), rf=0.0, covar_method='ledoit-wolf', options=None)[source]

计算给定收益DataFrame的均值-方差权重。

Args:
  • 返回 (DataFrame): 返回多个证券的收益。

  • weight_bounds ((low, high)): 优化的权重限制。

  • rf (float): Risk-free rate 用于效用计算的无风险利率

  • covar_method (str): Covariance matrix estimation method.
    Currently supported:
  • options (dict): 最小化的选项,例如 {‘maxiter’: 10000 }

Returns:

系列 {col_name: weight}

ffn.core.calc_mtd(daily_prices, monthly_prices)[source]

计算价格序列的月度回报。 如果价格仅在同月可用,则使用daily_prices 否则使用monthly_prices

ffn.core.calc_perf_stats(prices)[source]

计算给定对象的性能统计信息。 该对象应该是一个价格序列。

将返回一个包含所有统计信息的PerformanceStats对象。

Args:
  • 价格 (Series): 价格序列

ffn.core.calc_prob_mom(returns, other_returns)[source]

概率动量 (参见 动量投资)

基本上是指“一种资产将优于另一种资产的概率或信心”。

Source:

http://cssanalytics.wordpress.com/2014/01/28/are-simple-momentum-strategies-too-dumb-introducing-probabilistic-momentum/ # NOQA

ffn.core.calc_risk_return_ratio(returns)[source]

计算回报/风险比率。基本上是不考虑无风险利率夏普比率

ffn.core.calc_sharpe(returns, rf=0.0, nperiods=None, annualize=True)[source]

计算夏普比率 (参见夏普比率与索提诺比率的区别).

如果 rf 不为零且为浮点数,则必须指定 nperiods。在这种情况下,rf 被假定为以年化(年度化)表示。

Args:
  • 返回 (Series, DataFrame): 输入返回系列

  • rf (float, Series): 无风险利率 以年化收益率或收益率序列表示

  • nperiods (int): Frequency of returns (252 for daily, 12 for monthly,

    等等。

ffn.core.calc_sortino_ratio(returns, rf=0.0, nperiods=None, annualize=True)[source]

计算给定一系列收益的Sortino比率 (参见Sharpe与Sortino的对比)。

Args:
  • 返回(Series 或 DataFrame):返回

  • rf (float, Series): 无风险利率 以年度(年化)表示或回报系列。

  • nperiods (int): Number of periods used for annualization. Must be

    如果 rf 不为零且 rf 不是价格序列,则提供

ffn.core.calc_stats(prices)[source]

计算给定对象的性能统计信息。

如果对象是Series,则返回一个PerformanceStats对象。如果对象是DataFrame,则返回一个GroupStats对象。

Args:
  • 价格 (Series, DataFrame): 价格集合

ffn.core.calc_total_return(prices)[源代码]

计算一个系列的总回报。

最后 / 最初 - 1

ffn.core.calc_ytd(daily_prices, yearly_prices)[source]

计算价格序列的年初至今回报。 如果价格仅从同一年开始可用,则使用daily_prices 否则使用yearly_prices

ffn.core.deannualize(returns, nperiods)[source]

将按不同基础表示的年化回报进行转换。

Args:
  • 返回 (float, Series, DataFrame): 返回值

  • nperiods (int): Target basis, typically 252 for daily, 12 for

    每月,等等。

ffn.core.drawdown_details(drawdown, index_type=<class 'pandas.core.indexes.datetimes.DatetimeIndex'>)[来源]

返回一个数据框,其中包含每个回撤序列中的开始、结束、天数(持续时间)和回撤。

注意

天数是实际的日历天数,不是交易日

Args:
  • drawdown (pandas.Series): A drawdown Series

    (可以通过drawdown(prices)获得。

Returns:
  • pandas.DataFrame – A data frame with the following

    列:开始、结束、天数、回撤。

ffn.core.drop_duplicate_cols(df)[source]

从数据框中移除重复的列 并保留历史最长的列

ffn.core.extend_pandas()[source]

扩展了pandas的PandasObject(Series, Series, DataFrame),并添加了本文件中定义的一些函数。

这有助于量化金融中常用的功能组合。

Ex:

prices.to_returns().dropna().calc_clusters() (其中 prices 是一个 DataFrame)

ffn.core.get_num_days_required(offset, period='d', perc_required=0.9, annualization_factor=252)[source]

估计假设数据正常所需的天数。

用于确定在给定时间段内是否有足够“良好”数据天数的辅助函数。

Args:
  • offset (DateOffset): 偏移(回看)周期。

  • period (str): 周期字符串。

  • perc_required (float): percentage of number of days

    预期必填。

ffn.core.infer_freq(data)[source]

根据输入索引推断最可能的频率。如果频率是

uncertain or index is not DateTime like, just return None
Args:
  • 数据 (DataFrame, Series): 任何时间序列的数据框或系列

ffn.core.infer_nperiods(data, annualization_factor=None)[source]
ffn.core.limit_weights(weights, limit=0.1)[source]

限制权重并按比例重新分配超出部分。

ex:
  • 权重为 {a: 0.7, b: 0.2, c: 0.1}

  • 调用时使用 limit=0.5

  • excess 0.2 in a is ditributed to b and c

    按比例。 - 结果是 {a: 0.5, b: 0.33, c: 0.167}

Args:
  • weights (Series): 描述权重的系列

  • limit (float): 允许的最大重量

ffn.core.merge(*series)[source]

将Series和/或DataFrames合并在一起。

返回一个DataFrame。

ffn.core.plot_corr_heatmap(data, **kwargs)[source]

绘制给定DataFrame的相关性热图。

ffn.core.plot_heatmap(data, title='Heatmap', show_legend=True, show_labels=True, label_fmt='.2f', vmin=None, vmax=None, figsize=None, label_color='w', cmap='RdBu', **kwargs)[source]

使用matplotlib的pcolor绘制热图。

Args:
  • data (DataFrame): DataFrame to plot. Usually small matrix (ex.

    相关矩阵)。

  • 标题 (string): 图表标题

  • show_legend (bool): 显示颜色图例

  • show_labels (bool): 显示值标签

  • label_fmt (str): 标签格式字符串

  • vmin (float): 比例的最小值

  • vmax (float): 比例的最大值

  • cmap (string): 颜色映射

  • kwargs: 传递给matplotlib的pcolor

ffn.core.random_weights(n, bounds=(0.0, 1.0), total=1.0)[source]

生成伪随机权重。

返回一个长度为n的随机权重列表,其中每个权重都在范围bounds内,并且这些权重的总和为total。

在基准测试时创建随机投资组合非常有用。

Args:
  • n (int): 随机权重的数量

  • bounds ((low, high)): 每个权重的边界

  • total (float): 权重的总和

ffn.core.rebase(prices, value=100)[source]

将所有系列重新基于给定的初始值。

这使得比较/绘制不同的系列更加容易。

Args:
  • 价格:期望一个价格序列

  • value (number): 所有系列的起始值。

ffn.core.resample_returns(returns, func, seed=0, num_trials=100)[source]

重新采样收益并在每个新样本上计算任何统计量。

https://en.wikipedia.org/wiki/Resampling_(statistics)

Parameters
  • DataFrame) (返回 (Series,) – 返回

  • func – 给定重新采样的回报,计算一个统计量

  • seed – 随机数生成器的种子

  • num_trials – 重新采样并运行实验的次数

Returns

重采样统计系列

ffn.core.rescale(x, min=0.0, max=1.0, axis=0)[source]

将值重新缩放以适应特定范围 [min, max]

ffn.core.rollapply(data, window, fn)[source]

在大小为window的滚动窗口上应用函数fn。

Args:
  • 数据(Series 或 DataFrame):Series 或 DataFrame

  • 窗口(整数):窗口大小

  • fn (function): Function to apply over the rolling window.

    对于一个系列,返回值应该是一个单一的数字。对于一个DataFrame,它应该返回一个新行。

Returns:
  • 与数据具有相同维度的对象

ffn.core.to_drawdown_series(prices)[source]

计算drawdown系列。

这将返回一个表示回撤的序列。 当价格处于历史最高点时,回撤 为0。然而,当价格低于历史高点时, 回撤序列 = 当前 / 历史高点 - 1

最大回撤可以通过简单地在结果上调用 .min() 来获得(因为回撤序列是负的)

该方法忽略价格序列中所有的NaN间隙。

Args:
  • 价格(Series 或 DataFrame):价格序列。

ffn.core.to_excess_returns(returns, rf, nperiods=None)[source]

给定一系列回报,它将返回超过rf的超额回报。

Args:
  • 返回 (Series, DataFrame): 返回

  • rf (float, Series): Risk-Free rate(s) 以年化形式表示的无风险利率或回报系列

  • nperiods (int): Optional. If provided, will convert rf to different

    仅在 rf 为浮点数时使用去年度化频率

Returns:
  • excess_returns (Series, DataFrame): 收益 - 无风险利率

ffn.core.to_log_returns(prices)[source]

计算价格序列的对数收益率。

公式是: ln(p1/p0)

Args:
  • 价格:期望一个价格序列

ffn.core.to_monthly(series, method='ffill', how='end')[source]

方便的方法,使用‘M’参数(method=’ffill’,how=’end’)包装asfreq_actual。

ffn.core.to_price_index(returns, start=100)[source]

返回给定一系列回报的价格指数。

Args:
  • 返回:期望一个返回系列

  • start (number): 起始级别

假设算术回报。

公式是: cumprod (1+r)

ffn.core.to_returns(prices)[source]

计算价格序列的简单算术回报。

公式是: (t1 / t0) - 1

Args:
  • 价格:期望一个价格序列

ffn.core.to_ulcer_index(prices)[source]

将价格转换为 Ulcer index

参见 https://en.wikipedia.org/wiki/Ulcer_index

Args:
  • 价格 (Series, DataFrame): 价格

ffn.core.to_ulcer_performance_index(prices, rf=0.0, nperiods=None)[源代码]

将价格转换为溃疡性能指数

参见 https://en.wikipedia.org/wiki/Ulcer_index

Args:
  • 价格 (Series, DataFrame): 价格

  • rf (float, Series): Risk-free rate of return. Assumed to be expressed in

    年度(年化)条款或回报系列

  • nperiods (int): 如果提供了rf(非零),则用于将rf去年度化

ffn.core.winsorize(x, axis=0, limits=0.01)[source]

Winsorize 基于限制的值

ffn.core.year_frac(start, end)[source]

类似于Excel的yearfrac函数。返回两个日期之间的年份分数(例如1.53年)。

使用一年中的平均秒数进行近似。

Args:
  • start (datetime): 开始日期

  • 结束 (datetime): 结束日期

data 模块

ffn.data.DEFAULT_PROVIDER(ticker, field, start=None, end=None, mrefresh=False)
ffn.data.csv(ticker, path='data.csv', field='', mrefresh=False, **kwargs)[source]

围绕pandas的read_csv的数据提供者包装器。提供记忆化功能。

ffn.data.get(tickers, provider=None, common_dates=True, forward_fill=False, clean_tickers=True, column_names=None, ticker_field_sep=':', mrefresh=False, existing=None, **kwargs)[source]

用于将数据检索为DataFrame的辅助函数。

Args:
  • tickers (list, string, csv string): 要下载的股票代码。

  • provider (function): Provider to use for downloading data.

    默认情况下,如果未提供,则将是 ffn.DEFAULT_PROVIDER。

  • common_dates (bool): 仅保留共同日期?删除缺失值。

  • forward_fill (bool): forward fill values if missing. Only works

    如果 common_dates 为 False,由于 common_dates 会移除所有的 nan,因此不需要向前填充。

  • clean_tickers (bool): Should the tickers be ‘cleaned’ using

    ffn.utils.clean_tickers? 基本上移除非标准字符(^VIX -> vix)并标准化为小写。

  • column_names (list): List of column names if clean_tickers

    不满意。

  • ticker_field_sep (char): separator used to determine the

    股票代码和字段。这是为了指定特定的、非默认的字段。例如,我们可能想要:AAPL:Low,AAPL:High,AAPL:Close。‘:’是分隔符。

  • mrefresh (bool): 忽略记忆化。

  • existing (DataFrame): Existing DataFrame to append returns

    to - 当我们从多个来源下载时使用

  • kwargs: 传递给提供者

ffn.data.web(ticker, field=None, start=None, end=None, mrefresh=False, source='yahoo')[source]

数据提供者包装器围绕pandas.io.data提供者。提供记忆化功能。

ffn.data.yf(ticker, field, start=None, end=None, mrefresh=False)[source]

utils 模块

ffn.utils.as_format(item, format_str='.2f')[source]

将格式字符串映射到pandas对象上。

ffn.utils.as_percent(self, digits=2)[源代码]
ffn.utils.clean_ticker(ticker)[source]

清理股票代码以便在MoneyTree中更轻松地使用

按空格分割并仅保留第一部分。同时移除任何非字母字符。返回结果为小写。

>>> clean_ticker('^VIX')
'vix'
>>> clean_ticker('SPX Index')
'spx'
ffn.utils.clean_tickers(tickers)[source]

将clean_ticker应用于tickers。

ffn.utils.fmtn(number)[源代码]

格式化助手 - 浮点数

ffn.utils.fmtp(number)[源代码]

格式化助手 - 百分比

ffn.utils.fmtpn(number)[源代码]

格式化助手 - 百分比不带%符号

ffn.utils.get_freq_name(period)[source]
ffn.utils.memoize(f, refresh_keyword='mrefresh')[源代码]

Memoize装饰器。refresh关键字是用于绕过缓存的关键字(在函数调用中)。

ffn.utils.parse_arg(arg)[源代码]

为了方便解析参数。参数可以是csv列表('a,b,c')、字符串、列表、元组。

返回一个列表。

ffn.utils.scale(val, src, dst)[source]

将值从源范围缩放到目标范围。 如果值超出边界,则将其裁剪并设置为目标范围的低边界或高边界。

Ex:

scale(0, (0.0, 99.0), (-1.0, 1.0)) == -1.0 scale(-5, (0.0, 99.0), (-1.0, 1.0)) == -1.0