参考文档
聚宽文章:https://www.joinquant.com/post/27584
标题:【策略】海龟交易法则
作者:梨花香恶魔
聚宽文章:https://www.joinquant.com/post/1401
标题:【量化课堂】海龟策略
作者:JoinQuant量化课堂
聚宽文章:https://www.joinquant.com/post/17113
标题:海龟交易体系(股票版)
作者:BAFE
标题:用Python量化海龟交易法则
作者:moonshining
聚宽文章:https://www.joinquant.com/post/cbf539f28976537d3376565b1bd1d625
首先向前面四位作者致敬,感谢他们的分享。
海龟交易法则简介
海龟交易法则是一个完整的交易系统,具备一个完整的交易系统所应有的所有成分,包括市场、入市、头寸规模、止损/止盈、退出、买卖策略等:
市场:买卖什么?
我选择了沪深300指数对应的ETF指数基金:510300.XSHG-
头寸规模:买卖多少?
第一次买入时,持仓的大小根据持仓股票的波动率N(标的交易价格平均浮动)确定,保证因为标的波动造成的损失不超过1%,计算g.unitg.unit = math.floor(value * 0.01 / current_N / 100)*100
加仓时,最大为也是1 unit。当前价格比突破价格超过0.5N时加仓。
current_price >= break_price + 0.5 * current_N
入市:什么时候买卖?
current_price > max(price['close'])
,当前价格突破20天(sys1)或者55天(sys2)收盘价时。止损:什么时候卖出一个不再上升的头寸?
current_price <last_buy_price - 2 * g.current_N
当前价格跌破前一次买入价的2N时。离市:什么时候退出一个盈利的头寸?
current_price <min(price['low'])
,当前价格跌破10天(sys1)最低价或者20天(sys2)最低价策略:如何买卖?
见代码和下面的简单解释
我主要做的工作
代码实战:修改后的代码在Python3和Python2都可以运行。更进一步,可以在一创聚宽平台上实盘运行。
双周期策略系统:策略一(sys1)入市时间为20天,止盈时间为10天;策略二(sys2)入市时间为55天,止盈时间为20天。
g.in_day1 = 20
g.in_day2 = 55
g.out_day1 = 10
g.out_day2 = 20
资金分成两个部分,策略一的占比为0.8
用g.sys1和g.sys2分别记录两个策略的持仓量,
用g.ratio记录sys1所配的现金
g.ratio = 0.8
- 波动率N的初始计算在初始化时完成
price = attribute_history(g.security, g.N.maxlen+1, '1d', ('high', 'low', 'close'))
print('g.N.maxlen+1=%d\n' %(g.N.maxlen+1))
print('g.N.maxlen*2+1=%d\n' %(g.N.maxlen*2+1))
for i in range(g.N.maxlen+1, g.N.maxlen*2+1):
li = []
for j in range(i-19,i+1):
a = price['high'][j]-price['low'][j]
b = abs(price['high'][j]-price['close[j-1])
c = abs(price['low'][j]-price['close[j-1])
li.append(max(a,b,c))
current_N = np.array(li).mean()
g.N.append(current_N)
print('g.N={0}' .format(g.N))
-
波动率N之每天更新在每天开盘前完成
def before_trading_start(context): log.info("g.security: %s",g.security) g.current_N = cal_N() log.info("a new day is comming--------------------\n") log.info('当前持仓:%s',context.portfolipositions.keys ()) print("总权益:{0:.2f}万".format(context. portfolitotal_value/10000)) return
-
每天14:30根据当前价格判断无持仓时是否需要开始买入?如果有持仓,则按顺序判断是否需要止盈、止损、加仓?
current_data = get_current_data() current_price = current_data[g.security].last_price value = context.portfolio.total_value cash = context.portfolio.available_cash if g.sys1 == 0: buy(current_price, g.ratio*cash, g.in_day1) else: if sell(current_price,g.out_day1): return if stop_loss(current_price,g.last_buy_price1): return addin(current_price, g.ratio*cash, g.last_buy_price1)
-
每天14:55检查交易情况
def check_trade(context): current_returns = 100 * context.portfolio.returns log.info("当前收益:%.2f%%,当前持仓: %s", current_returns, list(context.portfolipositions.keys ()))
-
整个代码比较紧凑,运行时打印的信息比较多,方便每天掌握持仓和浮盈