def apply_guess(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-50)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock.head(10)) arr = pd.Series(stock["close"].values) # print(df_arr) wave_mean = arr.mean() # 计算股票的波峰值。 wave_crest = heapq.nlargest(5, enumerate(arr), key=lambda x: x[1]) wave_crest_mean = pd.DataFrame(wave_crest).mean() # 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值 wave_base = heapq.nsmallest(5, enumerate(arr), key=lambda x: x[1]) wave_base_mean = pd.DataFrame(wave_base).mean() # 输出数据 # print("##############") tmp = {"code": code, "wave_mean": wave_mean, "wave_crest": wave_crest_mean[1], "wave_base": wave_base_mean[1]} # print(tmp) # code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。 return list([code, date, wave_base_mean[1], wave_crest_mean[1], wave_mean])
def apply_merge_sell(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) # 增加空判断,如果是空返回 0 数据。 if stock is None: return list([1, code, date, 0, 0, 0, 0]) print("########") # J大于100时为超买,小于10时为超卖。 # 强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 # 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, # 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, stockStat = stockstats.StockDataFrame.retype(stock) kdjj = int(stockStat["kdjj"].tail(1).values[0]) rsi_6 = int(stockStat["rsi_6"].tail(1).values[0]) cci = int(stockStat["cci"].tail(1).values[0]) print("kdjj:", kdjj, "rsi_6:", rsi_6, "cci:", cci) # and kdjj > 80 and rsi_6 > 55 and cci > 100 判断卖出时刻。也就是买入时刻的反面。发现有波动就卖了。 # if kdjj <= 10 and rsi_6 <= 50 and cci <= 100: old if kdjj <= 80 or rsi_6 <= 55 or cci <= 100: return list([0, code, date, 1, cci, kdjj, rsi_6]) else: return list([1, code, date, 0, cci, kdjj, rsi_6])
def get(self): code = self.get_argument("code", default=None, strip=False) logging.info(code) # self.uri_ = ("self.request.url:", self.request.uri) # print self.uri_ comp_list = [] try: date_now = datetime.datetime.now() date_end = date_now.strftime("%Y-%m-%d") date_start = (date_now + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) logging.info(stock.head(1)) # print(stock) [186 rows x 14 columns] # 初始化统计类 # stockStat = stockstats.StockDataFrame.retype(pd.read_csv("002032.csv")) stockStat = stockstats.StockDataFrame.retype(stock) batch_add(comp_list, stockStat) except Exception as e: logging.info("error :", e) logging.info( "#################### GetStockHtmlHandlerEnd ####################") self.render("stock_indicators.html", comp_list=comp_list, leftMenu=webBase.GetLeftMenu(self.request.uri))
def apply_guess(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) # 增加空判断,如果是空返回 0 数据。 if stock is None: return pd.Series([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, code, date, 0.0, 0.0], index=[ '10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return' ]) stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock.head(10)) # 5周期、10周期、20周期和60周期 # 周线、半月线、月线和季度线 stock["5d"] = stock["close"].rolling(window=5).mean() # 周线 stock["10d"] = stock["close"].rolling(window=10).mean() # 半月线 stock["20d"] = stock["close"].rolling(window=20).mean() # 月线 stock["60d"] = stock["close"].rolling(window=60).mean() # 季度线 # 计算日期差。 stock["5-10d"] = (stock["5d"] - stock["10d"]) * 100 / stock["10d"] # 周-半月线差 stock["5-20d"] = (stock["5d"] - stock["20d"]) * 100 / stock["20d"] # 周-月线差 # 计算股票的收益价格 stock["return"] = np.log(stock["close"] / stock["close"].shift(1)) # print(stock["return"]) # 计算股票的【收益率的移动历史标准差】 mov_day = int(len(stock) / 20) # print("mov_day:", mov_day, len(stock)) stock["mov_vol"] = stock["return"].rolling( window=mov_day).std() * math.sqrt(mov_day) # print(stock["mov_vol"].tail()) # print(stock["return"].tail()) # print("stock[10d].tail(1)", stock["10d"].tail(1).values[0]) # 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return tmp = pd.Series([ stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0], stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0], code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0] ], index=[ '10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return' ]) # print(tmp) return tmp
def apply_guess(tmp, stock_column): # print("apply_guess columns args:", stock_column) # print("apply_guess data :", type(tmp)) date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") # print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) # 设置返回数组。 stock_data_list = [] # 增加空判断,如果是空返回 0 数据。 if stock is None: for col in stock_column: if col == 'date': stock_data_list.append(date) elif col == 'code': stock_data_list.append(code) else: stock_data_list.append(0) return list(stock_data_list) # print(stock.head()) # open high close low volume # stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) stock = stock.sort_index(0) # 将数据按照日期排序下。 stock["date"] = stock.index.values # 增加日期列。 stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock) [186 rows x 14 columns] # 初始化统计类 # stockStat = stockstats.StockDataFrame.retype(pd.read_csv('002032.csv')) stockStat = stockstats.StockDataFrame.retype(stock) print("########################## print result ##########################") for col in stock_column: if col == 'date': stock_data_list.append(date) elif col == 'code': stock_data_list.append(code) else: # 将数据的最后一个返回。 tmp_val = stockStat[col].tail(1).values[0] if np.isinf(tmp_val): # 解决值中存在INF问题。 tmp_val = 0 if np.isnan(tmp_val): # 解决值中存在NaN问题。 tmp_val = 0 # print("col name : ", col, tmp_val) stock_data_list.append(tmp_val) # print(stock_data_list) return list(stock_data_list)
def apply_sklearn(data): # 要操作的数据库表名称。 print("########stat_index_all########:", len(data)) date = data["date"] code = data["code"] print(date, code) date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open high close low volume price_change p_change ma5 ma10 ma20 v_ma5 v_ma10 v_ma20 turnover stock_X = common.get_hist_data_cache(code, date_start, date_end) # 增加空判断,如果是空返回 0 数据。 if stock_X is None: return list([code, date, 0.0, 0.0]) stock_X = stock_X.sort_index(0) # 将数据按照日期排序下。 stock_y = pd.Series(stock_X["close"].values) # 标签 stock_X_next = stock_X.iloc[len(stock_X) - 1] print("########################### stock_X_next date:", stock_X_next) # 使用今天的交易价格,13 个指标预测明天的价格。偏移股票数据,今天的数据,目标是明天的价格。 stock_X = stock_X.drop(stock_X.index[len(stock_X) - 1]) # 删除最后一条数据 stock_y = stock_y.drop(stock_y.index[0]) # 删除第一条数据 # print("########################### stock_X date:", stock_X) # 删除掉close 也就是收盘价格。 del stock_X["close"] del stock_X_next["close"] model = linear_model.LinearRegression() # model = KNeighborsClassifier() model.fit(stock_X.values, stock_y) # print("############## test & target #############") # print("############## coef_ & intercept_ #############") # print(model.coef_) # 系数 # print(model.intercept_) # 截断 next_close = model.predict([stock_X_next.values]) if len(next_close) == 1: next_close = next_close[0] sklearn_score = model.score(stock_X.values, stock_y) print("score:", sklearn_score) # 评分 return list([code, date, next_close, sklearn_score * 100])
def apply_merge(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) print("########") # print(stock.tail(1)) close = stock.tail(1)["close"].values[0] print("close: ", close) print("########") return list([code, date, close])
def apply_guess(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-200)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock.head(10)) stock["date"] = stock.index.values # 增加日期列。 stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock) [186 rows x 14 columns] # 初始化统计类 # stockStat = stockstats.StockDataFrame.retype(pd.read_csv('002032.csv')) stockStat = stockstats.StockDataFrame.retype(stock)
def apply_merge(tmp): date = tmp["date"] code = tmp["code"] date_end = datetime.datetime.strptime(date, "%Y%m%d") date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") date_end = date_end.strftime("%Y-%m-%d") print(code, date_start, date_end) # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover # 使用缓存方法。加快计算速度。 stock = common.get_hist_data_cache(code, date_start, date_end) # 增加空判断,如果是空返回 0 数据。 if stock is None: return list([code, date, 0, 0, 0]) stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) stock = stock.sort_index(0) # 将数据按照日期排序下。 # print(stock.head(10)) arr = pd.Series(stock["close"].values) # print(df_arr) wave_mean = arr.mean() max_point = 3 # 获得最高的几个采样点。 # 计算股票的波峰值。 wave_crest = heapq.nlargest(max_point, enumerate(arr), key=lambda x: x[1]) wave_crest_mean = pd.DataFrame(wave_crest).mean() # 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值 wave_base = heapq.nsmallest(max_point, enumerate(arr), key=lambda x: x[1]) wave_base_mean = pd.DataFrame(wave_base).mean() # 输出数据 print("##############", len(stock)) if len(stock) > 180: # code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。 return list( [code, date, wave_base_mean[1], wave_crest_mean[1], wave_mean]) else: return list([code, date, 0, 0, 0])