搭建过程
每个交易者都应该形成一套自己的交易系统。
很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从0到1往往是最难跨越的一步。
授人鱼不如授人以渔,为了帮助大家跨出搭建量化系统的第一步,我们决定推出这个主题系列。
这个系列中,我们用Python从0开始一步步搭建出一套ETF量化交易系统(选择ETF标的是因为对于普通交易者来说,ETF相对于选强势股难度要小,而且没有退市风险)。大家可以跟随着我们的实现路径来一起学习,从过程中掌握方法。
掌握了方法之后,你可以换成期货系统、比特币系统、美股系统,然后在实战中不断去完善自己的系统了。
搭建一套ETF量化交易系统涉及多个模块和组件的协同工作,包括数据源模块、量化策略模块、可视化模块、数据库模块、回测评估模块、自动交易模块等等。
DAY1链接如下:15天搭建ETF量化交易系统Day1—数据源模块
DAY2链接如下:15天搭建ETF量化交易系统Day2—图形显示模块
DAY3链接如下:15天搭建ETF量化交易系统Day3—上手经典回测框架
DAY4链接如下:15天搭建ETF量化交易系统Day4—玩转海龟交易策略
DAY5链接如下:15天搭建ETF量化交易系统Day5—打造实盘量化机器人
DAY6链接如下:15天搭建ETF量化交易系统Day6—打通同花顺自动交易
DAY7链接如下:15天搭建ETF量化交易系统Day7—全自动化交易系统
在量化系统自动交易时,我们已经实现了最基本的一些交易操作,比如:买入股票、卖出股票、查询当前账户、查询持仓个股等等。
但是,实际上有更复杂的场景,比如下单后无法成交等。
DAY8我们需要对“自动交易模块”增加一些扩展的功能来满足更复杂的需求。
扩展功能
在下单价格上叠加滑点。
在下单时,由于市场价格变动、流动性不足等各方面因素,会导致下单的价格和实际价格之间出现差异,这个就是所谓的滑点(Slippage) 。
比如,在快速上涨的市场中,下达买入订单时,当前价格已经上涨;在快速下跌的市场中,下达卖出订单时,当前价格已经下跌。
当然,滑点也有可能往自己有利的方向滑动,比如在波动较大的市场中,现价会低于下单的买入价格,或者高于下单的卖出价格。
因此,在进行实盘交易时,我们必须要关注滑点的影响。
我们提供设置滑点的接口:
def add_slippage(self, price=1.11, trader_type='buy'): '''
在价格基础上增加滑点
'''
if trader_type == 'buy':
price = price * (1+self.slippage)
else:
price = price * (1-self.slippage)
return price
检查是否是交易时间,未开盘、已收盘、周末时间不进行交易。
def check_is_trader_period(self):
'''
检测是不是交易时间
'''
cur_time = datetime.now() # 当前时间
start_time = datetime(cur_time.year, cur_time.month, cur_time.day, 9, 30)
end_time = datetime(cur_time.year, cur_time.month, cur_time.day, 15, 0)
if cur_time.weekday() >= 5: # 5代表星期六,6代表星期日
print(u"周末,时间{0}".format(cur_time.strftime("%Y-%m-%d_%H:%M:%S")))
return False
if (cur_time > start_time) and (cur_time < end_time) :
print(u"执行一次,时间{0}".format(cur_time.strftime("%Y-%m-%d_%H:%M:%S")))
return True
else:
print(u"休息一下,时间{0}".format(cur_time.strftime("%Y-%m-%d_%H:%M:%S")))
return False
检查是否有足够资金可以买入。当资金不足时需要考虑减少买入数量,或者选择价格更低的股票买入。
def check_stock_is_av_buy(self,stock='128036',price='156.700',amount=10, hold_limit=100):
'''
检查是否可以买入
'''
#stock=self.adjust_stock(stock=stock)
price=float(price)
buy_value=price*amount
cash_df=self.get_balance()
hold_data=self.get_position()
"篇幅有限,此处省略"
检查是否有足够仓位可以卖出。
def check_stock_is_av_sell(self,stock='128036',amount=10):
'''
检查是否可以卖出
'''
hold_data=self.get_position()
"篇幅有限,此处省略"
下单个股后,查询当日委托中个股的成交情况。每次下单后,首先要确认订单是否加入到委托列表中。其次要监测委托单是否已经成交。如果长时间无法成交,可以考虑是否要撤单,是否要修改交易单。
def check_entrusts_order(self, stock='513030', trader_type='买入'):
'''
检查委托单中个股成交情况
'''
df=self.today_entrusts()
if df.shape[0]>0:
df=df[df['证券代码']==stock]
if df.shape[0]>0:
df1=df[df['操作']==trader_type]
return true, df1
else:
print('{} 没有委托生成!'.format(stock))
return False,'{} 没有委托生成!'.format(stock)
else:
print('今日无委托单!')
return False,'今日无委托单!'
提交订单后,支持撤单。撤单时,可以一次全撤单,也可以根据合同编号把指定的委托单撤除。
def cancel_entrust(self, tarder_type='全撤'):
'''
撤单buy/sell 获取的 entrust_no
'''
self.user.refresh()
if tarder_type=='全撤':
self.user.cancel_all_entrusts()
else:
self.user.cancel_entrust(tarder_type)
一键清仓。一键清仓功能可以让我们在市场行情不利或达到预期收益时,迅速退出市场,避免进一步的损失或锁定收益。
def clear_all_position(self):
pass
"篇幅有限,此处省略"
封装成类
之前我们把基础交易的功能封装成一个类,以供系统整体的调用。类名为ThsTrader,其中包括了“连接客户端”、“获取资金状况”、“获取当前仓位”、“查询当日成交”、“买入”、“卖出”等方法。
接下来,我们把本期扩展的功能添加到这个类中,丰富类的功能。
class ThsTrader:
def __init__(self,
exe=r'C:\同花顺软件\同花顺\xiadan.exe',
tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract',
is_slippage=True,
slippage=0.01):
pass
def add_slippage(self, price=1.11, trader_type='buy'):
'''
在价格基础上增加滑点
'''
pass
def check_is_trader_period(self):
'''
检测是不是交易时间
'''
pass
def get_balance(self):
'''
获取资金状况
'''
pass
def get_position(self):
'''
获取持股
'''
pass
def clear_all_position(self):
'''
一键清仓
'''
pass
def today_trades(self):
'''
当日成交
'''
pass
def today_entrusts(self):
'''
当日委托
'''
pass
def cancel_entrust(self, tarder_type='全撤'):
'''
撤单buy/sell 获取的 entrust_no
'''
pass
def check_entrusts_order(self, stock='513030', trader_type='买入'):
'''
检查委托单中个股成交情况
'''
pass
def check_stock_is_av_sell(self,stock='128036',amount=10):
'''
检查是否可以卖出
'''
pass
def check_stock_is_av_buy(self,stock='128036',price='156.700',amount=10, hold_limit=100):
'''
检查是否可以买入
'''
pass
def make_buy(self, security='600031', price=16.5, amount=100):
pass
def make_sell(self, security='300780', price=14, amount=100):
pass
def connect(self, client='universal_client'):
pass
def exit(self):
'''
退出
'''
pass
总结
有了更强大的交易模块之后,我们的系统当然可以应对更复杂的交易场景了。接下来我们继续完善这个系统,打造一个可以赚钱的ETF交易系统。!
说明
此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。
想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!
非星球会员需要的话,需要单独联系我购买!
知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览