开云kaiyun stock='600031'-买球软件下载

发布日期:2025-12-20 02:29    点击次数:82


开云kaiyun stock='600031'-买球软件下载

开云kaiyun 搭建经过

每个往复者都应该酿成一套我方的往复系统开云kaiyun。

好多往复者也明晰知说念,搭建我方往复系统的紧迫性。实验中,从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已出炉评释

本站仅提供存储做事,扫数本体均由用户发布,如发现存害或侵权本体,请点击举报。




Powered by 买球软件下载 @2013-2022 RSS地图 HTML地图

栏目分类

热点资讯

相关资讯