def Report(self, end_day, is_detail=False): import stock,agl #成交记录 df = self.df_ChengJiao.loc[:,['成交价格','成交数量','买卖标志','买0卖1','证券代码']] df.columns = ['price','num','flag','flag2','code'] df['d'] = df.index.astype(str) df['d'] = df['d'].map(lambda x: str(dateutil.parser.parse(x) + \ datetime.timedelta(minutes=5))) if is_detail: agl.print_df(df) #计算股票市值, 暂时只能处理一只股票的情况 shizhi = 0 close = 0 if len(self.df_stock)>0: code = self.df_stock.iloc[0]['证券代码'] close = stock.getHisdatDataFrameFromRedis(code,'',end_day).iloc[-1]['c'] num = self.df_stock.iloc[0]['库存数量'] shizhi += float(close)*int(num) print(self.df_zhijing.tail(n=1)) print('市值:%f,总资产:%f'%(shizhi, self.money+shizhi)) #如果持股不动,现在的资金 #取第一次交易后的可用资金 if len(self.df_zhijing)>1: money = self.df_zhijing.iloc[1]['可用'] else: money = self.df_zhijing.iloc[0]['可用'] #第一次股票数量到现在的市值 num = 0 if len(self.df_ChengJiao)>0: num = self.df_ChengJiao.iloc[0]['成交数量'] shizhi = num*close print('如果持股不动 市值:%f,总资产:%f'%(shizhi, money+shizhi))
def getTradeDay(d1, d2, dtype=backtest_runner.BackTestPolicy.enum.hisdat_mode): """确定是交易日 return: (d1, d2)""" if dtype == backtest_runner.BackTestPolicy.enum.hisdat_mode: df = stock.getHisdatDataFrameFromRedis(code, start_day=d1) else: df = stock.getFenshiDfUseRedis(code, d1, d2) d2 = agl.datetime_to_date(df.index[-1]) if agl.DateTimeCmp(d1, agl.datetime_to_date(df.index[0])) <0: d1 = agl.datetime_to_date(df.index[0]) return d1, d2
def genOne(code): #print code #先清理5分钟分时redis stock.FenshiCodeCache(code).delKey() try: #通过日线来取最近的5天 df_hisdat = stock.getHisdatDataFrameFromRedis(code) df_hisdat = df_hisdat.tail() start_day = agl.datetime_to_date(df_hisdat.index[0]) end_day = agl.datetime_to_date(df_hisdat.index[-1]) df_fenshi = stock.getFenshiDfUseRedis(code, start_day, end_day).dropna() except: return stock.FenshiCodeCache(code).set(df_fenshi)
def getTradeDay(d1, d2, dtype=backtest_runner.BackTestPolicy.enum.hisdat_mode): """确定是交易日 return: (d1, d2)""" try: if dtype == backtest_runner.BackTestPolicy.enum.hisdat_mode: df = stock.getHisdatDataFrameFromRedis(code, d1, d2) else: df = stock.getFenshiDfUseRedis(code, d1,d2) if len(df) == 0: #在指定日期内没有数据,应该是新股或次新股 return d2,d2 d2 = agl.datetime_to_date(df.index[-1]) if agl.DateTimeCmp(d1, agl.datetime_to_date(df.index[0])) <0: d1 = agl.datetime_to_date(df.index[0]) except: pass return d1, d2
def Report(self, end_day, is_detail=False): if sys.version > '3': print('python 3 can not execute') return import stock, myredis, mysql, agl #成交记录 df = self.df_ChengJiao.loc[:, ['成交价格', '成交数量', '买卖标志', '证券代码']] #print df #输出交易记录到json,供iChat访问 df.columns = ['price', 'num', 'flag', 'code'] df['d'] = df.index.astype(str) df['d'] = df['d'].map(lambda x: str(dateutil.parser.parse(x) + \ datetime.timedelta(minutes=5))) myredis.set_obj('backtest_trade', df) #原有的php需要使用json, 现在使用django, 可以废弃 #f = open('E:/Apache/Apache/htdocs/stock/trade_training/trade.json','w') #json.dump(np.array(df).tolist(),f) #f.close() if is_detail: agl.print_df(df) #计算股票市值, 暂时只能处理一只股票的情况 shizhi = 0 close = 0 if len(self.df_stock) > 0: code = self.df_stock.iloc[0]['证券代码'] close = stock.getHisdatDataFrameFromRedis(code, '', end_day).iloc[-1]['c'] num = self.df_stock.iloc[0]['库存数量'] shizhi += float(close) * int(num) print(self.df_zhijing.tail(n=1)) print('市值:%f,总资产:%f' % (shizhi, self.money + shizhi)) #如果持股不动,现在的资金 #取第一次交易后的可用资金 if len(self.df_zhijing) > 1: money = self.df_zhijing.iloc[1]['可用'] else: money = self.df_zhijing.iloc[0]['可用'] #第一次股票数量到现在的市值 num = 0 if len(self.df_ChengJiao) > 0: num = self.df_ChengJiao.iloc[0]['成交数量'] shizhi = num * close print('如果持股不动 市值:%f,总资产:%f' % (shizhi, money + shizhi))
def _test_AsynDrawKline(self): code = '300033' start_day = '2017-3-1' df = stock.getHisdatDataFrameFromRedis(code, start_day) df = stock.getFiveHisdatDf(code, start_day='2017-7-20') import account account = account.LocalAcount(account.BackTesting()) #随机找三个交易点 indexs = agl.GenRandomArray(len(df), 3) trade_bSell = [0, 1, 0] df_trades = df[df.index.map(lambda x: x in df.index[indexs])] df_trades = df_trades.copy() df_trades[AsynDrawKline.enum.trade_bSell] = trade_bSell plt.ion() for i in range(10): AsynDrawKline.drawKline(df[i * 10:], df_trades) plt.ioff() plt.show() #最后停在画面处, 没有的话进程结束
def test_drawKlin(self): code = jx.THS df = stock.getHisdatDataFrameFromRedis(code) drawKline(pl, df, legend2=['成交量'])
def test_drawKline(): code, start_day, end_day = '600100', '', '' df = stock.getHisdatDataFrameFromRedis(code, '', '') code = stock.getDapanCode(code) df_dp = stock.getHisdatDataFrameFromRedis(code, start_day, end_day) drawKline(pl, df_code=df, df_dp=df_dp)