etf分析可以看我网页http://120.78.132.143:8023/

图片

etf分析网页http://120.78.132.143:8023/exchange_etf_analysis_app

图片

图片

债券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%差不多,基本没有回测

图片

图片

图片

图片

图片

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

 http://120.78.132.143:8023/portfolio_analysis_app

图片

图片

图片

图片

图片

图片

图片

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

图片

全部的回测源代码

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
Logo

专业量化交易与投资者大本营

更多推荐