一.效果

二.实现
1.获取数据

2.设置排除因子,排序因子 ,回测
import bt
from bt_algos_extend import SelectTopK
# 1.排除因子 大于0.02买入,小于0卖出
factor = data.pct_change(20) # 20天涨跌幅
signal = np.where(factor > 0.02, 1, np.NaN)
signal = np.where(factor < 0, 0, signal)
signal = pd.DataFrame(signal, data.index, columns=factor.columns)
signal = signal.ffill()
signal = signal.fillna(0)
# 2.排序因子 动量因子
roc = data.pct_change(20) # 20天涨跌幅
all = []
for K in [
1,
]:
s = bt.Strategy(
"{}K={}".format(title, K),
[
bt.algos.RunDaily(),
bt.algos.SelectWhere(signal),
SelectTopK(roc, K), # 涨幅最好选前K个
bt.algos.WeighEqually(),
bt.algos.Rebalance(),
],
)
all.append(s)
stras = [bt.Backtest(s, data) for s in all]
for bench in symbols:
data = CSVDataloader.get([bench])
s = bt.Strategy(
bench,
[
bt.algos.RunOnce(),
bt.algos.SelectAll(),
bt.algos.WeighEqually(),
bt.algos.Rebalance(),
],
)
stra = bt.Backtest(s, data, name=bench)
stras.append(stra)
res = bt.run(*stras)
3.回测数据分析
# 获取每日收益
s_name = title + "K=1"
returns = res[s_name].returns
res.display_monthly_returns(s_name)
import empyrical
print("累计收益:", round(empyrical.cum_returns_final(returns), 3))
print("年化收益:", round(empyrical.annual_return(returns), 3))
print("最大回撤:", round(empyrical.max_drawdown(returns), 3))
print("夏普比", round(empyrical.sharpe_ratio(returns), 3))
print("卡玛比", round(empyrical.calmar_ratio(returns), 3))
import quantstats as qs
qs.reports.basic(returns)


发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/281595
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!