Appearance
海龟交易法则
python
# 海龟交易法则
from zltquant import *
import pandas as pd
import datetime
import math
from collections import deque
def initialize(context):
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
g.security = 'sh601012'
set_benchmark(g.security)
# 入市的trailing date
g.in_day = 20
# 出市的trailing date
g.out_day = 10
# 当前持仓的交易单位
g.current_units = 0
# 当天交易的交易单位
g.today_units = 0
g.current_units = 0
g.N=deque(maxlen=19)
g.current_N = 0
g.last_buy_price = 0
price = get_price(security=g.security, end_date=context.current_dt,count=g.N.maxlen*2+1,frequency= '1d',fields=['high', 'low', 'close'])
print('ff',g.N.maxlen+1, 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)
def before_trading_start(context):
g.current_N = cal_N(context)
g.today_units = 0
def handle_data(context,data):
dt = context.current_dt
data=get_current_data()
current_price = data[g.security].last_price #上一分钟价格
value = context.portfolio.total_value
cash = context.portfolio.available_cash
unit = math.floor(value * 0.01 / g.current_N)
if g.current_units == 0:
buy(context,current_price, cash, unit)
else:
if stop_loss(current_price):
return
if sell(current_price):
return
addin(current_price, cash, unit)
def cal_N(context):
price = get_price(security=g.security, end_date=context.current_dt,count=2,frequency= '1d',fields=['high', 'low', 'close'])
a = price['high'][1]-price['low'][1]
b = abs(price['high'][1]-price['close'][0])
c = abs(price['low'][1]-price['close'][0])
current_N = (max(a,b,c) + np.array(g.N).sum())/(g.N.maxlen+1)
g.N.append(current_N)
print('nnn',g.N)
return current_N
def buy(context,current_price, cash, unit):
price = get_price(security=g.security, end_date=context.current_dt, count=g.in_day,frequency= '1d',fields=['close'])
if current_price > max(price['close']):
print('ppp',current_price ,price['close'])
shares = cash / current_price
if shares >= unit:
print("buying %d" % unit)
o = order(g.security, unit)
o = get_orders()[o]
g.last_buy_price = float(o.price)
g.current_units += 1
g.today_units += 1
return True
return False
def addin(current_price, cash, unit):
if current_price >= g.last_buy_price + 0.5 * g.current_N:
shares = cash / current_price
if shares >= unit:
print("adding %d" % unit)
o = order(g.security, unit)
o = get_orders()[o]
g.last_buy_price = float(o.price)
g.current_units += 1
g.today_units += 1
return True
return False
def sell(current_price):
price = attribute_history(g.security, g.out_day, '1d', ('close',))
if current_price < min(price['close']):
print("selling")
order_target(g.security, 0)
g.current_units = g.today_units
return True
return False
def stop_loss(current_price):
if current_price < g.last_buy_price - 2 * g.current_N:
print("stop loss")
order_target(g.security, 0)
g.current_units = g.today_units
return True
return False
if __name__ == '__main__':
run_main()