综合交易模型---债券ETF趋势轮动策略回测报告,提供源代码

发布于: 雪球转发:0回复:0喜欢:0

etf分析可以看我网页网页链接

etf分析网页网页链接

债券ETf

实盘设置我们利用可转债趋势轮动策略交易市场选择债券就可以

{ "ETF选择设置":"ETF选择设置***********************", "选择类型说明":"类型有默认和自定义", "选择类型":"默认", "选择市场说明":"市场有全部/A股/外盘/商品/债券,我剔除了相同的etf,保留一个", "默认市场":["债券"], "自定义股票池":["513110","159941"], "分析指标":{"溢价率":[-3,5]}, "自定义字符串":"自定义名称字符串***********", "是否开启自定义字符串":"否", "自定义字符串内容":"标普,纳指,德国,法国,东南亚,日本", "资金分配设置":"交易数量设置数量和金额", "交易模式":"数量", "固定交易资金":1000, "持有金额限制":2000, "固定交易数量":1000, "持股限制":10, "持有限制":10, "持股周期设置":"持股轮动设置,可以买入小于持股限制数量不可以卖出", "是否开启持股周期":"否", "持股持股周期天数":4, "趋势分析参数":"均线分析--日线", "使用均线":[5,10,20,30,60], "均线最低分数":50, "持有均线最低分":50, "收益率分析模块":"收益率分析模块", "最近N天":5, "最近N天最大收益率":50, "最近N天最小收益率":-1, "最近N天最大回撤":20, "买入前N":10, "跌破N日均线卖出":10}

分析配置里面选择etf趋势策略

运行user def models更新数据

更新数据

运行traer_st开头的进入实盘交易

回测,我们直接运行回测框架1.2

开始回测,最近3年的

数据

个股交易

策略收益报告,最近3年,年华3%差不多,基本没有回测

还是纳斯达克厉害,小果投资组合分析网页

网页链接

全部源代码在知识星球可以直接下载实盘

全部的回测源代码

from xgtrader_backtrader.backtrader import backtraderfrom xgtrader_backtrader.user_def_data.user_def_data import user_def_datafrom xgtrader_backtrader.trader_tool import tdx_indicatorimport pandas as pdfrom xgtrader_backtrader.trader_tool import jsl_datafrom xgtrader_backtrader.trader_tool.dfcf_etf_data import dfcf_etf_datafrom xgtrader_backtrader.trader_tool.ths_rq import ths_rqmodels=dfcf_etf_data()#债券ETFdf=models.get_bond_etf_data()print(df)df.to_excel(r'数据.xlsx')stock_list=df['基金代码'].tolist()class my_backtrader: ''' 多标的均线策略 外面可用采用提前计算买卖点的方式 也可用实时计算 ''' def __init__(self,start_date='20210101',end_date='20500101',data_type='D', starting_cash=100000,cash=100000,commission=0.001): self.start_date=start_date self.end_date=end_date self.data_type=data_type self.starting_cash=starting_cash self.commission=commission #这里输入代码就可以 self.stock_list=stock_list self.amount=1000 self.hold_limit=2000 #采用目标数量交易 self.buy_target_volume=10000 self.sell_target_volume=0 self.buy_target_value=5000 self.sell_target_value=0 #上涨突破5日线买 self.buy_mean_line=5 #下跌10日线卖 self.sell_mean_line=10 #买的最低分 self.buy_min_score=50 #持有最低分 self.hold_min_score=50 self.trader=backtrader(start_date=self.start_date,end_date=self.end_date, data_type=self.data_type,starting_cash=self.starting_cash,commission=self.commission,cash=cash) self.data=user_def_data(start_date=self.start_date,end_date=self.end_date,data_type=self.data_type) def add_all_data(self): ''' 多线程加载数据 ''' self.data.get_thread_add_data(stock_list=self.stock_list) self.hist=self.data.hist return self.hist def get_cacal_all_indicators(self): ''' 计算全部的指标 ''' hist=self.add_all_data() trader_info=pd.DataFrame() #拆分数据 for stock in self.stock_list: df=hist[hist['stock']==stock] df['mean_5']=df['close'].rolling(5).mean() df['mean_10']=df['close'].rolling(10).mean() df['mean_20']=df['close'].rolling(20).mean() df['mean_30']=df['close'].rolling(30).mean() df['mean_60']=df['close'].rolling(60).mean() df['mean_5_mean_10']=df['mean_5']>=df['mean_10'] df['mean_10_mean_20']=df['mean_10']>=df['mean_20'] df['mean_20_mean_30']=df['mean_20']>=df['mean_30'] df['mean_30_mean_60']=df['mean_30']>=df['mean_60'] for i in ['mean_5_mean_10','mean_10_mean_20','mean_20_mean_30','mean_30_mean_60']: df[i]=df[i].apply(lambda x: 25 if x==True else 0) df1=df[['mean_5_mean_10','mean_10_mean_20','mean_20_mean_30','mean_30_mean_60']] df['score']=df1.sum(axis=1).tolist() df['buy']=df['close']>df['mean_5'] df['sell']=df['close']<df['mean_5'] trader_info=pd.concat([trader_info,df],ignore_index=True) return trader_info def run_backtrader(self): ''' 运行回测 ''' trader_list=self.trader.get_trader_date_list() trader_info=self.get_cacal_all_indicators() for date in trader_list: df=trader_info[trader_info['date']==date] stock_list=df['stock'].tolist() for stock in stock_list: df1=df[df['stock']==stock] price=df1['close'].tolist()[-1] price=float(price) buy=df1['buy'].tolist()[-1] sell=df1['sell'].tolist()[-1] score=df1['score'].tolist()[-1] ''' if buy==True: if self.trader.check_stock_is_av_buy(date=date,stock=stock,price=price,amount=self.amount,hold_limit=self.hold_limit): self.trader.buy(date=date,stock=stock,price=price,amount=self.amount) else: self.trader.settle(date=date,stock=stock,price=price) elif sell==True: if self.trader.check_stock_is_av_sell(date=date,stock=stock,price=price,amount=self.amount): self.trader.sell(date=date,stock=stock,price=price,amount=self.amount) else: self.trader.settle(date=date,stock=stock,price=price) else: self.trader.settle(date=date,stock=stock,price=price) ''' #目标数量回测例子 if buy==True and score>=self.buy_min_score: result=self.trader.order_target_volume(date=date,stock=stock,amount=self.buy_target_volume,price=price) if result==True: pass else: self.trader.settle(date=date,stock=stock,price=price) elif sell==True or score<=self.hold_min_score: result=self.trader.order_target_volume(date=date,stock=stock,amount=self.sell_target_volume,price=price) if result==True: pass else: self.trader.settle(date=date,stock=stock,price=price) else: self.trader.settle(date=date,stock=stock,price=price) ''' #目标价值交易 if buy==True: result=self.trader.order_target_value(date=date,stock=stock,value=self.buy_target_value,price=price) if result==True: pass else: self.trader.settle(date=date,stock=stock,price=price) elif sell==True: result=self.trader.order_target_value(date=date,stock=stock,value=self.sell_target_value,price=price) if result==True: pass else: self.trader.settle(date=date,stock=stock,price=price) else: self.trader.settle(date=date,stock=stock,price=price) '''if __name__=='__main__': trader=my_backtrader(data_type='D') trader.run_backtrader() #获取全部的交易报告 trader.trader.get_poition_all_trader_report_html() #获取策略报告 trader.trader.get_portfolio_trader_report_html() #显示个股的交易图 trader.trader.get_plot_all_trader_data_figure(limit=1000) #显示策略数据 df=trader.trader.get_portfolio_trader_data_figure(limit=100000#刷屏!OpenAI发布视频生成模型Sora# #港股连涨3天!能否迎来龙年大逆袭# #2024年春节见闻#