小白量化《穿云箭集群量化》(7) 巡航导弹策略
量化交易策略比较有名的是网格策略,网格策略的缺点是对网格定义不容易,另外通过网格穿越交易也不是最优价格。
穿云箭量化平台提供了巡航导弹策略,可以利用巡航导弹技术自动实现买卖交易。巡航导弹技术本质上是价格漂移跟踪技术,能够自动识别股价移动方向,及时发出多空信号。它客服了人的 贪婪和恐惧,聪明的投资者利用穿云箭量化的巡航导弹技术,选择一个优质股票池,交给穿云箭量化的巡航导弹策略自动交易赚钱,轻松实现自己的资产增值。
在穿云箭量化中有一个超级订单SuperOrder功能。
##超级动态跟踪挂单
class SuperOrder():
def __init__(self,gap=1.5,ld=3,lk=3):
pass
'''
kind种类,code代码,price价格,volume数量,
kind=0 #买多,固定价格
kind=1 #卖空,固定价格
kind=2 #买多,浮动价格
kind=3 #卖空,浮动价格
x是正涨幅
y是负涨幅
'''
def add(self,code="",kind=0,price=1.00,volume=100,magic=0,\
sl=-99999,tp=-99999,comment='',stop=99999,t=99999,\
x=0.05,y=-0.05,d=0.0,p=0.0):
pass
对于股票,这里主要使用kind=2
kind=2 #买多,浮动价格
x=0.05 #上涨偏移
通过设置上涨偏移,实现动态买入信号,
卖出继续采用回撤止盈函数,动态卖出。
下面给出回测版本的完整策略。
注意:穿云箭量化使用的中文Python,可直接使用中文Python关键字。
策略名='回测_中文巡航导弹'
#修改日期:2022-11-05
导入 pandas 命名为 pd
导入 HP_tdx 命名为 htdx
导入 HP_global 命名为 hg #建立全局数据域hg
从 HP_formula 导入 *
导入 HP_formula 命名为 gs
从 HP_factor 导入 *
导入 HP_factor 命名为 hf
导入 HP_quant 命名为 hpq
从 HP_quant 导入 *
导入 time
#巡航导弹
cruise_missile=hf.SuperOrder()
函数 初始化(context):
context.zh='xiaobai' #账户
context.zhlx='回测' #账户类型,2个汉字
context.firstcash=2000000.00 #初始现金
context.cash=context.firstcash
context.portfolio.available_cash=context.firstcash
set_maxdays(300)
# 设置我们要操作的股票池
g.stocks=hpq.get_universe()
hpq.log.info('----策略环境信息-----')
hpq.log.info('量化模块版本: '+str(hpq.ver))
hpq.log.info('量化模块最后修改日期: '+str(hpq.mdate))
hpq.log.info('svrip: '+hpq.svrip)
hpq.log.info('svrport: '+str(hpq.svrport))
hpq.log.info('\n----开始运行策略-----\n')
hpq.log.info('策略名:'+策略名)
qhcsj2=time.strftime('%Y%m%d %H:%M:%S')
hpq.log.info('开始运行时间:'+qhcsj2)
# 设定沪深300作为基准
set_benchmark((1,'000001'))
# 开启动态复权模式(真实价格)
set_option('use_real_price', 真)
#pop_universe([(1,'600861'),(0,'000517')]) #需要删除的股票代码池
hg.seemsg=假
g.stocks2=[] #被选池
htdx.TdxInit(ip='139.159.239.163',port=7709)
g.hd=0.005 #滑点比例
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
函数 盘中运行(context, data):
序列循环 m,security 在其中 context.universe[0]:
df=data[security].df
如果 len(df)<1:
继续
price = data[security].close
close=price
high= data[security].high
low= data[security].low
pre_close=data[security].pre_close #前收盘
acc_avg_cost = context.portfolio.positions[security].acc_avg_cost #买入成本价
amos=context.portfolio.positions[security].closeable_amount #可卖数量
amos2=context.portfolio.positions[security].total_amount #总数量
#如果可卖数量大于0,做止盈和止损处理
如果 amos>0:
sell=hf.autosell(security,price=price,cost=acc_avg_cost,withdraw=0.3,stoploss=-0.05,minp=0.05,t=999) #追踪收盘价
如果 sell==2: #止损
p5=round(price*(1-g.hd),2)
x=order_target(security,0,p=p5)
hpq.log.info(context.current_dt+ " 止损卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
cruise_missile.add(security,2,price)
否则如果 sell==1: #止盈
p5=round(price*(1-g.hd),2)
x=order_target(security,0,p=p5)
hpq.log.info(context.current_dt+ " 止盈卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
cruise_missile.add(security,2,price)
继续
否则如果 amos2>0 : #有持仓
继续
如果 不是 cruise_missile.isin(security,2):
cruise_missile.add(security,2,price)
继续
buy=cruise_missile.oncheck(security,2,price)
如果 buy==1:
price2=round(price*(1+g.hd),2)
x=order_target(security,1000,p=price2)
如果 x !=空:
hpq.log.info(context.current_dt+ " 买入: %s ,数量:%d,买入价格:%.2f,成交资金:%0.2f"%(security,x.amount,price,x.amount*price))
我们选取一个股票池,看看回测结果。
如果使用easytrader进行实盘交易,可以使用下面的程序代码。
策略名='交易_中文巡航导弹'
#修改日期:2022-11-05
导入 pandas 命名为 pd
导入 HP_tdx 命名为 htdx
导入 HP_global 命名为 hg #建立全局数据域hg
从 HP_formula 导入 *
导入 HP_formula 命名为 gs
从 HP_factor 导入 *
导入 HP_factor 命名为 hf
导入 HP_quant 命名为 hpq
从 HP_quant 导入 *
导入 time
导入 easytrader
##初始化同花顺软件
ths = easytrader.use('ths')
ths.connect( "C:\\同花顺软件\\同花顺\\xiadan.exe")
ths.enable_type_keys_for_editor()
#巡航导弹
cruise_missile=hf.SuperOrder()
函数 初始化(context):
#context.istest=True
context.zh='xiaobai' #账户
context.zhlx='回测' #账户类型,2个汉字
context.firstcash=2000000.00 #初始现金
context.cash=context.firstcash
context.portfolio.available_cash=context.firstcash
set_maxdays(300)
# 设置我们要操作的股票池
g.stocks=hpq.get_universe()
hpq.log.info('----策略环境信息-----')
hpq.log.info('量化模块版本: '+str(hpq.ver))
hpq.log.info('量化模块最后修改日期: '+str(hpq.mdate))
hpq.log.info('svrip: '+hpq.svrip)
hpq.log.info('svrport: '+str(hpq.svrport))
hpq.log.info('\n----开始运行策略-----\n')
hpq.log.info('策略名:'+策略名)
qhcsj2=time.strftime('%Y%m%d %H:%M:%S')
hpq.log.info('开始运行时间:'+qhcsj2)
# 设定沪深300作为基准
set_benchmark((1,'000001'))
# 开启动态复权模式(真实价格)
set_option('use_real_price', 真)
#pop_universe([(1,'600861'),(0,'000517')]) #需要删除的股票代码池
hg.seemsg=假
g.stocks2=[] #被选池
htdx.TdxInit(ip='139.159.239.163',port=7709)
g.hd=0.005 #滑点比例
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
函数 盘中运行(context, data):
序列循环 m,security 在其中 context.universe[0]:
df=data[security].df
如果 len(df)<1:
继续
price = data[security].close
close=price
high= data[security].high
low= data[security].low
pre_close=data[security].pre_close #前收盘
#value = context.portfolio.positions[security].value
acc_avg_cost = context.portfolio.positions[security].acc_avg_cost #买入成本价
amos=context.portfolio.positions[security].closeable_amount #可卖数量
amos2=context.portfolio.positions[security].total_amount #总数量
#如果可卖数量大于0,做止盈和止损处理
如果 amos>0:
#sell=hf.autosell(security,price=high,cost=acc_avg_cost,withdraw=0.3,stoploss=-0.05,minp=0.05,t=999) #追踪最高价
sell=hf.autosell(security,price=price,cost=acc_avg_cost,withdraw=0.3,stoploss=-0.05,minp=0.05,t=999) #追踪收盘价
如果 sell==2: #止损
p5=round(price*(1-g.hd),2)
x=order_target(security,0,p=p5)
hpq.log.info(context.current_dt+ " 止损卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
cruise_missile.add(security,2,price)
ths.buy(security, price=p5, amount=amos)
否则如果 sell==1: #止盈
p5=round(price*(1-g.hd),2)
x=order_target(security,0,p=p5)
hpq.log.info(context.current_dt+ " 止盈卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
cruise_missile.add(security,2,price)
ths.buy(security, price=p5, amount=amos)
继续
否则如果 amos2>0 : #有持仓
继续
如果 不是 cruise_missile.isin(security,2):
cruise_missile.add(security,2,price)
继续
buy=cruise_missile.oncheck(security,2,price)
如果 buy==1:
price2=round(price*(1+g.hd),2)
x=order_target(security,1000,p=price2)
ths.buy(security, price=price2, amount=1000)
如果 x !=空:
hpq.log.info(context.current_dt+ " 买入: %s ,数量:%d,买入价格:%.2f,成交资金:%0.2f"%(security,x.amount,price,x.amount*price))
中文Python穿云箭量化平台支持中文Python语法,提供了完整的Python股票软件开发源代码。新版本支持自编指标公式脚本编写策略回测,并有一键生成Python交易策略功能,提供多空雷达,抄底雷达,响尾蛇导弹,巡航到导弹等交易技术。提供期货行情,期货CTP接口,提供MT5交易接口,提供miniQMT接口,盈透TWS接口以及彩票模块。支持问财选股,支持语音报盘,微信通知等。用户可以根据自己需求设计出满足自己要求的 自动化交易工具。我们后面逐步介绍这些功能和技术。
超越自己是我的每一步!我的进步就是你的进步!