以下是小哥用Dual-Thrust策略回测CTA的代码和结果,错误的地方还请大家提出来。

标的是螺纹钢的主力连续合约

#%% Dual Thrust策略
# 导入包
import pandas as pd
import matplotlib.pyplot as plt#%% 导入和清洗数据
RBL=pd.read_excel('H:/RBL8.xlsx')
RBL.index=pd.to_datetime(RBL.iloc[:,0])
RBL=RBL['2016':'2017']
RBL=RBL.iloc[:,1:5]
RBL.columns=('Open','High','Low','Close')#%% Dual_Thrust策略
#输入时间序列
#输出买卖信号、持仓情况
def dt(tso,tsh,tsl,tsc,N,k1,k2):#输入#开盘价df:tso,最高价df:tsh,最低价df:tsl,收盘价df:tsc#参数int:N,k1,k2#初始化HH=pd.Series(index=tso.index[N-1:])LC=pd.Series(index=tso.index[N-1:])HC=pd.Series(index=tso.index[N-1:])LL=pd.Series(index=tso.index[N-1:])Range=pd.Series(index=tso.index[N-1:])BuyLine=pd.Series(index=tso.index[N-1:])SellLine=pd.Series(index=tso.index[N-1:])Open=tso.iloc[N-1:]Close=tsc.iloc[N-1:]Signal=pd.Series(0,index=tso.index[N-1:]) #交易信号Case=pd.Series(0,index=tso.index[N-1:]) #仓位情况#计算N日内最高价HH,Close的最低价LC,Close的最高价HC,最低价LLfor i in range(len(tso.index)-N+1):HH.iloc[i]=max(tsh.iloc[i:i+N])LC.iloc[i]=min(tsc.iloc[i:i+N])HC.iloc[i]=max(tsc.iloc[i:i+N])LL.iloc[i]=min(tsl.iloc[i:i+N])Range.iloc[i]=max(HH.iloc[i]-LC.iloc[i],HC.iloc[i]-LL.iloc[i])#生成Range,买入线BuyLine,买出线,SellLineBuyLine=Open+k1*RangeSellLine=Open-k2*Range#画出区间plt.figure('BuyLine和SellLine')    plt.plot(BuyLine)plt.plot(SellLine)#构建交易信号#当日收盘价低于或高于区间时生成交易信号Signalfor i in range(len(Range)-1):Signal.iloc[i]=0Case.iloc[i+1]=Case.iloc[i]if Close.iloc[i]>=BuyLine.iloc[i] and Case.iloc[i]<1:Signal.iloc[i]=1Case.iloc[i+1]=1elif Close.iloc[i]<=SellLine.iloc[i] and Case.iloc[i]>-1:Signal.iloc[i]=-1Case.iloc[i+1]=-1return Signal,Case #%% 进行回测
[sig,ca]=dt(RBL['Open'],RBL['High'],RBL['Low'],RBL['Close'],20,0.1,0.1)#%% 输出收盘价、交易信号、持仓情况
plt.figure('输出收盘价、交易信号、持仓情况')
plt.subplot(3,1,1)
plt.plot(RBL['Close'])
plt.title('收盘价')
plt.subplot(3,1,2)
plt.plot(sig)
plt.title('交易信号')
plt.subplot(3,1,3)
plt.plot(ca)
plt.title('持仓情况')#%% 指标评价
# 累计收益、年化收益率、标的收益率、胜率、持仓时间、交易次数、最大回撤
#累计收益率
def all_re(tsc,Case):re=tsc.diff().dropna() #以收盘价衡量的每日收益day_profit=pd.Series(index=Case.index) #持仓后每日的收益for i in range(len(Case)):day_profit[i]=Case.iloc[i]*re[Case.index[i]]#累计收益acc_profit=day_profit.cumsum()#保证金,以持仓初始日的保证金为本金买入一手insur=tsc[Case.index[0]]*0.05+10000#年化收益:日收益率的平均值做成年化day_rate=acc_profit[-1]/(insur*len(acc_profit))anual_rate=day_rate*250#标的收益率bid_re=tsc[-1]/(insur*len(tsc))return acc_profit+insur,anual_rate,bid_re#%% 交易次数、多头次数、空头次数
def trade_num(sig):return len(sig[sig!=0]),len(sig[sig==1]),len(sig[sig==-1])#%% 持仓时间
def in_case(case):return len(case[case!=0])#%% 回撤、最大回撤
def tradeback(tsc,Case):tb=pd.Series(0,index=Case.index)re=tsc.diff().dropna() #以收盘价衡量的每日收益day_profit=pd.Series(index=Case.index) #持仓后每日的收益for i in range(len(Case)):day_profit[i]=Case.iloc[i]*re[Case.index[i]]insur=tsc[Case.index[0]]*0.05+10000#累计收益acc_profit=day_profit.cumsum()+insur#回撤率for i in range(10,len(tb)-1):if acc_profit[i]>0:tb.iloc[i]=abs((max(acc_profit[:i+1])-acc_profit[i+1])/max(acc_profit[:i+1]))#返回回撤率、最大回撤率    return tb,max(tb)#%%计算胜率
def victor(tsc,Case):ca_re=pd.Series(0,index=Case.index)re=tsc.diff().dropna()for i in range(len(Case)):ca_re.iloc[i]=Case.iloc[i]*re[Case.index[i]]vi=len(ca_re[ca_re>0])/len(Case) return vi#%% 输出累计收益率,回撤
plt.figure('累计收益、回撤')
plt.subplot(2,1,1)
plt.plot(all_re(RBL['Close'],ca)[0])
plt.title('累计收益')
plt.subplot(2,1,2)
plt.plot(tradeback(RBL['Close'],ca)[0]*100)
plt.title('回撤')#%% 各项指标
print('年化收益率:',all_re(RBL['Close'],ca)[1]*100,'%')
print('\n标的收益率:',all_re(RBL['Close'],ca)[2]*100,'%')
print('\n交易次数:',trade_num(sig)[0],'\n多头次数:',trade_num(sig)[1],\'\n空头次数:',trade_num(sig)[2])
print('\n胜率:',victor(RBL['Close'],ca))
print('\n持仓时间:',in_case(ca))
print('\n最大回撤:',tradeback(RBL['Close'],ca)[1]*100,'%')

结果为

年化收益率: 13.68464099 %
标的收益率: 0.0772052921481 %
交易次数: 93 
多头次数: 47 
空头次数: 46
胜率: 0.5256410256410257
持仓时间: 463
最大回撤: 5.36926264923 %

用Dual-Thrust策略回测CTA相关推荐

  1. 用趋势突破策略回测CTA

    以下是小哥用趋势突破策略回测CTA的代码和结果,错误的地方还请大家提出来. 标的是螺纹钢的主力连续合约 #%% 趋势突破策略 # 导入包 import pandas as pd import matp ...

  2. Python双均线策略回测(2021-10-12)

    Python双均线策略回测 1.择时策略简介 根据百度百科的解释,择时交易是指利用某种方法来判断大势的走势情况,是上涨还是下跌或者是盘整.如果判断是上涨,则买入持有:如果判断是下跌,则卖出清仓,如果是 ...

  3. Excel-VBA 股票网格交易策略回测

    大家好,我是陈小虾,是一名自动化方向的IT民工.写博客是为了记录自己的学习过程,通过不断输出倒逼自己加速成长.功能说明:由于水平有限,博客中难免会出现一些BUG,或者有更优方案恳请各位大佬不吝赐教!微 ...

  4. 可转债网格交易策略回测

    什么是网格交易策略:基于股票波动高抛低吸策略,自动化反复买卖赚取差价.投资者借助条件单,把资金分成多份,从基准价开始,每跌x%就自动买入一份,每涨y%就自动卖掉一份.股价越波动高抛低吸的机会越多 什么 ...

  5. python 策略回测期货_量化投资实战教程(1)—基于backtrader的简单买入卖出策略

    都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...

  6. python 股票回测书籍推荐_python实现马丁策略回测3000只股票

    python实现马丁策略回测3000只股票 批量爬取股票数据 这里爬取数据继续使用tushare,根据股票代码来遍历,因为爬取数据需要一定时间,不妨使用多线程来爬取,这里要注意tushare规定每分钟 ...

  7. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  8. 【邢不行|量化小讲堂系列56-实战篇】量化策略回测表现好,但实盘却很差?可能是底层数据就错啦!

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总]请点击此处 [必读文章] [邢不行 ...

  9. 量化投资01----股票_贵州茅台600519_双均线策略回测

    贵州茅台 SH600519 双均线策略回测(5日均线.30日均线,金叉买入,死叉卖出) 交易从 2010年开始,2019年底结束. 10万初始资金 尽量买入(按手),尽量卖出,均以开盘价 未计算手续费 ...

最新文章

  1. Python基础06-数据类型:元组tuple
  2. ubuntu基于apache+postgresql编译安装zabbix
  3. Redis 数据持久化之 RDB
  4. Spring配置文件约束头
  5. loopback接口、router ID详解
  6. ThreadLocal深度解析
  7. 构建大型 Mobx 应用的几个建议
  8. android 添加联系人地址,android – 如何向联系人添加新字段?
  9. Vs2010 Qt插件安装教程
  10. arm开发板挂载win10和ubuntu haneWIN NFS Server
  11. arp表老化时间及其修改
  12. html中复选框只能选一个,HTML选择三个不同的复选框并显示它们
  13. 四旋翼无人机飞行器基本知识(四旋翼无人机结构和原理+四轴飞行diy全套入门教程)
  14. ZEMAX | 如何对中间面进行优化
  15. Centos 7 制作Oracle 12c Docker Images
  16. Word排版插件,VSTO公文排版,Word论文排版
  17. [iOS] 浅析排序规则描述类: NSSortDescriptor
  18. 彩信发送失败原因是什么?如何解决?
  19. 流量不清零跑得快风波,运营商到底在掩盖什么
  20. 第十二届蓝桥杯 ——国际象棋

热门文章

  1. cad立面索引符号 规范_cad剖面符号和索引符号该怎么画?
  2. 如何提高PUE值 数据中心能耗详解
  3. mac终端svn命令
  4. 学asp.net的自己学做网站的第一感受
  5. UDS诊断系列之四 诊断请求和响应
  6. 计算机应用基础模拟试卷六,2020年9月网络教育统考计算机应用基础模拟题试卷6...
  7. jquery防止重复提交表单
  8. android 小米sdk版本,小米应用商店:检查更新SDK 集成指南
  9. xp系统访问共享服务器提示无网络路径,XP提示“无任何网络提供程序接受指定的网络路径”如何解决...
  10. software-plug-ins