IntradayOrder
IntradayOrder
class IntradayOrder(ba.Order):
def __init__(self, ohlc, ind, key=None):
super().__init__(ohlc, ind)
self.key = key # 'o2c_wk1'
self.algo_remark = 'algo description '
def send_bnh(self):
'''
bnh买入一直持策略. '''
'''
Examples:
>>> bb = bamboo.Bamboo()
>>> bb.load(cfg.code)
>>> bb.indicator()
>>> order=SubOrder(bb)
>>> bb.orders = order.send_bnh(); bb.algo_remark +=order.algo_remark
>>> bb.execute('bnh', (0, None), plot=True)
'''
self.algo_remark = self.send_bnh.__doc__
df = self.ohlc.copy()
orders = [] #pd.DataFrame()
ut.log('Start getting signal iteration...')
for i,row in enumerate(df.itertuples()):
date, open_, close = row.Index, row.open, row.close; _=open_
if i==0:
# orders.append(self.set_b(date, '9:25', close, 1, 1.0))
orders.append(self.set_b(date, '14:55', close, 1, 1.0))
orders.append(self.set_c(date, close))
else:
if i%500==0: print(f'i ={i:5d}')
if i==len(df)-1:
orders.append(self.set_s(date, '14:55', close, -1, 1.))
orders.append(self.set_c(date, close))
else:
orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
def send_o2c_wk1(self):
'''o2c_wk1 日内收益, 只做星期一的日内收益, 开盘买收盘卖 '''
'''
# 1. load_bb加载数据 2. indicator_bb计算指标 3. order运行算法 4. bb模拟交易
>>> ohlc = ut.load_bb(cfg);
>>> ind = ut.indicator_bb(cfg, ohlc); _=ind
>>> # ut.draw1_bnh(cfg, ind)
# 3.1. 下单器实例化/初始化得到 下单器实例(order)
# 3.2. 下单器运行算法(algorithm)/交易模型得到交易指令(orders)
# 4.1. 回测引擎实例化得到: 回测(bb)
# 4.2. 往bb里添加order
# 4.3 bb执行交易指令得到:
# 模拟交割单 (bb.account)
# 模拟对账单 (bb.accounteod)
# 模拟交易信号(bb.signal)
>>> order = SubOrder(ohlc, ind);
orders = order.send_o2c_wk1()
bb=ba.Bamboo()
bb.add_order(order)
bb.execute( (0,None,None), debug=True, )
# 检查交易信号, 是否与星期一对应
print(bb.signal[bb.key].bs_sig.tail(20))
print(order.ind.weekday.tail(20))
haveJG = bb.account[bb.key]['op'] !=0
jgd = bb.account[bb.key][haveJG] # 交割单
'''
self.key = 'o2c_wk1'
self.algo_remark = self.send_o2c_wk1.__doc__
df = self.ind.copy()
orders = []
ut.log('Start send orders ...')
for i, row in enumerate(df.itertuples()):
date, open_, close, weekday = \
row.Index, row.open, row.close, row.weekday; _=open_
if i%500==0: print(f'i ={i:5d}')
if weekday==1:
orders.append(self.set_b(date, '9:25', open_, 1, 1.0))
orders.append(self.set_s(date, '14:55', close, -1, 1.0))
orders.append(self.set_c(date, close))
else:
orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
def send_bosc(self):
'''boscd算法: 开盘买入收盘卖出, on each day (回避隔夜收益)'''
'''
'''
self.key = 'bosc'
self.algo_remark = self.send_bosc.__doc__
df = self.ind.copy()
orders = [] #pd.DataFrame()
ut.log('Start sending orders ...')
# pos=0
for i,row in enumerate(df.itertuples()):
date, open_, close, pweekday, nweekday, weekday = \
row.Index, row.open, row.close, \
row.pweekday, row.nweekday, row.weekday; _=open_
_=(pweekday, nweekday)
if i%500==0: print(f'i ={i:5d}')
orders.append(self.set_b(date, '9:25', open_, 1, 1.0))
orders.append(self.set_s(date, '14:55', close, -1, 1.))
orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
def send_boscdel4(self):
'''boscdel4算法: 开盘买入收盘卖出, 并且保证周四空仓'''
'''
'''
self.key = 'boscdel4'
self.algo_remark = self.send_boscdel4.__doc__
df = self.ind.copy()
orders = [] #pd.DataFrame()
ut.log('Start sending orders ...')
# pos=0
for i,row in enumerate(df.itertuples()):
date, open_, close, pweekday, nweekday, weekday = \
row.Index, row.open, row.close, \
row.pweekday, row.nweekday, row.weekday; _=open_
_=(pweekday, nweekday)
if i%500==0: print(f'i ={i:5d}')
everyday = weekday in [1,2,3,4,5]
if everyday:
if weekday!=4: # buy at open
orders.append(self.set_b(date, '9:25', open_, 1, 1.0))
orders.append(self.set_s(date, '14:55', close, -1, 1.))
orders.append(self.set_c(date, close))
else:
orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
def send_bo100sc50del4(self):
'''bo100sc50del4算法:
开盘时: 如果空仓就买半仓; 半仓时就买全仓
收盘时: 如果满仓就卖掉半仓
保证周四空仓'''
'''
'''
self.key = 'bo100sc50del4'
self.algo_remark = self.send_bo100sc50del4.__doc__
df = self.ind.copy()
orders = [] #pd.DataFrame()
ut.log('Start sending orders ...')
pos=0
for i,row in enumerate(df.itertuples()):
date, open_, close, pweekday, nweekday, weekday = \
row.Index, row.open, row.close, \
row.pweekday, row.nweekday, row.weekday; _=open_
_=(pweekday, nweekday)
if i%500==0: print(f'i ={i:5d}')
everyday = weekday in [1,2,3,4,5]
if everyday:
if weekday!=4: # buy at open
if pos==0:
orders.append(self.set_b(date, '9:25', open_, 1, 0.5))
pos += 0.5
orders.append(self.set_c(date, close))
elif pos==0.5:
orders.append(self.set_b(date, '9:25', open_, 1, 1.0))
orders.append(self.set_s(date, '14:55', close, -1, 0.5))
pos = 0.5
orders.append(self.set_c(date, close))
elif pos==1:
assert False, f'{date} 为什么这天是满仓的???'
else:
orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
def send_bo100sc50del4_bbi(self):
'''bo100sc50del4_bbi算法:
开盘时: 如果空仓就买半仓; 半仓时就买全仓
收盘时: 如果满仓就卖掉半仓
保证周四空仓
牛市里(bbi=True)遵从上述规格, 熊市(bbi=False)里空仓'''
'''
'''
self.key = 'bo100sc50del4_bbi'
self.algo_remark = self.send_bo100sc50del4_bbi.__doc__
df = self.ind.copy()
orders = [] #pd.DataFrame()
ut.log('Start sending orders ...')
pos=0
for i,row in enumerate(df.itertuples()):
date, open_, close, bbi1, bbi, weekday = \
row.Index, row.open, row.close, \
row.bbi1, row.bbi, row.weekday; _=open_
# _=(pweekday, )
if i%500==0: print(f'i ={i:5d}')
# everyday = weekday in [1,2,3,4,5]; _=everyday
# if everyday:
if weekday!=4: # buy at open
# if bbi: # bull
if bbi1: # bull # 昨天是牛市
if pos==0:
# 如果利用bbi指标确定了当日是牛市,
# 下面发送指令的方法是错误的, 因为用到了当天的未来数据(开盘价)
# orders.append(self.set_b(date, '9:25', open_, 1, 0.5))
# 如果利用bbi1指标(延迟一天)确定了当日是牛市,
# 同样的发送指令的方法就是没问题的, 因为前提条件里没有引用未来数据.
# orders.append(self.set_b(date, '9:25', open_, 1, 0.5))
# 内在的逻辑是这样的:
# 发送指令时如果用到了右侧数据(包括前提条件), 就是引用了未来数据.
# 发送指令时如果没有到右侧数据(包括前提条件), 就是正逻辑.
# orders.append(self.set_b(date, '14:55', close, 1, 1.0))
# pos += 1 # 1
# orders.append(self.set_c(date, close))
orders.append(self.set_b(date, '9:25', open_, 1, 0.5))
pos += 0.5 # 1
orders.append(self.set_c(date, close))
elif pos==0.5:
orders.append(self.set_b(date, '9:25', open_, 1, 1.0))
orders.append(self.set_s(date, '14:55', close, -1, 0.5))
pos = 0.5
orders.append(self.set_c(date, close))
elif pos==1:
assert False, f'{date} 为什么这天是满仓的???'
else: # bear market
# 进入熊市的判断结果是利用了延迟的收盘价(bbi1),
# 所以卖出指令可以在当日的开盘价发出.
if pos>0:
orders.append(self.set_s(date, '9.25', open_, -1, 1.0))
# orders.append(self.set_s(date, '14:55', close, -1, 1))
pos=0
orders.append(self.set_c(date, close))
else:
# 熊市前提下, 如果空仓 ==> check close price
orders.append(self.set_c(date, close))
else: # weekday == 4, 不参与,
# 可以在开盘价卖出(因为星期四是可以提前知道的)
if pos>0:
orders.append(self.set_s(date, '9:25', open_, -1, 1.0))
pos=0
orders.append(self.set_c(date, close))
else:
orders.append(self.set_c(date, close))
# orders.append(self.set_c(date, close))
self.orders = pd.DataFrame(orders, columns=self.columns)
ut.log('orders 订单 存属 in Order实例')
return self.orders
duanqs