Tushre手撕海龟策略

基于Tushare支持下的海龟策略

#利用Tushare 获取标的的数据 回测一般5年起步
def get_k_data(code,start=‘2010-01-01’,end=‘2020-01-01’):
df = ts.get_k_data(code=code,autype=‘qfq’,start=start,end=end)
df.index = pd.to_datetime(df.date)
df[‘OpenInterest’] = 0
df = df[[‘open’, ‘high’, ‘low’, ‘close’, ‘volume’, ‘OpenInterest’]]
#df.to_csv(‘stock_data’)
return df

class TurtleStrategy(bt.Strategy):
#默认参数
params = ((‘long_period’,20),
(‘short_period’,10),
(‘printlog’,False), )
def init(self):
self.order = None
self.buyprice = 0
self.buycomm = 0
self.buy_size = 0
self.buy_count = 0
# 海龟交易法则中的唐奇安通道和平均波幅ATR
self.H_line = bt.indicators.Highest(self.data.high(-1), period=self.p.long_period)
self.L_line = bt.indicators.Lowest(self.data.low(-1), period=self.p.short_period)
self.TR = bt.indicators.Max((self.data.high(0)- self.data.low(0)),
abs(self.data.close(-1)-self.data.high(0)),
abs(self.data.close(-1) - self.data.low(0)))
self.ATR = bt.indicators.SimpleMovingAverage(self.TR, period=14)
# 价格与上下轨线的交叉
self.buy_signal = bt.ind.CrossOver(self.data.close(0), self.H_line)
self.sell_signal = bt.ind.CrossOver(self.data.close(0), self.L_line)
def next(self):
if self.order:
return
#入场:价格突破上轨线且空仓时
if self.buy_signal > 0 and self.buy_count == 0:
self.buy_size = self.broker.getvalue() * 0.01 / self.ATR
self.buy_size = int(self.buy_size / 100) * 100
self.sizer.p.stake = self.buy_size
self.buy_count = 1
self.order = self.buy()
#加仓:价格上涨了买入价的0.5的ATR且加仓次数少于3次(含)
elif self.data.close >self.buyprice+0.5self.ATR[0] and self.buy_count > 0 and self.buy_count <=4:
self.buy_size = self.broker.getvalue() * 0.01 / self.ATR
self.buy_size = int(self.buy_size / 100) * 100
self.sizer.p.stake = self.buy_size
self.order = self.buy()
self.buy_count += 1
#离场:价格跌破下轨线且持仓时
elif self.sell_signal < 0 and self.buy_count > 0:
self.order = self.sell()
self.buy_count = 0
#止损:价格跌破买入价的2个ATR且持仓时
elif self.data.close < (self.buyprice - 2
self.ATR[0]) and self.buy_count > 0:
self.order = self.sell()
self.buy_count = 0
#交易记录日志(默认不打印结果)
def log(self, txt, dt=None,doprint=True):
if self.params.printlog or doprint:
dt = dt or self.data.datetime.date(0)
print(f’{dt.isoformat()},{txt}‘)
#记录交易执行情况(默认不输出结果)
def notify_order(self, order): #跟踪订单的状态,订单状态变化时自动触发
# 如果order为submitted/accepted,返回空
if order.status in [order.Submitted, order.Accepted]:
return
# 如果order为buy/sell executed,报告价格结果
if order.status in [order.Completed]:
if order.isbuy():
self.log(f’买入:\n价格:{order.executed.price},
成本:{order.executed.value},
手续费:{order.executed.comm}’)
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else:
self.log(f’卖出:\n价格:{order.executed.price},
成本: {order.executed.value},
手续费{order.executed.comm}‘)
self.bar_executed = len(self)
# 如果指令取消/交易失败, 报告结果
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log(‘交易失败’)
self.order = None
#记录交易收益情况(可省略,默认不输出结果)
def notify_trade(self,trade): #跟踪订单的状态,订单状态变化时自动触发
if not trade.isclosed:
return
self.log(f’策略收益:\n毛收益 {trade.pnl:.2f}, 净收益 {trade.pnlcomm:.2f}’)
def stop(self):
self.log(f’(组合线:{self.p.long_period},{self.p.short_period});
期末总资金: {self.broker.getvalue():.2f}', doprint=True)

class TradeSizer(bt.Sizer):
params = ((‘stake’, 1),)
def _getsizing(self, comminfo, cash, data, isbuy):
if isbuy:
return self.p.stake
position = self.broker.getposition(data)
if not position.size:
return 0
else:
return position.size
return self.p.stake

def main(code,long_list,short_list,start,end=‘’,startcash=1000000,com=0.001):
#创建主控制器
cerebro = bt.Cerebro()
#导入策略参数寻优
cerebro.optstrategy(TurtleStrategy,long_period=long_list,short_period=short_list)
#获取数据
df=get_k_data(code,start=start,end=end)

#将数据加载至回测系统
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
#broker设置资金、手续费
cerebro.broker.setcash(startcash)
cerebro.broker.setcommission(commission=com)
#设置买入设置,策略,数量
cerebro.addsizer(TradeSizer)
print('期初总资金: %.2f' % cerebro.broker.getvalue())
cerebro.run(maxcpus=1)

long_list=range(10,50,5)
short_list=range(10,20,5)
main(‘sh’,long_list,short_list,‘2010-01-01’,‘2020-07-17’)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值