综合交易模型---可转债趋势轮动策略回测,全时间,全标的回测,提供源代码

昨天花了12个小时完成了可转债趋势策略的回测,当然这个全市场的和实盘还是有一点不同,实盘有溢价率限制,可以参考我给的回测模块加入溢价率,价格限制就可以

回测模板

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_datadf=jsl_data.get_all_cov_bond_data()print(df)df.to_excel(r'数据.xlsx')stock_list=df['证券代码'].tolist()class my_backtrader:    '''    多标的均线策略    外面可用采用提前计算买卖点的方式    也可用实时计算    '''    def __init__(self,start_date='20160101',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        '''        证券代码  名称        513100  纳斯达克ETF        513500  标普500ETF        513290  纳斯达克生物科技ETF        159509  纳斯达克科技ETf        159655  标普ETF        513850  美国50ETF        159518  标普油气ETF        164824  印度ETF        513880  日本225ETF        513030  德国ETF        513730  东南亚科技ETF        159985  豆粕ETF
        '''        self.stock_list=stock_list        '''        ['513100','513500','513290','159509',                    '159655','513850','159518','164824','513880',                    '513030','513730','159985']        '''        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)

点击运行

图片

多线程加载数据回测

设置回测参数

class my_backtrader:    '''    多标的均线策略    外面可用采用提前计算买卖点的方式    也可用实时计算    '''    def __init__(self,start_date='20160101',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        '''        证券代码  名称        513100  纳斯达克ETF        513500  标普500ETF        513290  纳斯达克生物科技ETF        159509  纳斯达克科技ETf        159655  标普ETF        513850  美国50ETF        159518  标普油气ETF        164824  印度ETF        513880  日本225ETF        513030  德国ETF        513730  东南亚科技ETF        159985  豆粕ETF
        '''        self.stock_list=stock_list        '''        ['513100','513500','513290','159509',                    '159655','513850','159518','164824','513880',                    '513030','513730','159985']        '''        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 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)                '''

图片

图片

数据加载开始回测

图片

图片

我们直接看回测结果非常多,每一个标的

图片

交易报告

图片

全市场回测的可以继续优化

图片

实盘的有比较多的条件限制

图片

图片

我们看个股的买卖点分析

图片

图片

图片

图片

图片

图片

我们看策略的报告,17不知道发生了什么,我还在读高中,高一,得加入溢价率指标,价格来优化策略,实盘有这个参数限制

图片

图片

图片

图片

图片

图片

我们随便选择一个个股看看个股的交易报告

图片

111000

图片

看看程序的交易效果

图片

图片

图片

图片

图片

图片

需要全部的交易报告直接回复20240213就可以

数据分析与运用
很高兴和志同道合的你们一起学习,本公众号分享金融知识,大家一起相互学习,信息分享如有侵权,或者没有作者的同意,我们将撤回,同时也感谢大家积极的分享,大家的支持。让我们一起加油
271篇原创内容

回测框架,实盘策略全部上传了知识星球可以直接下载,最后2张优惠券

图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xg_quant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值