综合交易模型---债券ETF趋势轮动策略回测报告,提供源代码
etf分析网页http://120.78.132.143:8023/exchange_etf_analysis_app。etf分析可以看我网页http://120.78.132.143:8023/实盘设置我们利用可转债趋势轮动策略交易市场选择债券就可以。策略收益报告,最近3年,年华3%差不多,基本没有回测。运行user def models更新数据。运行traer_st开头的进入实盘交易。全部源代
·
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 backtrader
from xgtrader_backtrader.user_def_data.user_def_data import user_def_data
from xgtrader_backtrader.trader_tool import tdx_indicator
import pandas as pd
from xgtrader_backtrader.trader_tool import jsl_data
from xgtrader_backtrader.trader_tool.dfcf_etf_data import dfcf_etf_data
from xgtrader_backtrader.trader_tool.ths_rq import ths_rq
models=dfcf_etf_data()
#债券ETF
df=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
更多推荐
所有评论(0)