哪些股票推荐值得关注 15天搭建ETF量化往还系统Day11—miniQMT自动往还真香!

发布日期:2024-12-05 11:32    点击次数:132

哪些股票推荐值得关注 15天搭建ETF量化往还系统Day11—miniQMT自动往还真香!

搭建经由

每个往还者齐应该变成一套我方的往还系统。

许多往还者也明晰知说念,搭建我方往还系统的热切性。现实中,从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畅通如下:15天搭建ETF量化往还系统Day8—强化自动往还模块

DAY9畅通如下:15天搭建ETF量化往还系统Day9—玩大A必学网格政策

DAY10畅通如下:15天搭建ETF量化往还系统Day10—借用网格想想作念仓位处罚

之前DAY6咱们一经买通自动往还方法,接管的决议是使用easytrader库搭建腹地自动往还环境,然后用要领自动操作同花顺往还客户端下单。

不外这个属于弧线救国的决议,永久运行并不舒服。在宇宙的浓烈保举下,咱们决定使用正规的量化往还平台看成下单的临了方法——QMT!

接口先容
QMT(Quantitative Market Trading)是迅投公司开发的量化往还软件,专供券商采购,当今个东说念主投资者也可恳求使用。

MiniQMT 是 QMT 的简化版,扩张完安设经由这两个就齐有了。

MiniQMT的克己是咱们不错用我方的量化系统框架,告成向券商发送下单信息。

MiniQMT 提供了一个 XtQuant 的 Python 库,不错 import 它并调用它的方法下单。

XtQuant 目下不可通过 pip 安设,不错下载后放在Python第三方库目次下。

MiniQMT 的下单信息流向如下。

图片

在Python实盘代码中import xtquant,通过xtquant库提供的方法下单(提前怒放miniQMT),miniQMT 的桌面哄骗接管到xtquant库发出的下单请求,miniQMT 将下单信息发送给券商的往还功绩器。

图片

功能已毕

接下来,咱们用miniQMT接口来代替之前easytrader已毕的接口,何况把往还的功能封装成一个类,以供系统合座的调用。

类名为QmtTrader,其中包括了“纠合客户端”、“获得资金现象”、“获安妥前仓位”、“查询当日成交”、“买入”、“卖出”等方法。

class QmtTrader: def __init__(self,path= r'C:\国金QMT往还端\userdata_mini', account='xxxxxx', account_type='STOCK', is_slippage=True, slippage=0.01) -> None: ''' 简化版的qmt_trder率性宇宙作念政策的开发类的剿袭 ''' self.xt_trader='' self.acc='' self.path=path self.session_id=int(self.random_session_id()) self.account=account self.account_type=account_type if is_slippage==True: self.slippage=slippage else: self.slippage=0 def random_session_id(self): ''' 立时id ''' session_id='' for i in range(0,9): session_id+=str(random.randint(1,9)) return session_id def connect(self): ''' 纠合 path qmt userdata_min是旅途 session_id 账户的标记,冒昧 account账户, account_type账户内类型 ''' print('驱动畅通QMT...') # path为mini qmt客户端安设目次下userdata_mini旅途 path = self.path # session_id为会话编号,政策使用方关于不同的Python政策需要使用不同的会话编号 session_id = self.session_id xt_trader = XtQuantTrader(path, session_id) # 创建资金账号为1000000365的证券账号对象 account=self.account account_type=self.account_type acc = StockAccount(account_id=account, account_type=account_type) # 启动往还线程 xt_trader.start() # 开辟往还纠合,复返0示意纠合得胜 connect_result = xt_trader.connect() if connect_result==0: self.xt_trader=xt_trader self.acc=acc print('QMT纠合得胜!') else: print('QMT纠合失败!') def get_position(self): ''' 查询账户所有的持仓 ''' positions = self.xt_trader.query_stock_positions(self.acc) print('持仓数目:', len(positions)) data=pd.DataFrame() if len(positions) != 0: for i in range(len(positions)): df=pd.DataFrame() df['账号类型']=[positions[i].account_type] df['资金账号']=[positions[i].account_id] df['证券代码']=[positions[i].stock_code] df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6]) df['持仓数目']=[positions[i].volume] df['可用数目']=[positions[i].can_use_volume] df['平均建仓老本']=[positions[i].open_price] df['市值']=[positions[i].market_value] data=pd.concat([data,df],ignore_index=True) return data else: print('莫得持股') df=pd.DataFrame() df['账号类型']=[None] df['资金账号']=[None] df['证券代码']=[None] df['持仓数目']=[None] df['可用数目']=[None] df['平均建仓老本']=[None] df['市值']=[None] return df def get_balance(self): ''' 复返面前证券账号的财富数据 ''' asset = self.xt_trader.query_stock_asset(account=self.acc) data_dict={} if asset: data_dict['账号类型']=asset.account_type data_dict['资金账户']=asset.account_id data_dict['可用金额']=asset.cash data_dict['冻结金额']=asset.frozen_cash data_dict['持仓市值']=asset.market_value data_dict['总财富']=asset.total_asset return data_dict else: print('获得失败资金') data_dict['账号类型']=[None] data_dict['资金账户']=[None] data_dict['可用金额']=[None] data_dict['冻结金额']=[None] data_dict['持仓市值']=[None] data_dict['总财富']=[None] return data_dict def today_trades(self): ''' 当日成交 ''' trades = self.xt_trader.query_stock_trades(self.acc) print('成交数目:', len(trades)) data=pd.DataFrame() if len(trades) != 0: for i in range(len(trades)): df=pd.DataFrame() df['账号类型']=[trades[i].account_type] df['资金账号']=[trades[i].account_id] df['证券代码']=[trades[i].stock_code] df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6]) df['拜托类型']=[trades[i].order_type] df['成交编号']=[trades[i].traded_id] df['成交时候']=[trades[i].traded_time] df['成交均价']=[trades[i].traded_price] df['成交数目']=[trades[i].traded_volume] df['成交金额']=[trades[i].traded_amount] df['订单编号']=[trades[i].order_id] df['柜台协议编号']=[trades[i].order_sysid] df['政策称呼']=[trades[i].strategy_name] df['拜托备注']=[trades[i].order_remark] data=pd.concat([data,df],ignore_index=True) data['成交时候']=pd.to_datetime(data['成交时候'],unit='s') return data def today_entrusts(self): ''' 当日拜托 :param account: 证券账号 :param cancelable_only: 仅查询可撤拜托 :return: 复返当日所有拜托的拜托对象构成的list ''' orders = self.xt_trader.query_stock_orders(self.acc) print('拜托数目', len(orders)) data=pd.DataFrame() if len(orders) != 0: for i in range(len(orders)): df=pd.DataFrame() df['账号类型']=[orders[i].account_type] df['资金账号']=[orders[i].account_id] df['证券代码']=[orders[i].stock_code] df['证券代码']=df['证券代码'].apply(lambda x:str(x)[:6]) df['订单编号']=[orders[i].order_id] df['柜台协议编号']=[orders[i].order_sysid] df['报单时候']=[orders[i].order_time] df['拜托类型']=[orders[i].order_type] df['拜托数目']=[orders[i].order_volume] df['报价类型']=[orders[i].price_type] df['拜托价钱']=[orders[i].price] df['成交数目']=[orders[i].traded_volume] df['成交均价']=[orders[i].traded_price] df['拜托状态']=[orders[i].order_status] df['拜托状态形容']=[orders[i].status_msg] df['政策称呼']=[orders[i].strategy_name] df['拜托备注']=[orders[i].order_remark] data=pd.concat([data,df],ignore_index=True) data['报单时候']=pd.to_datetime(data['报单时候'],unit='s') return data else: print('目下莫得拜托') return data def check_stock_is_av_buy(self, stock='600031', price=17.70, amount=10, hold_limit=100000): ''' 查验是否不错买入 ''' hold_stock=self.get_position() try: del hold_stock['Unnamed: 0'] except: pass account=self.get_balance() try: del account['Unnamed: 0'] except: pass #买入是价值 value=price*amount cash=account['可用金额'] frozen_cash=account['冻结金额'] market_value=account['持仓市值'] total_asset=account['总财富'] if cash>=value: print('允许买入{} 可用现款{}大于买入金额{} 价钱{} 数目{}'.format(stock,cash,value,price,amount)) return True else: print('不允许买入{} 可用现款{}小于买入金额{} 价钱{} 数目{}'.format(stock,cash,value,price,amount)) return False def check_stock_is_av_sell(self, stock='600031', amount=10): ''' 查验是否不错卖出 ''' hold_data=self.get_position() try: del hold_data['Unnamed: 0'] except: pass account=self.get_balance() try: del account['Unnamed: 0'] except: pass cash=account['可用金额'] frozen_cash=account['冻结金额'] market_value=account['持仓市值'] total_asset=account['总财富'] stock_list=hold_data['证券代码'].tolist() if stock in stock_list: hold_num=hold_data[hold_data['证券代码']==stock]['可用余额'] if hold_num>=amount: print('允许卖出:{} 持股{} 卖出{}'.format(stock,hold_num,amount)) return True else: print('不允许卖出持股不及:{} 持股{} 卖出{}'.format(stock,hold_num,amount)) return False else: print('不允许卖出莫得持股:{} 持股{} 卖出{}'.format(stock,0,amount)) return False def make_buy(self, security='600031.SH', amount=100, price=20, strategy_name='', order_remark=''): ''' 单独孤独股票买入函数 ''' order_type=xtconstant.STOCK_BUY if price == 0: price_type=xtconstant.LATEST_PRICE else: price_type=xtconstant.FIX_PRICE order_volume=amount # 使用指订价下单,接口复返订单编号,后续不错用于撤单操作以及查询拜托状态 if order_volume>0: fix_result_order_id = self.xt_trader.order_stock(account=self.acc,stock_code=security, order_type=order_type, order_volume=order_volume, price_type=price_type, price=price, strategy_name=strategy_name, order_remark=order_remark) print('往还类型{} 代码{} 价钱{} 数目{} 订单编号{}'.format(order_type, security, price,order_volume,fix_result_order_id)) return fix_result_order_id else: print('买入 见识{} 价钱{} 拜托数目{}小于0有问题'.format(security, price, order_volume)) def make_sell(self,security='600031.SH', amount=100, price=20, strategy_name='', order_remark=''): ''' 单独孤独股票卖出函数 ''' order_type=xtconstant.STOCK_SELL if price == 0: price_type=xtconstant.LATEST_PRICE else: price_type=xtconstant.FIX_PRICE order_volume=amount # 使用指订价下单,接口复返订单编号,后续不错用于撤单操作以及查询拜托状态 if order_volume>0: fix_result_order_id = self.xt_trader.order_stock(account=self.acc,stock_code=security, order_type=order_type, order_volume=order_volume, price_type=price_type, price=price, strategy_name=strategy_name, order_remark=order_remark) print('往还类型{} 代码{} 价钱{} 数目{} 订单编号{}'.format(order_type,security,price,order_volume,fix_result_order_id)) return fix_result_order_id else:            print('卖出 见识{} 价钱{} 拜托数目{}小于0有问题'.format(stock_code,price,order_volume))替换接口

接下来,咱们在”Day7—全自动化往还系统“基础上替换新的往还接口。

比如“量化机器东说念主”监测到有ETF安妥买入要求时,查询往还账户是否有敷裕的资金能买入。当账户余额充足时,则立即以面前价钱买入。

if self.qmt.check_stock_is_av_buy(code, df_index_data['close'][-1], 1000, 5000) == True:  self.qmt.make_buy(code, df_index_data['close'][-1], 1000)

比如“量化机器东说念主”监测到有ETF安妥卖出要求时,查询往还账户是否有仓位要卖出。当账户有持有的仓位时,则立即以面前价钱卖出。

if self.qmt.check_stock_is_av_sell(code, 100) == True: self.qmt.make_sell(code, df_index_data['close'][-1], 2000)追思

已毕了自动下单这个方法之后,接下去咱们不错宽心性接洽政策,打造着实真谛上闭环的量化往还系统,全自动化往还。

如何获得QMT安设包和开户不错看这篇先容:量化往还自动下单决议—对接QMT已出炉评释

本站仅提供存储功绩,所有施行均由用户发布,如发现存害或侵权施行,请点击举报。