fintools

backtest_timselection

TimeSelectionBacktest

class finfactory.fintools.backtest_timselection.TimeSelectionBacktest(config: Optional[dict] = None)

Bases: object

择时策略回测

cal_sig_gains

cal_sig_gains

finfactory.fintools.cal_sig_gains.cal_sig_gains(data, sig_col, sig_type=1, shift_lag=0, col_price='close', col_price_buy='close', col_price_sel='close', col_price_high='high', col_price_low='low', settle_after_act=False, func_vol_add='base_1', func_vol_sub='base_1', func_vol_stop_loss='hold_1', func_vol_stop_gain='hold_1', func_vol_add_ext='base_1', func_vol_sub_ext='base_1', func_stop_loss=None, func_stop_gain=None, func_add_ext=None, func_sub_ext=None, func_fee_buy=0.0015, func_fee_sel=0.015, hold_buy_max=None, hold_sel_max=None, limit_min_vol=100, base_vol=None, base_money=200000, init_cash=0.0, sos_money=1000, force_final0='settle', del_begin0=True, gap_repeat=False, nshow=None, logger=None)

统计信号收益情况

Note

  • 目前若在一期K线内同时出现止损和止盈,以止损为准

  • 仅考虑市场价格为正,不考虑市场价格为负值的极端情况

Caution

若报错,检查数据中是否存在无效值等

Parameters:
  • data (pd.DataFrame) –

    行情数据,须包含 sig_col, col_price, col_price_buy, col_price_sel 指定的列。
    col_price 为结算价格列;col_price_buycol_price_sel 分别为做多(买入)和做空(卖出)操作的价格列。

    Note

    当(同一行中)结算价格的出现时间晚于操作价格时 settle_after_act 应设置为True,否则 settle_after_act 设置为False。

    sig_col 列为信号列,其值规则应满足:
    - 当 sig_type =1时, sig_col 列的值只能包含-1、1和0, 其中1为做空(卖出)信号,-1为做多(买入)信号,0为不操作
    - 当 sig_type =2时, sig_col 列的值为正|负整数或0, 其中正整数表示买入(做多)交易量,负整数表示卖出(做空)交易量,0表示不交易

  • func_vol_add (str, function) –

    自定义开仓/加仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_add(base_vol, holdVol, cash, Price, costPrice):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量
    # cash: 可用现金
    # Price: 交易价格
    # costPrice: 持仓成本价(应为正)
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当 func_vol_add 指定为’base_x’时,使用预定义函数 get_AddTradeVol_baseX , 其交易计划为:开底仓的x倍
    - 当 func_vol_add 指定为’hold_x’时,使用预定义函数 get_AddTradeVol_holdX , 其交易计划为:无持仓时开底仓,有持仓时开持仓的x倍
    - 当 func_vol_add 指定为’all’时,使用预定义函数 get_AddTradeVol_all , 其交易计划为:以账户当前可用资金为限额开全仓

  • func_vol_sub (str, function) –

    自定义平仓/减仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_sub_stop(base_vol, holdVol, cash, Price, costPrice):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量(正负号表示持仓方向)
    # cash: 可用现金(不包含平|减仓释放的资金)
    # Price: 交易价格
    # costPrice: 持仓成本价(应为正,可用于计算平|减仓释放资金量)
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当指定为’base_x’时,使用预定义函数 get_SubStopTradeVol_baseX , 其交易计划为:减底仓的x倍(若超过了持仓量相当于平仓后反向开仓)
    - 当指定为’hold_x’时,使用预定义函数 get_SubStopTradeVol_holdX , 其交易计划为:减持仓的x倍(x大于1时相当于平仓后反向开仓)
    - 当指定为’hold_base_x’时,使用预定义函数 get_SubStopTradeVol_holdbaseX , 其交易计划为:平仓后反向以base_vol的x倍反向开仓
    - 当指定为’hold_all’时,使用预定义函数 get_SubStopTradeVol_holdAll , 其交易计划为:平仓后以账户当前可用资金(包含平仓释放资金)为限额反向开全仓

  • func_vol_stop_loss (str, function) – 自定义止损操作时的交易量函数,格式同 func_vol_sub 参数

  • func_vol_stop_gain (str, function) – 自定义止盈操作时的交易量函数,格式同 func_vol_sub 参数

  • stop_no_same (bool) – 当止盈止损和操作信号同时出现,是否忽略同向操作信号 (做多|空止损|盈后是否禁止继续做多|空)

  • ignore_no_stop (bool) – 当有持仓且没有触及止盈止损条件时是否忽略信号,为True时忽略,为False时不忽略

  • hold_buy_max (int, float) – 买入(做多)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • hold_sel_max (int, float) – 卖出(做空)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • limit_min_vol (int, float) – 最少开仓量限制(比如股票至少买100股)

  • base_money (float) – 开底仓交易限额

  • base_vol (int, float) –

    开底仓交易限量

    Note

    同时设置 base_moneybase_vol 时以 base_money 为准

  • init_cash (float) – 账户初始资金额

  • fee (float) – 单向交易综合成本比例(双向收费)

  • max_loss (float) – 止损比例

  • max_gain (float) – 止盈比例

  • max_down (float) – 平仓最大回撤比例

  • add_loss_pct (float) – 当前价格比上次同向交易价格亏损达到 add_loss_pct 时加仓, 加仓方式由 func_vol_add 决定

  • add_gain_pct (float) – 当前价格比上次同向交易价格盈利达到 add_gain_pct 时加仓, 加仓方式由 func_vol_add 决定

  • stop_sig_order (str) –

    - 若为`sig_only`,当止盈止损和操作信号同时出现时,忽略止盈止损信号
    - 若为`stop_only`,当止盈止损和操作信号同时出现时,忽略操作信号
    - 若为`stop_first`,当止盈止损和操作信号同时出现时,先考虑止盈止损及反向再开新仓
    - 若为`sig_first`,当止盈止损和操作信号同时出现时,先考虑操作信号再进行剩余止盈止损及反向
    - 若为`both`,则止盈止损及反向量和信号交易量同时考虑

  • add_sig_order (str) –

    - 若为`offset`,当加仓信号与操作信号相反时,两者抵消
    - 若为`sig_only`,当加仓信号与操作信号相反时,以操作信号为准
    - 若为`add_only`,当加仓信号与操作信号相反时,以加仓信号为准

  • force_final0 (str, bool) –

    最后一个时间强平价格设置:
    - 若为False,则不强平,按结算价结算账户信息
    - 若为’trade’,则按col_price_sel或col_price_buy强平
    - 若为’settle’,则按结算价col_price强平

  • sos_money (float) – 账户本金亏损完,补资金时保证账户本金最少为 sos_money

  • del_begin0 (bool) – 是否删除数据中第一个信号之前没有信号的部分数据

  • gap_repeat (bool, None, int) –

    重复同向信号处理设置 (见 dramkit.gentools.replace_repeat_func_iter() 函数中的 gap 参数):
    - 为False时不处理
    - 为None时重复同向信号只保留第一个
    - 为整数gap时,重复同向信号每隔gap保留一个

Returns:

  • trade_gain_info (dict) – 返回各个收益评价指标

  • df (pd.DataFrame) – 包含中间过程数据

Todo

  • 开仓量计算增加按资金的百分比开仓,比如开20%仓位

  • 数据中添加一列最高价和最低价哪个先触及,用来判断先出发止损还是先触发止盈

  • 增加杠杆设置(计算盈亏率、所需资金等均考虑杠杆)

  • 交易信号的产生扩展为通过函数生成:sig = f(x),x为数据中的一行

  • 止盈止损及额外加减仓信号函数除了接收指定参数外,扩展为接收x参数,x为数据中的一行

  • (梳理确定中间计算过程产生的字段,在自定义函数中可使用这些列,还可以在自定义函数中增加shift参数以使用前面的数据)

  • 固定持仓时间平仓

  • 记录持仓的加仓减仓止盈止损次数

  • 按减仓、加仓、减仓、止盈、止损分类记录操作记录

  • 添加更多的止盈止损交易量确定方式设置,比如:

    1) 分段止盈止损
    (eg. 亏10%止损一半仓位,亏20%强平)(需要记录交易过程中的止盈止损历史记录)
    2) 止盈止损和加减仓交易量函数参数扩展(加入持仓周期,盈亏比率等参数)
    3) 止盈止损根据账户总盈亏比例确定(总盈亏比例可根据现有总值、累计投入总值、初始投入总值等方法计算)
  • 重写开仓盈亏信息计算函数(先拆单再统计?)

  • 正常信号量和止盈止损量、加减仓量的设置改为函数形式

  • 择时和画曲线函数放在一个类里面,择时计算完成后保存,画曲线方法单独调用(方便改画曲线参数时不用重新计算择时过程)

get_open_gain_info

finfactory.fintools.cal_sig_gains.get_open_gain_info(df_gain, col_price='close', col_price_buy='close', col_price_sel='close', func_fee_buy=0.0015, func_fee_sel=0.015, force_final0='settle', nshow=None, logger=None)
以开仓为统计口径,计算盈亏指标
df_gaincal_sig_gains() 函数的输出 df

cal_sig_gains_bk

cal_sig_gains

finfactory.fintools.cal_sig_gains_bk.cal_sig_gains(data, sig_col, sig_type=1, shift_lag=0, col_price='close', col_price_buy='close', col_price_sel='close', settle_after_act=False, func_vol_add='base_1', func_vol_sub='base_1', func_vol_stoploss='hold_1', func_vol_stopgain='hold_1', stop_no_same=True, ignore_no_stop=False, hold_buy_max=None, hold_sel_max=None, limit_min_vol=100, base_money=200000, base_vol=None, init_cash=0.0, fee=0.0015, sos_money=1000, max_loss=None, max_gain=None, max_down=None, add_loss_pct=None, add_gain_pct=None, stop_sig_order='both', add_sig_order='offset', force_final0='settle', del_begin0=True, gap_repeat=False, nshow=None, logger=None)

统计信号收益情况(没考虑杠杆,适用A股)

Note

仅考虑市场价格为正,不考虑市场价格为负值的极端情况

Caution

若报错,检查数据中是否存在无效值等

Parameters:
  • data (pd.DataFrame) –

    行情数据,须包含 sig_col, col_price, col_price_buy, col_price_sel 指定的列。
    col_price 为结算价格列;col_price_buycol_price_sel 分别为做多(买入)和做空(卖出)操作的价格列。

    Note

    当结算价格的出现时间晚于操作价格时 settle_after_act 应设置为True,否则 settle_after_act 设置为False。

    sig_col 列为信号列,其值规则应满足:
    - 当 sig_type =1时, sig_col 列的值只能包含-1、1和0, 其中1为做空(卖出)信号,-1为做多(买入)信号,0为不操作
    - 当 sig_type =2时, sig_col 列的值为正|负整数或0, 其中正整数表示买入(做多)交易量,负整数表示卖出(做空)交易量,0表示不交易

  • func_vol_add (str, function) –

    自定义开仓/加仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_add(base_vol, holdVol, cash, Price):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量
    # cash: 可用现金
    # Price: 交易价格
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当 func_vol_add 指定为’base_x’时,使用预定义函数 get_AddTradeVol_baseX , 其交易计划为:开底仓的x倍
    - 当 func_vol_add 指定为’hold_x’时,使用预定义函数 get_AddTradeVol_holdX , 其交易计划为:无持仓时开底仓,有持仓时开持仓的x倍
    - 当 func_vol_add 指定为’all’时,使用预定义函数 get_AddTradeVol_all , 其交易计划为:以账户当前可用资金为限额开全仓

  • func_vol_sub (str, function) –

    自定义平仓/减仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_sub_stop(base_vol, holdVol, cash, Price, holdCost):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量(正负号表示持仓方向)
    # cash: 可用现金(不包含平|减仓释放的资金)
    # Price: 交易价格
    # holdCost: 当前持仓总成本(用于计算平|减仓释放资金量)
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当指定为’base_x’时,使用预定义函数 get_SubStopTradeVol_baseX , 其交易计划为:减底仓的x倍(若超过了持仓量相当于平仓后反向开仓)
    - 当指定为’hold_x’时,使用预定义函数 get_SubStopTradeVol_holdX , 其交易计划为:减持仓的x倍(x大于1时相当于平仓后反向开仓)
    - 当指定为’hold_base_x’时,使用预定义函数 get_SubStopTradeVol_holdbaseX , 其交易计划为:平仓后反向以base_vol的x倍反向开仓
    - 当指定为’hold_all’时,使用预定义函数 get_SubStopTradeVol_holdAll , 其交易计划为:平仓后以账户当前可用资金(包含平仓释放资金)为限额反向开全仓

  • func_vol_stoploss (str, function) – 自定义止损操作时的交易量函数,格式同 func_vol_sub 参数

  • func_vol_stopgain (str, function) – 自定义止盈操作时的交易量函数,格式同 func_vol_sub 参数

  • stop_no_same (bool) – 当止盈止损和操作信号同时出现,是否忽略同向操作信号 (做多|空止损|盈后是否禁止继续做多|空)

  • ignore_no_stop (bool) – 当有持仓且没有触及止盈止损条件时是否忽略信号,为True时忽略,为False时不忽略

  • hold_buy_max (int, float) – 买入(做多)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • hold_sel_max (int, float) – 卖出(做空)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • limit_min_vol (int, float) – 最少开仓量限制(比如股票至少买100股)

  • base_money (float) – 开底仓交易限额

  • base_vol (int, float) –

    开底仓交易限量

    Note

    同时设置 base_moneybase_vol 时以 base_money 为准

  • init_cash (float) – 账户初始资金额

  • fee (float) – 单向交易综合成本比例(双向收费)

  • max_loss (float) – 止损比例

  • max_gain (float) – 止盈比例

  • max_down (float) – 平仓最大回撤比例

  • add_loss_pct (float) – 当前价格比上次同向交易价格亏损达到 add_loss_pct 时加仓, 加仓方式由 func_vol_add 决定

  • add_gain_pct (float) – 当前价格比上次同向交易价格盈利达到 add_gain_pct 时加仓, 加仓方式由 func_vol_add 决定

  • stop_sig_order (str) –

    - 若为`sig_only`,当止盈止损和操作信号同时出现时,忽略止盈止损信号
    - 若为`stop_only`,当止盈止损和操作信号同时出现时,忽略操作信号
    - 若为`stop_first`,当止盈止损和操作信号同时出现时,先考虑止盈止损及反向再开新仓
    - 若为`sig_first`,当止盈止损和操作信号同时出现时,先考虑操作信号再进行剩余止盈止损及反向
    - 若为`both`,则止盈止损及反向量和信号交易量同时考虑

  • add_sig_order (str) –

    - 若为`offset`,当加仓信号与操作信号相反时,两者抵消
    - 若为`sig_only`,当加仓信号与操作信号相反时,以操作信号为准
    - 若为`add_only`,当加仓信号与操作信号相反时,以加仓信号为准

  • force_final0 (str, bool) –

    最后一个时间强平价格设置:
    - 若为False,则不强平,按结算价结算账户信息
    - 若为’trade’,则按col_price_sel或col_price_buy强平
    - 若为’settle’,则按结算价col_price强平

  • sos_money (float) – 账户本金亏损完,补资金时保证账户本金最少为 sos_money

  • del_begin0 (bool) – 是否删除数据中第一个信号之前没有信号的部分数据

  • gap_repeat (bool, None, int) –

    重复同向信号处理设置 (见 dramkit.gentools.replace_repeat_func_iter() 函数中的 gap 参数):
    - 为False时不处理
    - 为None时重复同向信号只保留第一个
    - 为整数gap时,重复同向信号每隔gap保留一个

Returns:

  • trade_gain_info (dict) – 返回各个收益评价指标

  • df (pd.DataFrame) – 包含中间过程数据

Todo

  • 增加动态变更止盈止损点平仓方式

  • 增加根据固定盈亏点位止盈止损/减仓(比如股指期货赚30个点位止盈,亏20个点位止损)

  • 最大回撤平仓添加以点位记回撤的方式

  • 计算变量中增加止盈止损价格

  • 止盈止损考虑增加最高最低价判断条件

  • 增加根据固定盈亏点位加仓(比如IF赚20个点或亏20个点加仓)

  • 止盈止损信号增加动态确定函数(止盈止损或最大回撤百分比不固定,根据持仓时间和盈亏等情况确定)

  • 增加平仓条件设置(比如分段回撤平仓(不同盈利水平不同回撤容忍度),参数设计成函数)

  • 止损参数和加减仓设计成函数(输入为盈亏比例、最大回撤、盈亏金额、盈亏点位、最近一次交易信息等)

  • 增加浮盈/亏加仓价格确定方式(例如根据距离上次的亏损比例确定)

  • 重写开仓盈亏信息计算函数(先拆单再统计)

  • 正常信号加仓和浮盈/亏加仓方式分开处理(目前是合并一致处理)

  • 固定持仓时间平仓

  • fee买入和卖出分开设置

  • func_vol_add, func_vol_sub, func_vol_stoploss, func_vol_stopgain买入和卖出分开设置 (考虑股票不能卖空情况,目前可通过设置 hold_sel_max=0控制禁止买空)

  • 添加更多的止盈止损交易量确定方式设置,比如:

    1) 分段止盈止损
    (eg. 亏10%止损一半仓位,亏20%强平)(需要记录交易过程中的止盈止损历史记录)
    2) 止盈止损和加减仓交易量函数参数扩展(加入持仓周期,盈亏比率等参数)

get_open_gain_info

finfactory.fintools.cal_sig_gains_bk.get_open_gain_info(df_gain, col_price='close', col_price_buy='close', col_price_sel='close', fee=0.0015, force_final0='settle', nshow=None, logger=None)
以开仓为统计口径,计算盈亏指标
df_gaincal_sig_gains() 函数的输出 df

copy_line

copy_line

finfactory.fintools.copy_line.copy_line(df, k, ori_index)

do_something

finfactory.fintools.copy_line.do_something(df, k)

fintools

get_merge1min_candle

finfactory.fintools.fintools.get_merge1min_candle(df1m, func_merge, n=50, new_freq=15, **kwargs_merge)
用1分钟K线合成更低频K线
func_merge为用1分钟K先合成低频K线的函数,其接收new_freq和kwargs_merge参数

Examples

>>> from finfactory.load_his_data import load_index_joinquant
>>> df1m = load_index_joinquant('000300', '1min')
>>> df1m = df1m[df1m['time'] >= '2022-08-24 11:09:00']
>>> from finfactory.fintools.utils_chn import merge_minute_candle
>>> df = get_merge1min_candle(df1m, merge_minute_candle)

cal_ir

finfactory.fintools.fintools.cal_ir()

cal_ic

finfactory.fintools.fintools.cal_ic(data, col_factor, col_price='close', col_time=None, col_code=None, lag=1, ic_type='rank')
计算因子IC值
col_factor、col_price、col_time、col_code分别为因子列、价格列、时间列、代码列
lag设置期数,ic_type设置IC类型,可选`normal`和`rank`

kelly_formula

finfactory.fintools.fintools.kelly_formula(p, b)
凯利公式:根据胜率p和盈亏比b计算最优仓位
参考:

sim_mc

finfactory.fintools.fintools.sim_mc(his_values, sim_periods, n_cut=240, num_sim=1000, random_seed=None, keep_v0=True, return_mid=False, kwargs_plot_mid=None, kwargs_plot_final=None)

蒙特卡洛法模拟序列数据变化路径

Parameters:
  • his_values (pd.Series, np.array, list) – 历史序列

  • sim_periods (int) – 向后模拟期数

  • n_cut (int) – 将一期时间划分为多少个小时段

  • num_sim (int) – 模拟次数

  • random_seed (None, int) – 随机数种子设置

  • keep_v0 (bool) – 模拟结果中是否保留第一个初始价格

  • return_mid (bool) – 是否范围模拟过程中的中间路径数据

  • kwargs_plot_mid (dict) – 中间路径数据绘图参数, plot_series 函数接收

  • kwargs_plot_final (dict) – 最终模拟数据绘图参数, plot_series 函数接收

Returns:

  • df_sim (pd.DataFrame) – 模拟结果,shape为(sim_periods, num_sim),即每列为一条模拟路径

  • df_sim_ (pd.DataFrame) – 包含中间路径的模拟结果, return_mid 为True时返回

References

https://zhuanlan.zhihu.com/p/342624971

wuxianpu

finfactory.fintools.fintools.wuxianpu(series, lag=875, alphas=[0.05, 0.32], plot=False)
五线谱指标
参考:

mas_order

finfactory.fintools.fintools.mas_order(series, lags=[3, 5, 15, 20, 30, 60])
指定均线排列情况判断,lags为从小到大排列的lag列表
返回结果1为多头排列,-1位空头排列,0其他情况

macd

finfactory.fintools.fintools.macd(series, fast=12, slow=26, m=9)

MACD计算

Parameters:
  • series (pd.Series, np.array, list) – 待计算序列

  • fast (int) – 短期窗口长度

  • slow (int) – 长期窗口长度

  • m (int) – 平滑移动平均窗口长度

Returns:

df – 包含[‘MACD’, ‘DIF’, ‘DEA’]三列

Return type:

pd.DataFrame

Note

计算结果与同花顺PC统一版基本能对上,但是跟远航版没对上

References

boll

finfactory.fintools.fintools.boll(series, lag=15, width=2, n_dot=3)

布林带计算

Parameters:
  • series (pd.Series) – 序列数据

  • lag (int) – 历史期数

  • width (int, float) – 计算布林带上下轨时用的标准差倍数(宽度)

  • n_dot (int) – 计算结果保留小数位数

Returns:

df_boll – 布林带,包含原始值(即series),布林带下轨值(boll_low列), 中间值(boll_mid列),上轨值(boll_up列),标准差(std列)

Return type:

pd.DataFrame

bbi

finfactory.fintools.fintools.bbi(series, lags=[3, 6, 12, 24])

BBI计算

cci

finfactory.fintools.fintools.cci(df, col_typeprice=None, n=14, r=0.015)

CCI计算

Parameters:
  • df (pd.DataFrame) – 历史行情数据,须包含[‘high’, ‘low’, ‘close’]列或col_typeprice列

  • col_typeprice (None, str) – 用于计算CCI的价格列,若不指定,则根据[‘high’, ‘low’, ‘close’]计算

  • n (int) – 计算周期

  • r (float) – 计算系数

Returns:

cci – CCI序列

Return type:

pd.Series

References

expma

finfactory.fintools.fintools.expma(series, n=26)

EXPMA计算

References

weight_ma_linear_decay

finfactory.fintools.fintools.weight_ma_linear_decay(series, n=15)

加权MA,权重呈线性递减

kama

finfactory.fintools.fintools.kama(series, lag=9, fast=2, slow=30)

Kaufman’s Adaptive Moving Average (KAMA)

References

er

finfactory.fintools.fintools.er(series, lag=10, sign=False)

价格效率

References

  • KAMA指标

  • 华泰联合-震荡市还是趋势市:市场状态的量化划分方法

ma_trend_strength

finfactory.fintools.fintools.ma_trend_strength(series, lag_fast=5, lag_slow=20)

用均线度量的市场趋势强度

References

华泰联合-震荡市还是趋势市:市场状态的量化划分方法

kdj

finfactory.fintools.fintools.kdj(data, n_his=9, n_k=3, n_d=3, n_k_=1, n_d_=1)
KDJ计算,data(pd.DataFrame)中必须包含[‘close’, ‘high’, ‘low’]三列
返回结果中包含=[‘K’, ‘D’, ‘J’, ‘RSV’]四列
注:计算结果跟同花顺能对上
参考:
tradingview公式

talib_rsi

finfactory.fintools.fintools.talib_rsi(series, n=20)

talib计算RSI

atr

finfactory.fintools.fintools.atr(df, lag=14)
平均真实波幅ATR计算,df中必须包含[‘high’, ‘low’, ‘close’]三列
返回ATR, TR

talib_atr

finfactory.fintools.fintools.talib_atr(df, lag=14)
talib计算平均真实波幅ATR
df中必须包含[‘high’, ‘low’, ‘close’]三列
注:talib的结果跟同花顺对不上
参考:

adx

finfactory.fintools.fintools.adx(df, lag=14)
平均趋向指标ADX计算
df中必须包含[‘high’, ‘low’, ‘close’]三列
参考:

talib_adx

finfactory.fintools.fintools.talib_adx(df, lag=14)
talib计算平均趋向指标ADX
df中必须包含[‘high’, ‘low’, ‘close’]三列

talib_roc

finfactory.fintools.fintools.talib_roc(series, lag=12)

talib计算ROC

roc

finfactory.fintools.fintools.roc(series, lag=12)

ROC计算

vri

finfactory.fintools.fintools.vri(data, n=3)
VRI计算
参考:
https://finquanthub.com/量化策略:基于波动率范围指标的反向交易策略/

bbw

finfactory.fintools.fintools.bbw(series, lag=20, width=2, sign=False)

BBW计算

mean_candle

finfactory.fintools.fintools.mean_candle(data)
平均K线计算
data(pd.DataFrame)中必须包含[‘open’, ‘close’, ‘high’, ‘low’]列
参考:

demark_td

finfactory.fintools.fintools.demark_td(series, n=9, lag=4)
迪马克TD序列:连续n次出现收盘价高/低于前面第lag个收盘价就发信号
默认九转序列
返回label序列,label取1表示高点信号,-1表示低点信号

acpmp

finfactory.fintools.fintools.acpmp(values, periods=range(2, 60), mode='sum', std_type='pct', lag_roll=None, std_order=False)

多周期平均累计百分比(Average Cumulative Percentage of Multi-Period)

Parameters:
  • values (pd.Series, np.array, list) – 待计算序列数据

  • periods (list) – 指定多个周期列表

  • mode (str) –

    设置动量累计模式:
    - 为`sum`时累计涨跌幅为周期内一期涨跌幅的累计求和
    - 为`dirt`时累计涨跌幅为周期内最后一期相较于第一期的涨跌幅

  • std_type (str) –

    设置滚动标准化方式:
    - 若为`01`,则用maxmin方法转化到0-1之间
    - 若为`pct`,则转化为百分位

  • lag_roll (None, int) – 设置为整数时,标准化时采用滚动方式而不是累计方式

  • std_order (bool, None, str) –

    设置标准化顺序:
    - 若为`first`,则先对每个周期进行标准化后再求平均
    - 若为`last`,则先求平均之后再进行标准化
    - 若为None或False,则不标准化

Returns:

acpmp – ACPMP计算结果序列

Return type:

pd.Series

get_turn_point

finfactory.fintools.fintools.get_turn_point(series)
拐点标注
返回结果中1位从上往下拐,-1位从下往上拐

get_limit_turn_point

finfactory.fintools.fintools.get_limit_turn_point(series, limit_up, limit_low)
带界限值限制的拐点标注:
series中的值大于等于limit_up时才记录向上的拐点
series中的值小于等于limit_low时才记录向下的拐点

cross

finfactory.fintools.fintools.cross(series, series_base)
生成交叉信号(series上穿或下穿series_base)
返回信号中-1为上穿信号,1为下穿信号

cross_plot

finfactory.fintools.fintools.cross_plot(data, col, col_base, col_price='close', plot=True, plot_down=True, plot_same_level=False, **kwargs_plot)

finfactory.fintools.fintools.cross() 基础上增加画图

cross2

finfactory.fintools.fintools.cross2(series_buy, base_buy, series_sel, base_sel, buy_sig=1, sel_sig=- 1)
生成由两个交叉信号最终合成的买卖信号
series_buy和base_buy交叉生成买入信号:
- 当buy_sig=-1时以series_buy上穿base_buy为买入信号
- 当buy_sig=1时以series_buy下穿base_buy为买入信号
series_sel和base_sel交叉生成卖出信号:
- 当buy_sel=-1时以series_sel上穿base_sel为卖出信号
- 当buy_sel=1时以series_sel下穿base_sel为卖出信号
返回值中-1为买,1为卖,没信号

cross2_plot

finfactory.fintools.fintools.cross2_plot(data, col_buy, base_buy, col_sel, base_sel, buy_sig=1, sel_sig=- 1, col_price='close', plot=True, **kwargs_plot)

cross2() 函数的信号基础上增加绘图

cross_cum_maxmin_dif

finfactory.fintools.fintools.cross_cum_maxmin_dif(data, col, rlag, thr_rmax2now, thr_rmin2now, col_price='close', buy_sig=1, sel_sig=- 1, plot=True, kwargs_plot={})

依据指标值与滚动最大最小值的差值绝对大小来生成信号

fundnet

get_fundnet

finfactory.fintools.fundnet.get_fundnet(df_settle, when_in=None, when_out=None, outtype=1, intype=1, restart=False)

用基金净值法根据转入转出和资产总值记录计算净值

Parameters:
  • df_settle (pd.DataFrame) – 须包含列[‘转入’, ‘转出’, ‘资产总值’]三列

  • when_in (str, None) –

    列用于指定当期转入计算份额时使用的净值对应的时间:
    若为’before’,表示转入发生在当天净值结算之前(计算增减份额用前一期净值)
    若为’after’,表示转入发生在当天净值结算之后(计算增减份额用结算之后的净值)
    若为’when’,在df_settle中通过’when’列指定,’when’列的值只能为’before’或’after’
    若为None,当转入大于等于转出时设置为’before’,当转出大于转入时设置为’after’

  • when_out (str, None) –

    列用于指定当期转出计算份额时使用的净值对应的时间,格式同: when_in

  • outtype (int, str) –

    用于设置资金转出类型:
    若为1,表示份额赎回
    若为2,表示净值分红
    若为3,表示成本损耗
    若为4,表示忽略
    若为5,表示转托
    若为’outtype’,则在df_settle中通过’outtype列’设置,该列值只能为1, 2, 3, 4, 5
    赎回和分红在计算累计净值时要加入,损耗、转托和忽略不加入

  • intype (int, str) –

    用于设置资金转入用途类型:
    若为1,表示增加份额
    若为2,表示增加净值

  • restart (boll, str) –

    用于指定策略净值重启:
    若为False,表示不考虑重启
    若为’restart’,则df_settle中须有’restart’列,该列为1表示重启

Returns:

pd.DataFrame - 包含[‘新增份额’, ‘份额’, ‘净值’, ‘累计净值’]

options

bs_opt

finfactory.fintools.options.bs_opt(price_now, price_exe, days_left, r=0.03, sigma=0.225, i_d=0, days1year=365)

BS期权定价公式

Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率(目标标的收益波动率,年化)?

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

  • price_call (float) – 认购做多期权合约价格

  • price_put (float) – 认沽做空期权合约价格

References

mc_bs_opt

finfactory.fintools.options.mc_bs_opt(price_now, price_exe, days_left, r=0.03, sigma=0.225, days1year=365, mc_cut=60, n_mc=500000, random_seed=62, kwargs_plot=None)
注:没考虑分红!
MC-BS,蒙特卡罗模拟BS公式计算期权价格
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率(目标标的收益波动率,年化)

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • mc_cut (int) – 将剩余到期时间划分为mc_cut个小时段

  • n_mc (int) – 蒙特卡罗模拟次数

  • random_seed (int, None) – 随机数种子

Returns:

  • price_call (float) – 认购做多期权合约价格

  • price_put (float) – 认沽做空期权合约价格

References

mc_log_bs_opt

finfactory.fintools.options.mc_log_bs_opt(price_now, price_exe, days_left, r=0.03, sigma=0.225, days1year=365, mc_cut=60, n_mc=500000, random_seed=62, kwargs_plot=None)
注:没考虑分红!
MC-BS,蒙特卡罗模拟BS公式计算期权价格,对数格式
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率(目标标的收益波动率,年化)

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • mc_cut (int) – 将剩余到期时间划分为mc_cut个小时段

  • n_mc (int) – 蒙特卡罗模拟次数

  • random_seed (int, None) – 随机数种子

Returns:

  • price_call (float) – 认购做多期权合约价格

  • price_put (float) – 认沽做空期权合约价格

References

bopm_european

finfactory.fintools.options.bopm_european(price_now, price_exe, days_left, r=0.03, sigma=0.225, days1year=365, mc_cut=60)
注:没考虑分红!
二叉树欧式期权定价模型(BOP/CRR)
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率(目标标的收益波动率,年化)

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • mc_cut (int) – 将剩余到期时间划分为mc_cut个小时段

Returns:

  • price_call (float) – 认购做多期权合约价格

  • price_put (float) – 认沽做空期权合约价格

References

bsm_iv_dichotomy

finfactory.fintools.options.bsm_iv_dichotomy(price_now, price_exe, price_opt, days_left, opt_type, r=0.03, i_d=0.0, days1year=365, sigma_max=3.0, sigma_min=0.0, tol=1e-06, n_tol=100, max_iter=10000)

二分法求隐含波动率

Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • price_opt (float) – 期权现价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • sigma_max (float) – 隐含波动率上限

  • sigma_min (float) – 隐含波动率下限

  • tol (float) – 迭代误差控制

  • n_tol (int) – 当计算的理论期权价格连续n_tol次迭代改变量均不超过tol时结束

  • max_iter (int) – 迭代最大次数控制

Returns:

sigma_iv – 返回隐含波动率求解结果

Return type:

float

References

bsm_iv_dichotomy0

finfactory.fintools.options.bsm_iv_dichotomy0(price_now, price_exe, price_opt, days_left, opt_type, r=0.03, i_d=0.0, days1year=365, sigma_max=3.0, sigma_min=0.0, tol=1e-06, max_iter=10000)

二分法求隐含波动率

Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • price_opt (float) – 期权现价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • sigma_max (float) – 隐含波动率上限

  • sigma_min (float) – 隐含波动率下限

  • tol (float) – 迭代误差控制

  • max_iter (int) – 迭代最大次数控制

Returns:

sigma_iv – 返回隐含波动率求解结果

Return type:

float

References

bsm_iv_newton

finfactory.fintools.options.bsm_iv_newton(price_now, price_exe, price_opt, days_left, opt_type, r=0.03, i_d=0.0, sigma_iv_init=None, days1year=365, lr=0.1, max_iter=1000)

牛顿法计算隐含波动率

Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • price_opt (float) – 期权现价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • i_d (float) – 隐含分红率?

  • sigma_iv_init (float) – 设置隐含波动率初始值

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

  • lr (float) – 学习率

  • max_iter (int) – 迭代最大次数控制

Returns:

sigma_iv – 返回隐含波动率求解结果

Return type:

float

References

https://www.jianshu.com/p/e73f538859df

bs_vega

finfactory.fintools.options.bs_vega(price_now, price_exe, days_left, r=0.03, sigma=0.25, i_d=0, days1year=365)

BS公式,Vega计算

Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

vega – 返回vega求解结果

Return type:

float

References

bs_delta

finfactory.fintools.options.bs_delta(price_now, price_exe, days_left, opt_type, r=0.03, sigma=0.25, i_d=0.0, days1year=365)
注:分红处理需要再检查确认!
BS公式,Delta计算
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

delta – 返回delta求解结果

Return type:

float

References

bs_gamma

finfactory.fintools.options.bs_gamma(price_now, price_exe, days_left, r=0.03, sigma=0.25, i_d=0.0, days1year=365)
注:分红处理需要再检查确认!
BS公式,Gamma计算
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

gamma – 返回gamma求解结果

Return type:

float

References

bs_theta

finfactory.fintools.options.bs_theta(price_now, price_exe, days_left, opt_type, r=0.03, sigma=0.25, i_d=0.0, days1year=365)
注:分红处理需要再检查确认!
BS公式,Theta计算
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

theta – 返回theta求解结果

Return type:

float

References

bs_rho

finfactory.fintools.options.bs_rho(price_now, price_exe, days_left, opt_type, r=0.03, sigma=0.25, i_d=0.0, days1year=365)
注:分红处理需要再检查确认!
BS公式,Rho计算
Parameters:
  • price_now (float) – 标的现价

  • price_exe (float) – 标的执行价

  • days_left (int) – 剩余天数

  • opt_type (str) – 期权类型

  • r (float) – 无风险利率,年化

  • sigma (float) – 波动率

  • i_d (float) – 隐含分红率?

  • days1year (int) – 一年天数,默认为365,即自然天数(也可以只考虑交易天数)

Returns:

rho – 返回rho求解结果

Return type:

float

References

https://zhuanlan.zhihu.com/p/137938792

utils_chn

get_recent_finreport_date

finfactory.fintools.utils_chn.get_recent_finreport_date(date=None, dirt='pre', annual_only=False, semi_annual_only=False, semi_only=False)

获取距离date最近的财报日期

get_finreport_dates

finfactory.fintools.utils_chn.get_finreport_dates(start_date, end_date=None, start_dirt='post', end_dirt='pre', annual_only=False, semi_annual_only=False, semi_only=False)

获取start_date和end_date之间的财报日期

get_next_nth_trade_date

finfactory.fintools.utils_chn.get_next_nth_trade_date(date=None, n=1, market='SSE')
给定日期date,返回其后第n个交易日日期,n可为负数(返回结果在date之前)
若n为0,直接返回date

get_recent_trade_date

finfactory.fintools.utils_chn.get_recent_trade_date(date=None, dirt='post', market='SSE')
若date为交易日,则直接返回date,否则返回下一个(dirt=’post’)或上一个(dirt=’pre’)交易日
注:若chncal库统计的周内工作日与交易日有差异或没更新,可能导致结果不准确

get_trade_dates

finfactory.fintools.utils_chn.get_trade_dates(start_date, end_date=None, market='SSE', joiner=2)

利用chncal库获取指定起止日期内的交易日期(周内的工作日)

get_num_trade_dates

finfactory.fintools.utils_chn.get_num_trade_dates(start_date, end_date=None, market='SSE')

给定起止时间,获取可交易天数

is_period_edge_tradeday

finfactory.fintools.utils_chn.is_period_edge_tradeday(period, edge, date=None, market='SSE')
判断是否为指定周期的最后一个交易日或第一个交易日
period: ‘week’周, ‘month’月, ‘quarter’季度, ‘year’年度
edge: ‘start’首个交易日, ‘end’最后一个交易日

is_weekend_tradeday

finfactory.fintools.utils_chn.is_weekend_tradeday(date=None, market='SSE')

判断是否为一周的最后一个交易日

is_weekstart_tradeday

finfactory.fintools.utils_chn.is_weekstart_tradeday(date=None, market='SSE')

判断是否为一周的第一个交易日

is_monthend_tradeday

finfactory.fintools.utils_chn.is_monthend_tradeday(date=None, market='SSE')

判断是否为一个月的最后一个交易日

is_monthstart_tradeday

finfactory.fintools.utils_chn.is_monthstart_tradeday(date=None, market='SSE')

判断是否为一个月的第一个交易日

is_quarterend_tradeday

finfactory.fintools.utils_chn.is_quarterend_tradeday(date=None, market='SSE')

判断是否为季度的最后一个交易日

is_quarterstart_tradeday

finfactory.fintools.utils_chn.is_quarterstart_tradeday(date=None, market='SSE')

判断是否为季度的第一个交易日

is_yearend_tradeday

finfactory.fintools.utils_chn.is_yearend_tradeday(date=None, market='SSE')

判断是否为年度的最后一个交易日

is_yearstart_tradeday

finfactory.fintools.utils_chn.is_yearstart_tradeday(date=None, market='SSE')

判断是否为年度的第一个交易日

is_periods_edge_tradeday

finfactory.fintools.utils_chn.is_periods_edge_tradeday(periods, edge, date=None, market='SSE')
判断是否为指定周期的最后一个交易日或第一个交易日
periods: ‘week’周, ‘month’月, ‘quarter’季度, ‘year’年度 的列表
edge: ‘start’首个交易日, ‘end’最后一个交易日

get_all_trade_dates

finfactory.fintools.utils_chn.get_all_trade_dates(markets='SSE', **kwargs)

add_trade_dates_end

finfactory.fintools.utils_chn.add_trade_dates_end(df)

add_trade_dates_start

finfactory.fintools.utils_chn.add_trade_dates_start(df)

add_trade_dates_pre

finfactory.fintools.utils_chn.add_trade_dates_pre(df, freq, edge)
df = get_all_trade_dates()
freq in [‘week’, ‘month’, ‘quarter’, ‘year’]
edge in [‘start’, ‘end’]

add_trade_dates_next

finfactory.fintools.utils_chn.add_trade_dates_next(df, freq, edge)
df = get_all_trade_dates()
freq in [‘week’, ‘month’, ‘quarter’, ‘year’]
edge in [‘start’, ‘end’]

get_dates_cond

finfactory.fintools.utils_chn.get_dates_cond(cond, date_min, date_max=None, market='SSE')

df_freq_low2high

finfactory.fintools.utils_chn.df_freq_low2high(df, tcol, idcols, vcols=None, tmin=None, tmax=None, tall='trade', **kwargs)

数据低频填充为高频

Examples

>>> df = pd.DataFrame(
...         {'end_date': ['20220101', '20220605', '20220910', '20221010',
...                       '20220205', '20220708', '20221005', '20221010'],
...          'code': ['000001.SH']*4+['000002.SZ']*4,
...          'cate': ['a', 'b', 'a', 'b', 'c', 'd', 'c', 'd'],
...          'value1': [1, 2, np.nan, 3, 3, np.nan, 4, 5],
...          'value2': [None, 3, np.nan, 4, 6, 5, np.nan, 7]})
>>> vcols = None # 'value1'
>>> tcol = 'end_date'
>>> idcols1 = 'code'
>>> df1 = df_freq_low2high(df, tcol, idcols1, vcols=vcols)
>>> idcols2 = ['code', 'cate']
>>> df2 = df_freq_low2high(df, tcol, idcols2, vcols=vcols)

get_full_components

finfactory.fintools.utils_chn.get_full_components(df: DataFrame, parent_col: str, child_col: str, tincol: str, toutcol: str, tfulls: str, tstart: Optional[DateTimeType] = None, tend: Optional[DateTimeType] = None, toutnan: Optional[DateTimeType] = None, tcol_res: str = 'time', keep_inout: bool = False)
根据纳入、退出日期获取在给定时间内的所有成分

Example

>>> df = pd.DataFrame(
...      {'index': ['a', 'a', 'b', 'b', 'a', 'c', 'c'],
...       'stock': ['a1', 'a2', 'b1', 'b2', 'a3', 'c1', 'c2'],
...       'indate': ['20210101', '20210515', '20210405', '20210206',
...                  '20220307', '20220910', '20230409'],
...       'outdate': ['20220305', np.nan, np.nan, '20230409',
...                   np.nan, np.nan, '20230518']})
>>> parent_col, child_col, tincol, toutcol = 'index', 'stock', 'indate', 'outdate'
>>> tfulls = 'trade_month_end'
>>> df['indate'] = pd.to_datetime(df['indate'])
>>> df['outdate'] = pd.to_datetime(df['outdate'])
>>> df1 = get_full_components(
...       df, parent_col, child_col, tincol, toutcol, tfulls)

merge_minute_candle

finfactory.fintools.utils_chn.merge_minute_candle(data, new_freq=30, cols_sum=None, tstart=False, time_trans=False)
用一分钟K线合成更低频分钟K线
new_freq指定合成的频率,必须能被240整除
data中必须包含[‘time’, ‘open’, ‘close’, ‘high’, ‘low’]
cols_sum为求和字段,如可指定成交量’volume’或成交额’value’等
tstart设置time列是否为K先开始时间,默认视为结束时间
若data中的time列格式不为’%Y-%m-%d %H:%M:%S’格式,应将time_trans设置为True
注:只适用于A股交易时间:上午09:30——11:30下午13:00——15:00

Examples

>>> from finfactory.load_his_data import load_index_joinquant
>>> df1m = load_index_joinquant('000300', '1min')
>>> df1m = df1m[df1m['time'] >= '2022-08-24 11:09:00']
>>> c1 = merge_minute_candle(df1m, cols_sum=['volume'],
                             tstart=False)
>>> c2 = merge_minute_candle(df1m, cols_sum=['volume'],
                             tstart=True)
>>> import datetime
>>> tdelta = datetime.timedelta(seconds=-60)
>>> df1m['time'] = dttools.pd_str2datetime(df1m['time']) + tdelta
>>> c3 = merge_minute_candle(df1m, cols_sum=['volume'],
                             tstart=True, time_trans=True)

get_finreport_date_by_delta

finfactory.fintools.utils_chn.get_finreport_date_by_delta(end_date, n, out_format='str')
给定一个报告期,获取往后推n期的报告期,若n为负,则往前推
注:函数实际上计算的是end_date所在月往后推3*n季度之后所处月的最后一天, 所以如果入参end_date不是财报日期所在月,则返回结果也不是财报日期

get_last_effect_finreport_dates

finfactory.fintools.utils_chn.get_last_effect_finreport_dates(date, force_q1q3=False, wait_finished=False, semi_annual_only=False, annual_only=False, adjust_report=False)

Todo

  • 完成adjust_report设置部分

  • 检查确认和完善***备注处

获取距离date最近的财报日期,即date可以取到的最新财报数据对应的财报日期
force_q1q3: 一季报和三季报是否为强制披露,默认不强制披露
wait_finished: 是否必须等财报发布结束才可取数据
semi_annual_only: 仅考虑年报和中报
annual_only: 仅考虑年报
adjust_report: 是否考虑报告调整
注:
2020年特殊处理(2019年报和2020一季报不晚于20200630披露)

get_code_ext

finfactory.fintools.utils_chn.get_code_ext(code, return_sure=False)

Todo

检查更新代码规则

返回带交易所后缀的股票代码格式,如输入`300033`,返回`300033.SZ`
code目前可支持[A股、B股、50ETF期权、300ETF期权],根据需要更新
如不能确定后缀,则直接返回code原始值

get_trade_fee_Astock

finfactory.fintools.utils_chn.get_trade_fee_Astock(code, buy_or_sel, vol, price, fee_least=5, fee_pct=0.00025)

普通A股股票普通交易费用计算

Todo

  • 检查更新交易费率变化(若同一个交易所不同板块费率不同,新增按板块计算)

  • 新增北交所

trade_fee_Astock

finfactory.fintools.utils_chn.trade_fee_Astock(mkt, buy_or_sel, vol, price, fee_least=5, fee_pct=0.00025)

Todo

  • 检查更新交易费率变化(若同一个交易所不同板块费率不同,新增按板块计算)

  • 新增北交所

普通A股股票普通交易费用计算

Parameters:
  • mkt (str) – ‘SH’(‘sh’, ‘SSE’)或’SZ’(‘sz’, ‘SZSE’),分别代表上海和深圳市场

  • buy_or_sel (str) – ‘B’(‘b’, ‘buy’)或’S’(‘s’, ‘sell’, ‘sel’),分别标注买入或卖出

  • vol (int) – 量(股)

  • price (float) – 价格(元)

  • fee_least (float) – 券商手续费最低值

  • fee_pct (float) – 券商手续费比例

Returns:

fee_all – 交易成本综合(包含交易所税费和券商手续费)

Return type:

float

收费标准源于沪深交易所官网,若有更新须更改:

check_fill_trade_dates

finfactory.fintools.utils_chn.check_fill_trade_dates(df, date_col='date', fill_func={})

检查并填充交易日

utils_gains

signal_merge

finfactory.fintools.utils_gains.signal_merge(data, sig1_col, sig2_col, merge_type=1)

两个信号合并成一个信号

Parameters:
  • data (pandas.DataFrame) – 待处理数据,必须包含 sig1_colsig2_col 指定的列

  • sig1_col (str) – 指定信号列,值为-1表示买(做多),1表示卖(做空)

  • sig2_col (str) – 指定信号列,值为-1表示买(做多),1表示卖(做空)

  • merge_type (int) –

    设置信号合并方式:

    • 1: 两个信号出现任何一个都算有效信号

    • 2: 根据两个信号的持仓量叠加计算交易信号(返回信号不适用反向开仓)

    • 3: 只有两个信号方向相同时才算交易信号(返回信号不适用反向开仓)

Returns:

pd.Series - 合并之后的信号

cal_cost_add

finfactory.fintools.utils_gains.cal_cost_add(hold_vol, hold_cost, add_vol, add_price)
计算加仓之后的平均持仓成本
hold_vol为加仓前持仓量,hold_cost为加仓前平均持仓成本,add_vol为加仓量

get_mean_cost

finfactory.fintools.utils_gains.get_mean_cost(trade_records, dirt_col, price_col, vol_col)

根据交易记录计算每期持仓成本

Parameters:
  • trade_records (pd.DataFrame) – 交易记录数据,必须包含 dirt_colprice_colvol_col 指定的列

  • dirt_col (str) – 买卖方向列,1为买入(做多),-1为卖出(做空)

  • price_col (str) – 成交价格列

  • vol_col (str) – 为成交量列

Returns:

pd.DataFrame - 在trade_records上增加了’holdVol’, ‘holdCost’, ‘meanCost’三列

cal_gain_con_futures

finfactory.fintools.utils_gains.cal_gain_con_futures(price_open, price_now, n, player, fee=0.001, lever=100, n_future2target=0.001)

永续合约收益计算,如火币BTC合约

Parameters:
  • price_open (float) – 开仓价格

  • price_now (float) – 现价

  • n (int) – 数量(张)

  • player (str) – 做空或做多

  • fee (float) – 手续费比例

  • lever (int) – 杠杆

  • n_future2target (float) – 一份合约对应的标的数量

Returns:

  • gain_lever (float) – 盈亏金额

  • gain_pct (float) – 盈亏比例

cal_gain_con_futures2

finfactory.fintools.utils_gains.cal_gain_con_futures2(price_open, price_now, n, player, fee=0.001, lever=100)

永续合约收益计算,如币安ETH合约

Parameters:
  • price_open (float) – 开仓价格

  • price_now (float) – 现价

  • n (int) – 数量(标的量)

  • player (str) – 做空或做多

  • fee (float) – 手续费比例

  • lever (int) – 杠杆

Returns:

  • gain_lever (float) – 盈亏金额

  • gain_pct (float) – 盈亏比例

cal_expect_return

finfactory.fintools.utils_gains.cal_expect_return(hit_prob, gain_loss_ratio)

根据胜率和盈亏比计算期望收益

cal_gain_pct_log

finfactory.fintools.utils_gains.cal_gain_pct_log(price_cost, price, pct_cost0=1)
计算对数收益率
price_cost为成本
price为现价
pct_cost0为成本price_cost为0时的返回值

cal_gain_pct

finfactory.fintools.utils_gains.cal_gain_pct(price_cost, price, pct_cost0=1)
计算百分比收益率
price_cost为成本
price为现价
pct_cost0为成本price_cost为0时的返回值

Note

默认以权利方成本price_cost为正(eg. 买入价为100,则price_cost=100)、 义务方成本price_cost为负进行计算(eg. 卖出价为100,则price_cost=-100)

cal_gain_pcts

finfactory.fintools.utils_gains.cal_gain_pcts(price_series, gain_type='pct', pct_cost0=1, logger=None)
计算资产价值序列price_series(pd.Series)每个时间的收益率
gain_type:
为’pct’,使用普通百分比收益
为’log’,使用对数收益率(当price_series存在小于等于0时不能使用)
为’dif’,收益率为前后差值(适用于累加净值情况)
pct_cost0为当成本为0时收益率的指定值

cal_beta

finfactory.fintools.utils_gains.cal_beta(values_target, values_base, gain_type='pct', pct_cost0=1)
计算贝塔系数
values_target, values_base分别为目标价值序列和基准价值序列
gain_type和pct_cost0同 finfactory.fintools.utils_gains.cal_gain_pcts() 中的参数
参考:

cal_alpha_beta

finfactory.fintools.utils_gains.cal_alpha_beta(values_target, values_base, r0=0.03, nn=252, gain_type='pct', rtype='exp', pct_cost0=1, logger=None)
计算alpha和beta系数
参数参考 cal_beta()cal_returns_period() 函数

cal_alpha_by_beta_and_r

finfactory.fintools.utils_gains.cal_alpha_by_beta_and_r(r, r_base, beta, r0=0.03)
根据年化收益以及beta计算alpha
r为策略年化收益,r_base为基准年化收益,r0为无风险收益率,beta为策略beta值

cal_return_period_by_gain_pct

finfactory.fintools.utils_gains.cal_return_period_by_gain_pct(gain_pct, n, nn=250, rtype='exp', gain_pct_type='pct')

给定最终收益率gain_pct,计算周期化收益率

Parameters:
  • gain_pct (float) – 给定的最终收益率

  • n (int) – 期数

  • nn (int) –

    一个完整周期包含的期数,eg.
    若price_series周期为日,求年化收益率时nn一般为252(一年的交易日数)
    若price_series周期为日,求月度收益率时nn一般为21(一个月的交易日数)
    若price_series周期为分钟,求年化收益率时nn一般为252*240(一年的交易分钟数)

  • rtype (str) – 周期化时采用指数方式’exp’或平均方式’mean’

  • gain_pct_type (str) –

    设置最终收益率gain_pct得来的计算方式,可选’pct’, ‘log’
    默认为百分比收益,若为对数收益,则计算周期化收益率时只能采用平均法,不能用指数法

Hint

百分比收益率:
复利(指数)公式:1 + R = (1 + r) ^ (n / nn) ——> r = (1 + R) ^ (nn / n) - 1
单利(平均)公式:1 + R = 1 + r * (n / nn) ——> r = R * nn / n
对数收益率:
R = r * (n / nn) ——> r = R * nn / n(采用对数收益率计算年化收益只能用平均法)
Returns:

r – 周期化收益率,其周期由nn确定

Return type:

float

References

https://zhuanlan.zhihu.com/p/112211063

cal_ext_return_period_by_gain_pct

finfactory.fintools.utils_gains.cal_ext_return_period_by_gain_pct(gain_pct, gain_pct_base, n, nn=250, rtype='exp', gain_pct_type='pct', ext_type=1)
给定收益率和基准收益率,计算周期化超额收益率
rtype周期化收益率方法,可选’exp’或’mean’或’log’
ext_type设置超额收益率计算方式:
若为1,先算各自周期化收益率,再相减
若为2,先相减,再周期化算超额
若为3,先还原两者实际净值,再以相对于基准净值的收益计算周期化超额
其他参数意义同 cal_return_period_by_gain_pct() 函数

cal_ext_return_period

finfactory.fintools.utils_gains.cal_ext_return_period(values, values_base, gain_type='pct', rtype='exp', nn=250, pct_cost0=1, ext_type=1, logger=None)
根据给定价格或价值序列计values和基准序列values_base,算超额收益
pct_cost0参考 cal_gain_pct()cal_gain_pct_log() 函数
其它参数参考 cal_ext_return_period_by_gain_pct() 函数

cal_returns_period

finfactory.fintools.utils_gains.cal_returns_period(price_series, gain_type='pct', rtype='exp', nn=252, pct_cost0=1, logger=None)

计算周期化收益率

Parameters:
  • price_series (pd.Series, np.array, list) – 资产价值序列(有负值时不能使用对数收益率)

  • gain_type (str) –

    收益率计算方式设置
    为’pct’,使用普通百分比收益
    为’log’,使用对数收益率(当price_series存在小于等于0时不能使用)
    为’dif’,收益率为前后差值(适用于累加净值情况)

  • rtype (str) –

    收益率周期化时采用指数方式’exp’或平均方式’mean’
    (采用对数收益率计算年化收益只能用平均法)

  • nn (int) –

    一个完整周期包含的期数,eg.
    若price_series周期为日,求年化收益率时nn一般为252(一年的交易日数)
    若price_series周期为日,求月度收益率时nn一般为21(一个月的交易日数)
    若price_series周期为分钟,求年化收益率时nn一般为252*240(一年的交易分钟数)

  • pct_cost0 (float) – 成本为0时收益率的指定值,参见 cal_gain_pct()cal_gain_pct_log() 函数

Returns:

r – 周期化收益率,其周期由nn确定

Return type:

float

cal_returns_period_mean

finfactory.fintools.utils_gains.cal_returns_period_mean(price_series, gain_type='pct', nn=252, pct_cost0=1, logger=None)
计算周期化收益率,采用收益率直接平均的方法
price_series为资产价值序列,pd.Series或list或np.array(有负值时不能使用对数收益率)
gain_type和pct_cost0参数参见 cal_gain_pcts()
nn为一个完整周期包含的期数,eg.
若price_series周期为日,求年化收益率时nn一般为252(一年的交易日数)
若price_series周期为日,求月度收益率时nn一般为21(一个月的交易日数)
若price_series周期为分钟,求年化收益率时nn一般为252*240(一年的交易分钟数)

cal_volatility

finfactory.fintools.utils_gains.cal_volatility(price_series, gain_type='pct', nn=252, pct_cost0=0, logger=None)
价格序列price_series的周期化波动率计算
price_series为资产价值序列,pd.Series或list或np.array(有负值时不能使用对数收益率)
gain_type和pct_cost0参数参见 cal_gain_pcts()
nn为一个完整周期包含的期数,eg.
若price_series周期为日,求年化收益率时nn一般为252(一年的交易日数)
若price_series周期为日,求月度收益率时nn一般为21(一个月的交易日数)
若price_series周期为分钟,求年化收益率时nn一般为252*240(一年的交易分钟数)
返回收益波动率,其周期由nn确定
参考:

cal_sharpe

finfactory.fintools.utils_gains.cal_sharpe(values, r=0.03, nn=252, gain_type='pct', ann_rtype='exp', pct_cost0=1, logger=None)
计算夏普比率,先算期望收益和波动率,再算夏普
r为无风险收益率

cal_sortino

finfactory.fintools.utils_gains.cal_sortino()

计算索提诺比率

cal_sharpe2

finfactory.fintools.utils_gains.cal_sharpe2(values, r=0.03, nn=252, gain_type='pct', pct_cost0=1, logger=None)

计算夏普比率

Parameters:
  • values (pd.Series) – 资产价值序列

  • r (float) – 无风险收益率

  • nn (int) –

    无风险收益率r的周期所包含的values的周期数,eg.
    若values周期为日,r为年化无风险收益率时,N一般为252(一年的交易日数)
    若values周期为日,r月度无风险收益率时,N一般为21(一个月的交易日数)
    若values周期为分钟,r为年化无风险收益率时,N一般为252*240(一年的交易分钟数)

  • gain_type (str) –

    收益率计算方式设置
    为’pct’,使用普通百分比收益
    为’log’,使用对数收益率(当price_series存在小于等于0时不能使用)
    为’dif’,收益率为前后差值(适用于累加净值情况)

References

get_maxdown

finfactory.fintools.utils_gains.get_maxdown(values, return_idx=True, abs_val=False)

最大回撤计算

Parameters:
  • values (list, np.array, pd.Series) – 资产价值序列

  • return_idx (bool) – 是否返回最大回撤区间起止位置,若为False,则起止位置返回None

  • abs_val (bool) – 若为True,则计算最大回撤时采用亏损绝对值而不是亏损比率

Returns:

  • maxdown (float) – 最大回撤幅度(正值)

  • start_end_idxs (tuple) – 最大回撤起止位置(start_idx, end_idx),若return_idx为False,则为(None, None)

References

get_maxdown_all

finfactory.fintools.utils_gains.get_maxdown_all(values, abs_val=False)

计算区间每个时期的最大回撤

get_maxdown_dy

finfactory.fintools.utils_gains.get_maxdown_dy(values, abs_val=False)

计算动态最大回撤(每个时间点之前的最高值到当前的回撤)

get_maxup

finfactory.fintools.utils_gains.get_maxup(values, return_idx=True, abs_val=False)

最大盈利计算(与最大回撤 finfactory.fintools.utils_gains.get_maxdown() 相对应,即做空情况下的最大回撤)

get_maxdown_pd

finfactory.fintools.utils_gains.get_maxdown_pd(series, abs_val=False)

使用pd计算最大回撤计算

Parameters:
  • series (pd.Series, np.array, list) – 资产价值序列

  • abs_val (bool) – 若为True,则计算最大回撤时采用亏损绝对值而不是亏损比率

Returns:

  • maxdown (float) – 最大回撤幅度(正值)

  • start_end_idxs (tuple) – 最大回撤起止索引:(start_idx, end_idx)

  • start_end_iloc (tuple) – 最大回撤起止位置(int):(start_iloc, end_iloc)

cal_n_period_1year

finfactory.fintools.utils_gains.cal_n_period_1year(df, col_date='date', n1year=252)

根据交易记录及日期列估计一年的交易期数

get_netval_prod

finfactory.fintools.utils_gains.get_netval_prod(pct_series)

累乘法净值计算,pct_series(pd.Series)为收益率序列(注:单位应为%)

get_netval_sum

finfactory.fintools.utils_gains.get_netval_sum(pct_series)

累加法净值计算,pct_series(pd.Series)为收益率序列(注:单位应为%)

cal_pct_by_cost_gain

finfactory.fintools.utils_gains.cal_pct_by_cost_gain(cost, gain, vcost0=1)

计算在成本为cost,盈利为gain时的盈亏百分比

  • vcost0为当成本cost为0且盈利gain为正时的返回值,gain为负时取负号

get_gains_act

finfactory.fintools.utils_gains.get_gains_act(df_settle, act_gain_pct_method=2)
根据资金转入转出和资产总值记录计算实际总盈亏%
df_settle须包含列[‘转入’, ‘转出’, ‘资产总值’]
返回df中包含[‘累计转入’, ‘累计转出’, ‘累计净流入’, ‘累计总值’, ‘累计盈亏’, ‘实际总盈亏%’]这几列

get_fundnet0

finfactory.fintools.utils_gains.get_fundnet0(df_settle, when='before', restart=False)

用基金净值法根据转入转出和资产总值记录计算净值

Parameters:
  • df_settle (pd.DataFrame) – 须包含列[‘转入’, ‘转出’, ‘资产总值’]三列

  • when (str) –

    列用于指定当期转入转出计算份额时使用的净值对应的时间:
    若为’before’,表示转入转出发生在当天净值结算之前(计算增减份额用前一期净值)
    若为’after’,表示转入转出发生在当天净值结算之后(计算增减份额用结算之后的净值)
    若为None,当转入大于转出时设置为’before’,当转出大于转入时设置为’after’
    若为’when’,在df_settle中通过’when’列指定,’when’列的值只能为’before’或’after’

Returns:

pd.DataFrame - 包含[‘新增份额’, ‘份额’, ‘净值’]三列

get_gains

finfactory.fintools.utils_gains.get_gains(df_settle, gain_types=['act', 'fundnet'], when=None, restart=False, act_gain_pct_method=2, when_in=None, when_out=None, outtype=1, intype=1, fundnet_func=0)
不同类型的盈亏情况统计
gain_types为累计收益计算方法,可选:
[‘act’实际总盈亏, ‘prod’累乘法, ‘sum’累加法, ‘fundnet’基金份额净值法]
注意:
累乘法和累加法df_settle须包含’盈亏%’列
实际总盈亏和基金净值法df_settle须包含[‘转入’, ‘转出’, ‘资产总值’]列

plot_gain_act

finfactory.fintools.utils_gains.plot_gain_act(df_gain, time_col='日期', n=None, **kwargs_plot)
绘制实际盈亏曲线图
df_gain须包含列[time_col, ‘实际总盈亏%’]
n设置需要绘制的期数
**kwargs_plot为plot_series可接受参数

plot_gain_prod

finfactory.fintools.utils_gains.plot_gain_prod(df_gain, time_col='日期', n=None, show_gain=True, **kwargs_plot)
绘制盈亏净值曲线图
df_gain须包含列[time_col, ‘盈亏%’]
n设置需要绘制的期数
**kwargs为plot_series可接受参数

cal_sig_gains

finfactory.fintools.utils_gains.cal_sig_gains(data, sig_col, sig_type=1, shift_lag=0, col_price='close', col_price_buy='close', col_price_sel='close', settle_after_act=False, func_vol_add='base_1', func_vol_sub='base_1', func_vol_stoploss='hold_1', func_vol_stopgain='hold_1', stop_no_same=True, ignore_no_stop=False, hold_buy_max=None, hold_sel_max=None, limit_min_vol=100, base_money=200000, base_vol=None, init_cash=0.0, fee=0.0015, sos_money=1000, max_loss=None, max_gain=None, max_down=None, add_loss_pct=None, add_gain_pct=None, stop_sig_order='both', add_sig_order='offset', force_final0='settle', del_begin0=True, gap_repeat=False, nshow=None, logger=None)

统计信号收益情况(没考虑杠杆,适用A股)

Note

仅考虑市场价格为正,不考虑市场价格为负值的极端情况

Caution

若报错,检查数据中是否存在无效值等

Parameters:
  • data (pd.DataFrame) –

    行情数据,须包含 sig_col, col_price, col_price_buy, col_price_sel 指定的列。
    col_price 为结算价格列;col_price_buycol_price_sel 分别为做多(买入)和做空(卖出)操作的价格列。

    Note

    当结算价格的出现时间晚于操作价格时 settle_after_act 应设置为True,否则 settle_after_act 设置为False。

    sig_col 列为信号列,其值规则应满足:
    - 当 sig_type =1时, sig_col 列的值只能包含-1、1和0, 其中1为做空(卖出)信号,-1为做多(买入)信号,0为不操作
    - 当 sig_type =2时, sig_col 列的值为正|负整数或0, 其中正整数表示买入(做多)交易量,负整数表示卖出(做空)交易量,0表示不交易

  • func_vol_add (str, function) –

    自定义开仓/加仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_add(base_vol, holdVol, cash, Price):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量
    # cash: 可用现金
    # Price: 交易价格
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当 func_vol_add 指定为’base_x’时,使用预定义函数 get_AddTradeVol_baseX , 其交易计划为:开底仓的x倍
    - 当 func_vol_add 指定为’hold_x’时,使用预定义函数 get_AddTradeVol_holdX , 其交易计划为:无持仓时开底仓,有持仓时开持仓的x倍
    - 当 func_vol_add 指定为’all’时,使用预定义函数 get_AddTradeVol_all , 其交易计划为:以账户当前可用资金为限额开全仓

  • func_vol_sub (str, function) –

    自定义平仓/减仓操作时的交易量函数,其输入和输出格式应为:
    def func_vol_sub_stop(base_vol, holdVol, cash, Price, holdCost):
    # Parameters:
    # base_vol:底仓量
    # holdVol:当前持仓量(正负号表示持仓方向)
    # cash: 可用现金(不包含平|减仓释放的资金)
    # Price: 交易价格
    # holdCost: 当前持仓总成本(用于计算平|减仓释放资金量)
    # Returns:
    # tradeVol:计划交易量
    ……
    return tradeVol
    - 当指定为’base_x’时,使用预定义函数 get_SubStopTradeVol_baseX , 其交易计划为:减底仓的x倍(若超过了持仓量相当于平仓后反向开仓)
    - 当指定为’hold_x’时,使用预定义函数 get_SubStopTradeVol_holdX , 其交易计划为:减持仓的x倍(x大于1时相当于平仓后反向开仓)
    - 当指定为’hold_base_x’时,使用预定义函数 get_SubStopTradeVol_holdbaseX , 其交易计划为:平仓后反向以base_vol的x倍反向开仓
    - 当指定为’hold_all’时,使用预定义函数 get_SubStopTradeVol_holdAll , 其交易计划为:平仓后以账户当前可用资金(包含平仓释放资金)为限额反向开全仓

  • func_vol_stoploss (str, function) – 自定义止损操作时的交易量函数,格式同 func_vol_sub 参数

  • func_vol_stopgain (str, function) – 自定义止盈操作时的交易量函数,格式同 func_vol_sub 参数

  • stop_no_same (bool) – 当止盈止损和操作信号同时出现,是否忽略同向操作信号 (做多|空止损|盈后是否禁止继续做多|空)

  • ignore_no_stop (bool) – 当有持仓且没有触及止盈止损条件时是否忽略信号,为True时忽略,为False时不忽略

  • hold_buy_max (int, float) – 买入(做多)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • hold_sel_max (int, float) – 卖出(做空)持仓量最大值限制,若信号导致持仓量超限,将被忽略

  • limit_min_vol (int, float) – 最少开仓量限制(比如股票至少买100股)

  • base_money (float) – 开底仓交易限额

  • base_vol (int, float) –

    开底仓交易限量

    Note

    同时设置 base_moneybase_vol 时以 base_money 为准

  • init_cash (float) – 账户初始资金额

  • fee (float) – 单向交易综合成本比例(双向收费)

  • max_loss (float) – 止损比例

  • max_gain (float) – 止盈比例

  • max_down (float) – 平仓最大回撤比例

  • add_loss_pct (float) – 当前价格比上次同向交易价格亏损达到 add_loss_pct 时加仓, 加仓方式由 func_vol_add 决定

  • add_gain_pct (float) – 当前价格比上次同向交易价格盈利达到 add_gain_pct 时加仓, 加仓方式由 func_vol_add 决定

  • stop_sig_order (str) –

    - 若为`sig_only`,当止盈止损和操作信号同时出现时,忽略止盈止损信号
    - 若为`stop_only`,当止盈止损和操作信号同时出现时,忽略操作信号
    - 若为`stop_first`,当止盈止损和操作信号同时出现时,先考虑止盈止损及反向再开新仓
    - 若为`sig_first`,当止盈止损和操作信号同时出现时,先考虑操作信号再进行剩余止盈止损及反向
    - 若为`both`,则止盈止损及反向量和信号交易量同时考虑

  • add_sig_order (str) –

    - 若为`offset`,当加仓信号与操作信号相反时,两者抵消
    - 若为`sig_only`,当加仓信号与操作信号相反时,以操作信号为准
    - 若为`add_only`,当加仓信号与操作信号相反时,以加仓信号为准

  • force_final0 (str, bool) –

    最后一个时间强平价格设置:
    - 若为False,则不强平,按结算价结算账户信息
    - 若为’trade’,则按col_price_sel或col_price_buy强平
    - 若为’settle’,则按结算价col_price强平

  • sos_money (float) – 账户本金亏损完,补资金时保证账户本金最少为 sos_money

  • del_begin0 (bool) – 是否删除数据中第一个信号之前没有信号的部分数据

  • gap_repeat (bool, None, int) –

    重复同向信号处理设置 (见 dramkit.gentools.replace_repeat_func_iter() 函数中的 gap 参数):
    - 为False时不处理
    - 为None时重复同向信号只保留第一个
    - 为整数gap时,重复同向信号每隔gap保留一个

Returns:

  • trade_gain_info (dict) – 返回各个收益评价指标

  • df (pd.DataFrame) – 包含中间过程数据

Todo

  • 增加动态变更止盈止损点平仓方式

  • 增加根据固定盈亏点位止盈止损/减仓(比如股指期货赚30个点位止盈,亏20个点位止损)

  • 最大回撤平仓添加以点位记回撤的方式

  • 计算变量中增加止盈止损价格

  • 止盈止损考虑增加最高最低价判断条件

  • 增加根据固定盈亏点位加仓(比如IF赚20个点或亏20个点加仓)

  • 止盈止损信号增加动态确定函数(止盈止损或最大回撤百分比不固定,根据持仓时间和盈亏等情况确定)

  • 增加平仓条件设置(比如分段回撤平仓(不同盈利水平不同回撤容忍度),参数设计成函数)

  • 止损参数和加减仓设计成函数(输入为盈亏比例、最大回撤、盈亏金额、盈亏点位、最近一次交易信息等)

  • 增加浮盈/亏加仓价格确定方式(例如根据距离上次的亏损比例确定)

  • 重写开仓盈亏信息计算函数(先拆单再统计)

  • 正常信号加仓和浮盈/亏加仓方式分开处理(目前是合并一致处理)

  • 固定持仓时间平仓

  • fee买入和卖出分开设置

  • func_vol_add, func_vol_sub, func_vol_stoploss, func_vol_stopgain买入和卖出分开设置 (考虑股票不能卖空情况,目前可通过设置 hold_sel_max=0控制禁止买空)

  • 添加更多的止盈止损交易量确定方式设置,比如:

    1) 分段止盈止损
    (eg. 亏10%止损一半仓位,亏20%强平)(需要记录交易过程中的止盈止损历史记录)
    2) 止盈止损和加减仓交易量函数参数扩展(加入持仓周期,盈亏比率等参数)

get_open_gain_info

finfactory.fintools.utils_gains.get_open_gain_info(df_gain, col_price='close', col_price_buy='close', col_price_sel='close', fee=0.0015, force_final0='settle', nshow=None, logger=None)
以开仓为统计口径,计算盈亏指标
df_gaincal_sig_gains() 函数的输出 df

get_yield_curve

finfactory.fintools.utils_gains.get_yield_curve(data, sig_col, nn=252, ext_type=1, net_type='fundnet', gain_type='pct', rtype='exp', show_sigs=True, show_dy_maxdown=False, show_key_infos=True, logger=None, plot=True, kwargs_plot={'figsize': (11, 7)}, **kwargs_gain)

根据信号生成收益曲线

get_yield_curve2

finfactory.fintools.utils_gains.get_yield_curve2(data, col_gain, col_cost, col_price=None, nn=252, net_type='fundnet', gain_type='pct', rtype='exp', ext_type=1, show_mkt=False, logger=None, show_dy_maxdown=False, show_key_infos=True, plot=True, kwargs_plot={})

根据每期收益和成本/资金占用计算收益曲线