QAStrategy 股票分钟回测 配对交易、定时交易、排序选股 案例
发布于 1 个月前 作者 vensentzhou 266 次浏览 来自 分享

很多群友是从聚宽等量化平台开始了解量化交易,从而学习QA的(我就是^_^),习惯了量化交易平台的定时运行,排序选股。QA可以吗?当然。天神的QA给了极大的自由度,让交易者尽情发挥自己的想象。闲来无事,做了一个demo,权当练手。 ··· import QUANTAXIS as QA from QAStrategy.qastockbase import QAStrategyStockBase import pandas as pd from QUANTAXIS.QAUtil.QAParameter import MARKET_TYPE import pymongo from qaenv import (eventmq_amqp, eventmq_ip, eventmq_password, eventmq_port, eventmq_username, mongo_ip, mongo_uri)

class Strategy(QAStrategyStockBase):

def on_bar(self,data):
  
    if len(self.get_current_marketdata())==len(self.code) and str(self.market_datetime[-1])[11:]=='14:30:00':
        print('当前时间:')
        print(self.market_datetime[-1])
        
        df=QA.QA_DataStruct_Stock_min(self.market_data)
     
        ind=df.add_func(select_stock)
        
        time_data=ind[-len(self.code):].sort_values(by='change')
        print(time_data)
        code=time_data.iloc[-1].name[1]
        print('排名第一的是:',code)
        price=self.get_current_marketdata().loc[(slice(None),time_data.iloc[-1].name[1]),'close'][0]
        print('价格为:',price)
        print('排序最大值:')
        print(time_data.max()[0])
        if time_data.max()[0]>0:
            if len(self.acc.hold_available)==0:# 如果没有持仓,买入排名第一的股票
                self.send_order('BUY','OPEN',code=code,price=price,volume=1000)
            elif self.acc.get_position(code).volume_long !=0:#如果持仓标的继续排名第一,则继续持有
                print('持仓标的持续强势,继续持有!')
            else:
                temp_s=self.acc.hold_available
                code_sell=temp_s.index[0]
                print(code_sell)
                price_sell=self.get_current_marketdata().loc[(slice(None),code_sell),'close'][0]
                print('卖出持仓,买入强势股')
                self.send_order('SELL','CLOSE',code=code_sell,price=price_sell,volume=int(temp_s.loc[code_sell]))#卖出的时候 数量要加int
                self.send_order('BUY','OPEN',code=code,price=price,volume=1000)
        else:
            if len(self.acc.hold_available)!=0:# 如果有持仓,卖出所有的股票
                temp_s=self.acc.hold_available
                code_sell=temp_s.index[0]
                print(code_sell)
                price_sell=self.get_current_marketdata().loc[(slice(None),code_sell),'close'][0]
                print('所有标的均下跌,清仓!!!!')
                self.send_order('SELL','CLOSE',code=code_sell,price=price_sell,volume=int(temp_s.loc[code_sell]))#卖出的时候 数量要加int
            else:
                print('所有标的均下跌,暂不买入')

··· ··· def select_stock(data): close=data.close change=close.pct_change(14) #change2=(close-close.shift(4))/close.shift(4) return(pd.DataFrame({‘change’:change}))

code=[ '600887','002084']

s=Strategy(code=code, frequence=‘30min’, start=‘2019-07-01’, end=‘2019-07-16’,market_type=MARKET_TYPE.STOCK_CN, strategy_id=‘stock_rank_30min’) data=QA.QA_fetch_stock_min_adv(code,‘2019-06-25’,‘2019-06-30’,‘30min’).data s._market_data=[data.iloc[i] for i in range(len(data))] s.run_backtest() ··· 策略很滥,权当抛砖,群友清拍。

回到顶部