文档
测试

国信-我的策略代码

POST

国信平台,打板代码示例

```python #encoding:gbk ''' 本策略事先设定好交易的股票篮子,然后根据指数的CCI指标来判断超买和超卖 当有超买和超卖发生时,交易事先设定好的股票篮子 ''' import pandas as pd import numpy as np import talib import time ######################PD 格式设置########################### pd.set_option('expand_frame_repr', False) # 不换行 pd.set_option('display.max_rows', 5000) # 最多显示数据的行数 pd.set_option('display.unicode.ambiguous_as_wide', True) # 中文字段对齐 pd.set_option('display.unicode.east_asian_width', True) pd.set_option('display.float_format', lambda x: '%.2f' % x) ########################################################## # ####################参数配置说明########################### # real 1:实盘 0:模拟帐号 # log 1:打印日记 0:不打印日记 # scale 仓位控制 开仓数据为 1/scale 数值越大,开仓越小 # buy_num 买入一支股票,是否分几次买入 ########################################################### class Tool(): def __init__(self,ContextInfo): self.g = ContextInfo print('自定义工具类') def log(self,*args): # log 为用户输入参数 if log: print(*args) def readStockInfo(self,st): # 读取个股的基本信息 start_time = self.g.get_open_date(st) #detail CreateDate:上市日期 ,FloatVolumn:流通股本,TotalVolumn:总股本 detail = self.g.get_instrumentdetail(st) data={} data['code']=st data['start_time']=str(detail['CreateDate']) data['FloatVolumn']=np.int64(detail['FloatVolumn']) data['TotalVolumn']=np.int64(detail['TotalVolumn']) series = pd.Series(data) self.g.stockinfo[st]=series #return series def readMyStock(self,bkname): # 读取自选股列表 self.g.trade_code_list = self.g.get_stock_list_in_sector(bkname) self.g.set_universe(self.g.trade_code_list) self.g.stock_count= len(self.g.trade_code_list) def readStockData(self,columns=['close','open','high','low','volume','settle'],per='1d',size=10): # 读取股票行情数据 self.g.df = self.g.get_market_data(columns,stock_code =self.g.trade_code_list,skip_paused = True, period = per, dividend_type = 'front',count=size) def readStockDataTick(self): #读取列表中的股票的盘口数据 self.g.df_tick = self.g.get_full_tick(self.g.trade_code_list) self.log(type(self.g.df_tick)) def doRead(self,bkname): self.readMyStock(bkname) if self.g.stock_count == 0: print('当前板块没有数据,请添加股票到板块列表中!') self.g.df_type = 0 return #读取股票的盘口数据 self.readStockDataTick() #读取股票的行情数据 self.readStockData() self.log('行情数据:',type(self.g.df)) if isinstance(self.g.df,pd.DataFrame): self.log('DF 数据格式为DataFrame') self.g.df_type = 1 return elif isinstance(self.g.df,pd.Panel): self.log('DF 数据格式为Panel') self.g.df_type = 2 return else: self.g.df_type = 0 return def formatDf(self,st,df): # 个股数据的格式化 df_infos = self.g.stockinfo if st not in df_infos.columns: self.readStockInfo(st) if st not in df_infos.columns: return stock_info = self.g.stockinfo[st] self.log('info:',stock_info) #计算涨跌停价 bd = 0.1 code = int(st.split('.')[0]) nc = code // 100000 if nc == 3: bd =0.2 elif nc == 6: nc = code //10000 if nc == 68: bd = 0.2 #bd值为股票的涨跌幅限制 创业板、科创板为0.2 其余的为0.1 # 格式化数据 df['old_close']=df['close'].shift(1) #求出今天的 开盘价震幅 df['open_offset'] = (df['open']-df['old_close'])*100/df['old_close'] #求出当前收盘价 是否接近涨停 df['now_offset'] = (df['close']-df['old_close'])*100/df['old_close'] # 算出每天的 涨停价 df['top']=df['old_close']*(1+bd) df['top'] = df['top'].apply(lambda x:round(x,2)) # 算出每天的 跌停价 df['fail']=df['old_close']*(1-bd) df['fail'] = df['fail'].apply(lambda x:round(x,2)) #盘中 是否上摸涨停价 df['istop'] = df['top']==df['high'] #盘中 是否触及跌停价 df['isfail'] = df['low']==df['fail'] #当前收盘是否 涨停 df['istopnow'] = df['top']==df['close'] #当前收盘价是 跌停 df['isfailnow'] = df['low']==df['close'] #当前 K线换手率 df['hand'] = df['volume']/stock_info['FloatVolumn']*10000 #当前K线 是否红盘 - 股价一直在开盘价上方运行 df['isred'] = df['low']>=df['open'] #当前K线 是否为阳线 df['issun'] = df['close'] >= df['open'] return df def modelDb(self,st,df): # 判断当前股票是否符合打板条件 模型算法 符合条件返回 True 否则 False #取出该股票的盘口数据 #self.log(st,df) ndata = df.iloc[-1] self.log('当日实时数据',ndata) ndata = pd.Series(ndata) ndata['buy']=False tick = self.g.df_tick[st] sellPrice = tick['askPrice'] count = 0 for i in range(0,5): if sellPrice[i] == ndata['top']: count = i+1 break self.log('count=',count) if count == 0: return ndata if count <= offset and ndata['istop']: ndata['buy']=True ndata['buy_price']=sellPrice[count] return ndata def init(ContextInfo): #hs300成分股中sh和sz市场各自流通市值最大的前3只股票 ContextInfo.trade_code_list=[] ContextInfo.set_universe(ContextInfo.trade_code_list) ContextInfo.stock_count=0 ContextInfo.accID = '410038217334' ContextInfo.buy = True ContextInfo.sell = False #股票的实时行情数据 ContextInfo.df=None ContextInfo.df_type=0 #股票的实时盘口数据 ContextInfo.df_tick=None #ContextInfo.colums=['close','open','high','low','volume','settle'] ContextInfo.tick=0 #股票列表中个股的基本信息 ContextInfo.stockinfo=pd.DataFrame() # 自定义工具类 ContextInfo.tool = Tool(ContextInfo) # 设置定时器,执行自定义运行 5nSecond,,500nMilliSecond #ContextInfo.run_time("myHandlebar","5nSecond","2019-10-14 13:20:00","SH") def myHandlebar(g): #tool = g.tool #tool.doRead('我的自选') return # 自定义的交易函数 #ContextInfo.tick = ContextInfo.tick + 1 #print(ContextInfo.tick) #readData(ContextInfo) def handlebar(g): tool = g.tool #g.tool.formatFloat(1) if g.is_last_bar(): #为行情数据的格式,df_type 0:不处理 1:DataFrame 2:Panel df = None tool.doRead('我的自选') if g.df_type == 0: return if g.df_type==1: df = g.df st = g.trade_code_list[0] df = tool.formatDf(st,df) ndata = tool.modelDb(st,df) isbuy(g,st,ndata) elif g.df_type == 2: for st in g.trade_code_list: df = g.df[st] df = tool.formatDf(st,df) ndata =tool.modelDb(st,df) isbuy(g,st,ndata) def isbuy(g,st,ndata): #是否执行股票买入操作 print(ndata) if ndata['buy']: print('股票开仓:',st,ndata) pass ```