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_buy
和col_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_money
和base_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)
- 以开仓为统计口径,计算盈亏指标
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_buy
和col_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_money
和base_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)
- 以开仓为统计口径,计算盈亏指标
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
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计算平均真实波幅ATRdf中必须包含[‘high’, ‘low’, ‘close’]三列注:talib的结果跟同花顺对不上参考:
adx
- finfactory.fintools.fintools.adx(df, lag=14)
talib_adx
- finfactory.fintools.fintools.talib_adx(df, lag=14)
- talib计算平均趋向指标ADXdf中必须包含[‘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)
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
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
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
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
收费标准源于沪深交易所官网,若有更新须更改:http://www.szse.cn/marketServices/deal/payFees/index.html(2020年2月)
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_col
和sig2_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_col
、price_col
和 vol_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计算alphar为策略年化收益,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
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
See also
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)
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_buy
和col_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_money
和base_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)
- 以开仓为统计口径,计算盈亏指标
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={})
根据每期收益和成本/资金占用计算收益曲线