def __init__(self): # 费率和滑点 self.saveDetail = True # 是否保存明细 self.isEmptyUse = False # 是否清空记录 self.codeLists = ['JM', 'SM', 'V', 'I', 'AP', 'J','RB', 'SC', 'MA', 'JD','CU' , 'OI'] self.baseInfo = {} # k线时间 # self.klineTypeList = ['5m'] self.klineTypeList = ['15m', '30m'] self.widthDeltaLineList = [0.025] self.widthDeltaLine = 0 self.stopTimeLine = 5 self.widthTimesPeriodList = [3] self.testDays = 90 # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=0) self.total_tablename = 'train_total_1' self.detail_tablename = 'train_future_1' self.totalMethod = 'single' self.method = 'simTick' if self.isSimTickUse else 'quick' self.stage = 'single15' self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage self.isAll = 0
def __init__(self): self.saveDetail = True # 是否保存明细 self.topUse = False self.isEmptyUse = True # 是否清空记录 self.testDays = 10 self.processCount = 5 self.period = 14 self.bullwidth = 2 self.iniAmount = 50000 # 单边50万 # self.iniAmount = 2000000 * 0.0025 # 单边50万 self.stopLine = 2 self.klineList = ['3m', '5m'] # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=1) self.total_tablename = 'train_total_2' self.detail_tablename = 'train_future_2' self.uniform_tablename = 'future_uniform' self.method = 'hudge2' self.uidKey = "%s_%s_%s_" + self.method self.isAll = 0
def __init__(self): # 费率和滑点 self.saveDetail = False # 是否保存明细 self.isSimTickUse = False # 是否使用1分钟模拟tick测试,否则直接使用kline回测 self.topUse = False self.isEmptyUse = True # 是否情况记录 self.isKeeping = False self.baseInfo = {} self.periodList = [15, 30, 60] # 窗体参数 self.scaleList = [2.0] self.shiftScale = 0.527 # 滑点模拟系数 self.deltaLine = 0.8 # k线时间 self.klineTypeList = ['5m', '15m', '30m', '60m'] self.scaleDiff2List = [0.8] self.widthDeltaLineList = [0.1] self.stopTimeLineList = [0] self.widthDeltaLine = 0 self.scaleDiffList = [0.2] # 起始时间 self.startDate = public.getDate(diff=-200) # 60天数据回测 self.endDate = public.getDate() self.total_tablename = 'train_total_2' self.detail_tablename = 'train_future_2' self.method = 'simTick' if self.isSimTickUse else 'quick' self.stage = 'paird2' self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage
def __init__(self): self.period = '1d' self.pageCount =50 self.timePeriodsList = [60] self.timePeriods = 150 self.dropLineList = [1.0, 1.5] self.dropLine = 0.20 self.sarStartList = [0.02, 0.03, 0.04, 0.05] self.sarStart = 0.02 self.sarEndList = [0.02, 0.03, 0.04, 0.05] self.sarEnd = 0.05 self.iniAmount = 250000 self.shift = 0.002 self.ratio = 0.0006 self.atrDropLine = 2 self.saveMongo = True self.methodName = 'obv' self.startDate = public.getDate(diff=-200) # 60天数据回测 self.endDate = public.getDate(diff=0) self.iterCondList = ['timePeriods', 'dropLine', 'sarStart', 'sarEnd']
def __init__(self): self.codes = ['510050.XSHG'] self.klineType = '30m' self.klineTypeList = ['15m', '30m'] self.timePeriodsList = [15, 30, 60] self.timePeriods = 60 self.powlineList = [0.5] self.powline = 1.0 self.turnlineList = [1.5, 1.75, 2.0] self.turnline = 1.0 self.paramList = ['powline', 'turnline'] self.scaleDiff2 = 0.8 self.iniAmount = 40000 self.multiplier = 10000 self.ratio = 2 self.scale = 2.0 self.shift = 0.0005 self.index_list = ["MA"] self.startDate = public.getDate(diff=-360) # 60天数据回测 self.endDate = public.getDate(diff=0) self.method = 'bull4'
def iniShare(self, codes): if codes[0] not in self.shareDict: filename = self.Rice.basePath + '%s_%s.csv' % (codes[0], public.getDate()) if os.path.exists(filename): for code in codes: filename = self.Rice.basePath + '%s_%s.csv' % ( code, public.getDate()) self.shareDict[code] = pd.read_csv(filename, index_col=0, encoding='gb2312') else: dfs = self.Rice.kline(codes, period=self.period, pre=200) for code in codes: if code in dfs: # 删除前一日文件 filename_1 = self.Rice.basePath + '%s_%s.csv' % ( code, public.getDate(diff=-1)) if os.path.exists(filename_1): os.remove(filename_1) # 保存文件 filename = self.Rice.basePath + '%s_%s.csv' % ( code, public.getDate()) dfs[code].to_csv(filename) self.shareDict[code] = dfs[code] return self.shareDict
def __init__(self): self.period = '1d' self.pageCount = 50 self.timePeriodsList = [150] self.timePeriods = 150 self.dropLineList = [0.6] self.dropLine = 0.20 self.sarStartList = [0.02, 0.35, 0.05] self.sarStart = 0.02 self.sarEndList = [0.02, 0.35, 0.05] self.sarEnd = 0.05 self.iniAmount = 250000 self.shift = 0.002 self.ratio = 0.0006 self.saveMongo = False self.methodName = 'filter_5' self.startDate = public.getDate(diff=-300) # 60天数据回测 self.endDate = public.getDate(diff=0) self.iterCondList = ['timePeriods', 'dropLine', 'sarStart', 'sarEnd']
def __init__(self): super().__init__() # 费率和滑点 self.saveDetail = True # 是否保存明细 self.topUse = False self.isEmptyUse = True # 是否清空记录 self.testDays = 20 self.processCount = 5 self.iniAmount = 500000 # 单边50万 self.volcLineList = [4, 6] self.volcLine = 5 self.stopLine = 3 self.maxperiodList = [5, 15, 30] self.maxperiod = 5 self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'), ('IC', '399905.XSHE')] self.klineList = ['1m', '5m', '10m'] # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=0) self.total_tablename = 'train_total_0' self.detail_tablename = 'train_future_0' self.method = 'follow1' self.uidKey = "%s_%s_%s_%s_%s_" + self.method
def start(self, codes, main, time0, kt): print("子进程启动:", self.cindex, codes, kt, time.time() - time0) self.klineType = kt self.Record = stock_uniform() # 主力合约 self.Rice = interface_Rice() # 查询获得配置 - 费率和每手单量 if kt[-1] == 'm': self.startDate = public.getDate(diff=-200) else: self.startDate = public.getDate(diff=-1200) # 查询获得N分钟K线 dfs = self.Rice.kline(codes, period=self.klineType, start=self.startDate, end=self.endDate, pre=60) for rs in list(itertools.combinations(codes, 2)): if main not in rs: continue self.codes = rs doc = self.total(dfs, kt) if doc is not None: self.Record.insert(doc)
def __init__(self): # 费率和滑点 self.isEmptyUse = True # 是否清空记录 self.testDays = 20 self.processCount = 5 self.period = 14 self.bullwidth = 2 self.atrLineList = [2] self.bullLine = 3.5 self.atrLine = 2 self.bullLine = 3.5 self.iniAmount = 500000 # 单边50万 # self.iniAmount = 2000000 * 0.0025 # 单边50万 self.stopLine = 2 self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'), ('IC', '399905.XSHE')] self.klineList = ['1m'] # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=0) print(self.endDate) self.total_tablename = 'train_total_2' self.detail_tablename = 'train_future_2' self.method = 'fellow' self.uidKey = "%s_%s_%s_%s_%s_" + self.method self.isAll = 0
def kline(self, codes, period='1m', start=None, end=None, pre=200, type='future'): d = {} # 指数清单 # 提前日期 #start = self.getPreDate(period=period, num=pre, start=start) preDay = 1 if (pre == 0 or period == 'tick') else self.getPreDays( period, pre) # 开始日期 if start is None: start = public.getDate(diff=-preDay) else: start = public.getDate(diff=-preDay, start=start.split(' ')[0]) if end is None: end = public.getDate(diff=1) # 查询K线 if period.find('d') > -1 and len(codes) > 1: # 替换查询线 newCodes = self.alterCode(codes) res = rq.get_price(newCodes, frequency=period, start_date=start, end_date=end, adjust_type='pre') for c in newCodes: mc = c if not c in self.indexMap else self.indexMap[c] d[mc] = res.minor_xs(c) else: iMap = self.indexMap for c in codes: c0 = c1 = c if type == 'future': c0 = self.parseCode(c) c1 = iMap[c0] if c0 in iMap else c #print(c1) d[c] = d[c0] = rq.get_price(c1, frequency=period, start_date=start, end_date=end, adjust_type='pre') return d
def __init__(self): # 费率和滑点 super().__init__() self.saveDetail = True # 是否保存明细 self.savePoint = False self.isSimTickUse = False # 是否使用1分钟模拟tick测试,否则直接使用kline回测 self.topUse = False self.isEmptyUse = True self.baseInfo = {} #self.codeLists = ['JM', 'SM', 'V', 'I', 'AP', 'J', 'RB', 'SC', 'MA', 'JD', 'CU', 'OI', 'AU'] self.codeLists = ['SC', 'RB', 'FU', 'MA'] # 可变参数 self.periodList = [14] # 窗体参数 self.scaleList = [2] self.klineTypeList = ['15m'] self.widthTimesPeriodList = [3] self.superlineList = [2.0] self.powline = 0.25 self.turnlineList = [2] self.wdslineList = [] self.turnline = 1.5 self.paramList = ['superline'] self.shiftScale = 0.527 # 滑点模拟系数 self.scaleDiff2 = 0.8 self.scaleDiff = 0 self.processCount = 6 self.testDays = 90 self.adjustDates = [] # testCOun self.testCount = 300 self.testDays = 100 # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=0) self.total_tablename = 'train_total_1' self.detail_tablename = 'train_future_1' self.method = 'simTick' if self.isSimTickUse else 'quick' self.stage = 'jump' self.uidKey = "%s_%s_%s_%s_%s_" + self.method + "_" + self.stage # 切换全部计算 self.isAll = 0
def getAllMain(self, code, start=None): if start is None: start = public.getDate(diff=-2) res = rq.get_dominant_future(code, start_date=start, end_date=public.getDate(diff=1)) pre = '' docs = [] for i in range(len(res)): if pre != res[i]: docs.append((res.index[i], res[i])) pre = res[i] return docs
def getAdjustDate(self, code, diff=120, start=None): if start is None: start = public.getDate(diff=-diff) res = rq.get_dominant_future(code, start_date=start, end_date=public.getDate(diff=0)) pre = res[0] l = [] for i in range(len(res)): if pre != res[i]: l.append((res.index[i - 1], res.index[i], pre, res[i])) pre = res[i] return l
def __init__(self): self.Rice = interface_Rice() self.codes = ['510050.XSHG'] self.period = '30m' self.timePeriodList = [5, 10, 20, 60] self.timePeriods = 60 self.iniAmount = 40000 self.multiplier = 10000 self.ratio = 2 self.baisLineList = [0.15, 0.25, 0.35] self.index_list = ["MA"] self.startDate = public.getDate(diff=-130) # 60天数据回测 self.endDate = public.getDate(diff=0)
def getMain(self, codes, start=None, end=None): if start is None: start = public.getDate(diff=-5) if end is None: end = public.getDate() rs = [] for c in codes: res = rq.get_dominant_future(c, start_date=start, end_date=end) if res is not None: rs.append(res.values[-1]) else: rs.append(c + '88') return rs
def switch(self): # 生成all if self.isAll == 1: self.isEmptyUse = True if self.turnlineList: self.turnlineList = [1.75, 2.5] if self.superlineList: self.superlineList = [3.25] self.klineTypeList = ['15m', '30m'] self.total_tablename = 'train_total_dema5' self.detail_tablename = 'train_future_dema5' self.testDays = 180 # 起始时间 self.startDate = public.getDate(diff=-self.testDays) # 60天数据回测 self.endDate = public.getDate(diff=0) self.empty()
def saveStage(self, df2): self.preNode = [] period = 4 self.records = [] for i in range(period, len(df2)): sum, date = (df2.ix[i, key] for key in "sum,date".split(",")) isBuy, isRun = 0, False pN = self.preNode # 连续5年满足条件 if sum == 5: isBuy, isRun, mode = 1, True, 1 elif len(pN) > 0 and sum < 5: isBuy, isRun, mode = -1, True, 1 if isRun: # print(i, isBuy, pos, vol) self.order(df2.iloc[i], isBuy, 1) # 结束时用当前日计算股价 if len(self.preNode) > 0: last = copy.deepcopy(df2.iloc[-1]) last['date'] = public.getDate() self.order(last, -1, 1) # print(self.uid, len(self.records)) # 保存明细 if len(self.records) > 0: #print('----', len(self.records)) self.Record.insertAll(self.records)
def curMA(self, row, df0): e = row['datetime'] s = public.str_date(public.getDate(diff=-1, start=e) + ' 21:00:00') df = df0[(df0['datetime'] >= s) & (df0['datetime'] <= e)] return (df['close'] * df['volume'] ).sum() / df['volume'].sum() if df['volume'].sum() != 0 else 0
def record(self): # 510050 行情 stock = self.Int.get510050() stock["datetime"] = public.getDatetime() self.Owner.insert(stock) # 期权行情 etfs = self.Int.get_price() spys = [] self.price_owner = float(stock["price"]) for i in range(0, len(etfs), 2): # 计算剩余天数 r = public.dayDiff(self.Int.expireMap[etfs[i]["code"]], public.getDate()) rec0 = self.calc(etfs[i], etfs[i + 1], r, mode=0) spys.append(rec0) rec1 = self.calc(etfs[i + 1], etfs[i], r, mode=1) spys.append(rec1) # inform 通知 try: self.inform(spys) except: logger.error("ws disconnect") # 写入数据库 self.sPrice.insertAll(etfs) self.Spy.insertAll(spys)
def main(): cmdKeys = "w:" fw = public.getCmdParam(cmdKeys, ("-w", 2)) FT = fytuObject() # 每10分钟检查一次窝轮行情 if fw == 1: valid = FT.isTradeDate('HK') if valid: obj = warModel() obj.online() # 每15分钟检查一次基金申购: if fw == 2: if FT.isTradeDate('SH'): obj = etf4_compare() d, t = public.getDate(), public.getDatetime() # 大于2点45分,则每15秒运行一次直到结束 if t > d + " 14:45:00" and t < d + " 15:00:00": while True: t = public.getDatetime() if not (t > d + " 14:45:00" and t < d + " 15:00:00"): break obj.create(1) time.sleep(15) else: # 小于2点45分,则每15分钟运行一次 obj.create(0)
def getDf(self, codes, period='1d'): Rice = interface_Rice() Rice.setIndexList(self.indexCodeList) Base = future_baseInfo() BI = BaseInfo([]) if len(codes) == 0: codes = Base.getUsedMap(hasIndex=True) mCodes = Rice.getMain(codes) dfs = Rice.kline(mCodes, period=period, start=public.getDate(diff=-10), pre=200) i = 0 for mcode in mCodes: c = codes[i] last = BI.att(c, 'nightEnd')[0:6].replace(':', '') file = Rice.basePath + 'future_%s_%s_%s.csv' % ( mcode, last, public.getDatetime(style='%Y%m%d_%H%M%S')) print(mcode, last) df = dfs[mcode] df['datetime'] = df.index df0 = df[df['datetime'] > '2019-01-17 13:47:40.000'] print(df0.index, len(df0)) #df.to_csv(file, index=0) i += 1 break
def getWave(self, market='HK', stock_type="STOCK", autype='qfq'): date = public.getDate(diff=0) CSV = csvFile(folder="/data/csv", filename="rate_%s_%s_%s.csv" % (market, autype, date), headers=["code", "name", "count", "avg", "rate"]) df = self.getStockInfo(market, stock_type) i = 0 for index, row in df.iterrows(): _c, _m, _s = self.getHistory(row["code"], autype) doc = { "code": row["code"], "name": row["name"], "count": _c, "avg": _m, "rate": _s } #print(doc) #break if i % 100 == 0: print(i, doc) i += 1 CSV.writeLine(doc) CSV.close()
def get_fundamentals(self, codes, start_date=None, years=10, type='y'): """ q = query(fds.eod_derivative_indicator.pe_ratio, fds.balance_sheet.total_assets, fds.balance_sheet.total_liabilities, fds.balance_sheet.total_equity_and_liabilities ).filter(fds.stockcode.in_(codes)) """ q = query( fds.financial_indicator.adjusted_return_on_equity_diluted).filter( fds.stockcode.in_(codes)) if start_date is None: start_date = public.getDate() print('-----', start_date) Y = str(years * 4) + 'q' res = rq.get_fundamentals(q, start_date, interval=Y, report_quarter=True) d = {} for c in codes: try: d[c] = res.minor_xs(c) except: continue return d
def start(self, codes, time0, kt): print("子进程启动:", self.cindex, codes, kt, time.time() - time0) self.klineType = kt # 主力合约 self.codes = codes self.mCodes = mCodes = [n + '88' for n in codes] self.baseInfo = {} self.Rice = interface_Rice() # 查询获得配置 - 费率和每手单量 self.Base = future_baseInfo() for doc in self.Base.getInfo(codes): self.baseInfo[doc["code"] + '88'] = doc cs0, cs1 = self.baseInfo[mCodes[0]], self.baseInfo[mCodes[1]] # 子进程共享类 self.Rice.setTimeArea(cs0["nightEnd"]) self.Total = stock_uniform() self.Total.tablename = self.total_tablename if kt[-1]=='m': self.startDate = public.getDate(diff=-200) # 查询获得N分钟K线 dfs = self.Rice.kline(mCodes, period=self.klineType, start=self.startDate, end=self.endDate, pre=60) doc = self.total(dfs, kt) if doc is not None : self.Total.insert(doc)
def getOwnerMap(self, owners=None): owners_map = {} res = self.Wave.getLastWave() # 存储对象 # 查询获得正股波动率 oDf = pd.DataFrame( [doc for doc in res if (owners is None or doc['code'] in owners)]) # 正股列表 lists = ('HK.' + oDf['code']).tolist() # 查询获得正股当前股价 closes, volumes, rates = [], [], [] for ls in public.eachPage(lists, pc=200): df = self.Futu.getSnap(ls) #print(df) if not df.empty: closes += df['last_price'].tolist() volumes += df['volume'].tolist() rates += df['turnover_rate'].tolist() time.sleep(5) #添加正股收盘价 oDf['sclose'] = closes oDf['volume'] = volumes oDf['turnover_rate'] = rates oDf['sdate'] = public.getDate() docs = oDf.to_dict(orient='records') for doc in docs: owners_map[doc['code']] = doc return owners_map
def stat_pe(self, codes, n): print(n) self.Rice = interface_Rice() self.Record = stock_PE_year() df = self.Rice.get_factor(codes, start='2000-01-01', end=public.getDate()) df['date'] = df.index #df['date'] = df['date'].apply(lambda x: str(x)) df['year'] = df['date'].apply(lambda x: str(x)[:4]) docs = [] for y in range(2000, 2020): df0 = df[df['year'] == str(y)] for c in codes: doc = { "code": c, 'year': y, 'pe_ratio': round(df0[c].mean(), 2) } #print(doc) docs.append(doc) if len(docs) > 0: self.Record.insertAll(docs)
def __init__(self): # 费率和滑点 self.saveDetail = True # 是否保存明细 self.topUse = False self.isEmptyUse = True # 是否清空记录 self.testDays = 1200 self.bullwidth = 2 self.periodwidth = 14 self.processCount = 5 self.preDaysList = [10] self.preDays = 5 self.dissLineList = [0.05] self.dissLine = 0.5 self.iniAmount = 500000 # 单边50万 # self.iniAmount = 2000000 * 0.0025 # 单边50万 self.stopLine = 2 self.indexCodeList = [('IH', '000016.XSHG'), ('IF', '399300.XSHE'), ('IC', '399905.XSHE')] self.klineList = ['1d'] # 起始时间 self.startDate = '2013-01-01' self.endDate = public.getDate(diff=0) print(self.endDate) self.total_tablename = 'train_total_4' self.detail_tablename = 'train_future_4' self.method = 'jump' self.uidKey = "%s_%s_%s_%s_%s_" + self.method self.isAll = 0
def adjustOrder(self, n0, date, dd): preCode = '' for c in self.adjustDates: if c[1] == date: preCode = c[2] break s = str(date).split(" ")[0] df1 = self.Rice.kline([preCode], period=self.klineType, start=public.getDate(diff=-2, start= s), end=s, pre=0) oldP = df1[preCode].loc[dd, 'close'] newP = n0['close'] # 调仓卖出 doc = copy.deepcopy(self.preNode[0]) sign = np.sign(self.preNode[0]['mode']) pp = self.preNode[0]['price'] doc['price'] = oldP doc['isopen'] = 0 doc['mode'] = -doc['mode'] doc['isstop'] = 6 doc['createdate'] = date doc['income'] = sign * (oldP - pp) * doc["vol"] - doc["fee"] doc1 = copy.deepcopy(self.preNode[0]) doc1['createdate'] = date doc1['mode'] = int(6 * sign) doc1['price'] = newP doc1['isopen'] = 1 doc1['batchid'] = self.batchId = uuid.uuid1() #self.records.append(doc1) self.preNode = [doc1] return [doc, doc1]
def order(self, n0, isBuy, mode): vol, fee, amount, income, p0 = 0, 0, 0, 0, 0 code = n0['code'] d = public.getDate(diff=1, start=str(n0["date"])) vd = self.getVday(d) d1, price = self.Rice.getOpen(code, vd, type='stock') #print(vd, d1) if price is None: print(code, vd, 'None') return if isBuy > 0: if len(self.preNode) == 0: self.batchid = uuid.uuid1() p0 = price * (1 + self.shift) vol = int(self.iniAmount / p0 / 100) * 100 amount = vol * p0 fee = vol * p0 * self.ratio income = -fee elif isBuy < 0: p0 = price * (1 - self.shift) vol, amount, fee, income = 0, 0, 0, 0 if len(self.preNode) > 0: for pN in self.preNode: vol += pN['vol'] amount += pN['vol'] * p0 fee += pN['vol'] * p0 * self.ratio # 计算总的Income income += pN['vol'] * p0 - pN[ 'amount'] - pN['vol'] * p0 * self.ratio doc = { "code": n0['code'], "name": self.dict[n0['code']], "createdate": vd, 'reportdate': d1, "price": p0, "vol": vol, "mode": int(mode), "isBuy": int(isBuy), "fee": fee, "amount": amount, "income": income, "method": self.methodName, "batchid": self.batchid, "uid": self.uid } self.records.append(doc) # 设置上一个记录 if isBuy > 0: self.preNode.append(doc) else: self.preNode = [] return True