def short_line_ma(days=5): # 连续n天股价 ma5*1.08>收盘价>=ma5, 最低价>=ma10,ma10*1.05>ma5 # ma5>ma10>ma20>ma60>ma120 ds_tushare = DataServiceTushare() lst_code_picked = list() code_lst = ds_tushare.get_stock_list() for item_code in code_lst: date_begin = ds_tushare.get_pre_trade_date('202200804', days) k_data_lst = ds_tushare.get_stock_price_lst(item_code, date_begin, '202200804') if len(k_data_lst) == 0: continue cnt = 0 for item_price in k_data_lst: if item_price['close'] < item_price['ma_5'] or item_price[ 'close'] > item_price['ma_5'] * 1.08 or item_price[ 'low'] < item_price['ma_10']: break if item_price['ma_5'] > item_price['ma_10'] * 1.05: break if item_price['ma_120'] > item_price['ma_60'] or item_price['ma_60'] > item_price['ma_30'] or item_price['ma_30'] > item_price['ma_20'] \ or item_price['ma_20'] > item_price['ma_10'] or item_price['ma_10'] > item_price['ma_5']: break cnt += 1 if cnt == days: print(item_price['ts_code']) lst_code_picked.append(item_price['ts_code']) print(lst_code_picked)
def pick_stock(self, date_picked): ds_tushare = DataServiceTushare() lst_code_picked = list() for ts_code in ds_tushare.get_stock_list(): stock_basic = ds_tushare.get_stock_basic_info(ts_code) if stock_basic is None: self.logger.info('None stock basic info %s' % ts_code) continue dt_date = string_to_datetime(date_picked) d = timedelta(days=-365 * self.n_years) if stock_basic['list_date'] > time_to_str( dt_date + d, '%Y%m%d') or 'ST' in stock_basic['name']: # 排除上市时间小于2年和st股票 continue dic_stock_price = ds_tushare.get_stock_price_info( ts_code, date_picked) if dic_stock_price is None: # 排除选股日停牌的股票 continue str_ma_long = 'ma_' + str(self.ma_long) flag_in_pool = True try: if dic_stock_price['high_250'] / dic_stock_price['low_250'] < self.max_times_in_year \ and dic_stock_price['ma_120'] > dic_stock_price['ma_250'] \ and dic_stock_price['ma_250'] > dic_stock_price['ma_500'] and dic_stock_price['close'] < dic_stock_price['high_250'] * (1.0 - self.pct_back)\ and dic_stock_price['close'] > dic_stock_price[str_ma_long] * (1.0-self.pct_near) and dic_stock_price['close'] < dic_stock_price[str_ma_long] * (1.0+self.pct_near): date_pre = ds_tushare.get_pre_trade_date(date_picked) price_pre = ds_tushare.get_stock_price_info( ts_code, date_pre) if dic_stock_price['ma_500'] > price_pre[ 'ma_500'] and dic_stock_price[ 'ma_250'] > price_pre['ma_250']: cal = ds_tushare.get_pre_n_trade_date( dic_stock_price['trade_date'], self.day_ma_long_effective) k_data_lst = ds_tushare.get_stock_price_lst( dic_stock_price['ts_code'], cal[-1], cal[0]) for k_data in k_data_lst: if (k_data['close'] < k_data[str_ma_long]): flag_in_pool = False break if flag_in_pool is True: lst_code_picked.append(dic_stock_price['ts_code']) except: self.logger.info( 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') self.logger.info(dic_stock_price) return lst_code_picked
def rise_ma(percent=8): close_cur = np.array(list()) percent_cur = np.array(list()) close_pre = np.array(list()) ma5_pre = np.array(list()) ma10_pre = np.array(list()) ma20_pre = np.array(list()) ma30_pre = np.array(list()) ma60_pre = np.array(list()) ma120_pre = np.array(list()) ma250_pre = np.array(list()) ma500_pre = np.array(list()) ds_tushare = DataServiceTushare() code_lst = ds_tushare.get_stock_list() for item_code in code_lst: k_data_lst = ds_tushare.get_stock_price_lst(item_code, '20100101', '20180101') if len(k_data_lst) == 0: continue k_data_pre = k_data_lst.pop(0) for item_price in k_data_lst: if item_price['pct_chg'] > percent: close_cur = np.append(close_cur, item_price['close']) percent_cur = np.append(percent_cur, item_price['pct_chg']) close_pre = np.append(close_pre, k_data_pre['close']) ma5_pre = np.append(ma5_pre, k_data_pre['ma_5']) ma10_pre = np.append(ma10_pre, k_data_pre['ma_10']) ma20_pre = np.append(ma20_pre, k_data_pre['ma_20']) ma30_pre = np.append(ma30_pre, k_data_pre['ma_30']) ma60_pre = np.append(ma60_pre, k_data_pre['ma_60']) ma120_pre = np.append(ma120_pre, k_data_pre['ma_120']) ma250_pre = np.append(ma250_pre, k_data_pre['ma_250']) ma500_pre = np.append(ma500_pre, k_data_pre['ma_500']) k_data_pre = item_price index = [0, 1, 2, 3, 4, 5, 6, 7] cnt_rise = float(len(percent_cur)) values = [np.sum(close_pre > ma5_pre)/cnt_rise, np.sum(close_pre > ma10_pre)/cnt_rise, np.sum(close_pre > ma20_pre)/cnt_rise, np.sum(close_pre > ma30_pre)/cnt_rise, \ np.sum(close_pre > ma60_pre)/cnt_rise, np.sum(close_pre > ma120_pre)/cnt_rise, np.sum(close_pre > ma250_pre)/cnt_rise, np.sum(close_pre > ma500_pre)/cnt_rise] print(values) plt.bar(index, values) plt.xticks(index, ['5', '10', '20', '30', '60', '120', '250', '500']) plt.show()
def pick_stock(self, date_picked): ds_tushare = DataServiceTushare() lst_code_picked = list() for ts_code in ds_tushare.get_stock_list(): stock_basic = ds_tushare.get_stock_basic_info(ts_code) if stock_basic is None: self.logger.info('None stock basic info %s' % ts_code) continue dt_date = string_to_datetime(date_picked) d = timedelta(days=-365 * self.n_years) if stock_basic['list_date'] > time_to_str( dt_date + d, '%Y%m%d') or 'ST' in stock_basic['name']: # 排除上市时间小于2年和st股票 continue dic_stock_price = ds_tushare.get_stock_price_info( ts_code, date_picked) if dic_stock_price is None: # 排除选股日停牌的股票 continue high_gap = 'high_' + str(self.days_gap) low_gap = 'low_' + str(self.days_gap) days_break_gap = 'high_' + str(self.days_break) try: if dic_stock_price['high_250'] / dic_stock_price['low_250'] < self.max_times_in_year and \ dic_stock_price['ma_60'] > dic_stock_price['ma_120'] and \ dic_stock_price['ma_120'] > dic_stock_price['ma_250']: date_pre = ds_tushare.get_pre_trade_date( date_picked, self.days_gap) price_pre = ds_tushare.get_stock_price_info( ts_code, date_pre) if dic_stock_price['ts_code'] == '000998_SZ': a = 1 if price_pre['high'] < dic_stock_price[low_gap] and \ price_pre['high'] > price_pre[days_break_gap]*(1.0-self.pct_high_break) and \ dic_stock_price['low'] < price_pre['high']*(1.0+self.pct_near_gap) and \ dic_stock_price[high_gap]/price_pre['high'] < (1.0+self.pct_max): lst_code_picked.append(dic_stock_price['ts_code']) except: self.logger.info( 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') self.logger.info(dic_stock_price) return lst_code_picked
from data_service import DataServiceTushare from logger import Logger from itertools import groupby import matplotlib.pyplot as plt from convert_utils import string_to_datetime, time_to_str if __name__ == "__main__": logger = Logger().getlog() ds_tushare = DataServiceTushare() lst_trade_date = ds_tushare.getTradeCal('20110101', '20111231') lst_hold_date = list() for item_date in lst_trade_date: is_hold_date = True for ts_code in ["000001.SH", "399001.SZ"]: info_k_data = ds_tushare.getStockPriceInfo(ts_code, item_date) if info_k_data['close'] < info_k_data['ma_20'] or info_k_data['qrr'] < 1: is_hold_date = False if is_hold_date is True: lst_hold_date.append(item_date) lst_sh = list() lst_sh_date = list() lst_sz = list() lst_zxb = list() lst_cyb = list() cnt_win = 0 cnt_loss = 0 rate_win = 0. for item_hold_date in lst_hold_date: idx = lst_hold_date.index(item_hold_date) if idx < len(lst_hold_date): day_next = ds_tushare.get_next_trade_date(item_hold_date)
# 择时短线1: # 1、收盘后涨跌8%以上个股比例 # 上涨8%股票数:股票总数 # 下跌8%股票数:股票总数 # 上涨8%股票数:下跌8%股票数 # 2、收盘后昨日涨8%股票今日表现: 平均涨幅 # 3、收盘后昨日跌8%股票今日表现: 平均涨幅 # 4、收盘后昨日振幅12%股票今日表现: 平均涨幅 # Y:所有股票(ma5以上多头排列股票)涨幅中位数 # 注:排除上市2年以内的新股 import datetime import numpy as np import pandas as pd from datetime import datetime from datetime import timedelta from collections import Counter from strategy_base import StrategyBase from data_service import DataServiceTushare, DATA_BEGIN_DATE from convert_utils import string_to_datetime, time_to_str def data_to_db() ds_tushare = DataServiceTushare() ds_tushare.get_trade_cal(DATA_BEGIN_DATE)
import pandas as pd import numpy as np from data_service import DataServiceTushare import matplotlib.pyplot as plt df = pd.read_csv( 'D:\\code\\python\\quant_big_a\\data\\zengfafinish20192020.csv') df1 = df[df['date_on'] < 20200601] pct_high = 0.2 #增发日股票上市价高于增发价比例 days_n = 60 #跟踪上市日之后N日的表现 # 计算现金增发完成后的股票表现情况 # 排除增发成本比上市日股价高出30%以上(pct_high)的股票 # 增发股票上市日作为基准日:计算收盘最大涨幅(跌幅)平均值和中位数 ds_tushare = DataServiceTushare() lst_up = list() lst_down = list() lst_code_close_pct_chg = list() # 每只股票的观察日区间收盘涨跌幅列表 for index, row in df1.iterrows(): date_end = ds_tushare.get_next_trade_date(str(row["date_on"]), days_n) date_start = str(row["date_on"]) lst_close = list() lst_close_pct_chg = list() code = row["code"].replace('.', '_') price_cost = ds_tushare.get_stock_price_info(code, date_start) if price_cost['open'] > row["price_cost"] * (1.0 + pct_high): continue lst_trade_date = ds_tushare.get_trade_cal(date_start, date_end) k_data_pre = dict() price_base = 0.0 for item_date in lst_trade_date: k_data = ds_tushare.get_stock_price_info(code, item_date)
self.day_ma_long_effective) k_data_lst = ds_tushare.get_stock_price_lst( dic_stock_price['ts_code'], cal[-1], cal[0]) for k_data in k_data_lst: if (k_data['close'] < k_data[str_ma_long]): flag_in_pool = False break if flag_in_pool is True: lst_code_picked.append(dic_stock_price['ts_code']) except: self.logger.info( 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') self.logger.info(dic_stock_price) return lst_code_picked if __name__ == "__main__": ds_tushare = DataServiceTushare() strategy = StrategyBullBack() print(strategy.pick_stock('20200814')) # lst_trade_date = ds_tushare.get_trade_cal('20200101', '20200701') # cnt_loop = 0 # for item_date in lst_trade_date: # cnt_loop += 1 # if cnt_loop % 5 == 0: # # 换股日 # strategy.pick_stock(item_date) """ to do: 计算股票池的每日涨跌幅(叠加大盘指数绘图) """
def pick_stock(self, date): self.set_date(date) ds_tushare = DataServiceTushare() lst_code_pool = list() lst_code_picked = list() for ts_code in ds_tushare.get_stock_list(): stock_basic = ds_tushare.get_stock_basic_info(ts_code) if stock_basic is None: self.logger.info('None stock basic info %s' % ts_code) continue dt_date = string_to_datetime(self.stock_picked_date) d = timedelta(days=-365 * self.n_years) if stock_basic['list_date'] > time_to_str( dt_date + d, '%Y%m%d') or 'ST' in stock_basic['name']: # 排除上市时间小于2年和st股票 continue dic_stock_price = ds_tushare.get_stock_price_info( ts_code, self.stock_picked_date) if dic_stock_price is None: # 排除选股日停牌的股票 continue try: if dic_stock_price['circ_mv'] > self.circ_mv_max or dic_stock_price['turnover_rate_f'] < self.turnover_rate_f_min \ or dic_stock_price['high_250'] / dic_stock_price['low_250'] > self.pct_chg_max_year \ or dic_stock_price['ma_120'] > dic_stock_price['ma_60'] or dic_stock_price['ma_60'] > dic_stock_price['ma_30'] \ or dic_stock_price['ma_30'] > dic_stock_price['ma_10'] or dic_stock_price['ma_10'] > dic_stock_price['ma_5'] \ or dic_stock_price['close'] > dic_stock_price['ma_5'] * (1 + self.pct_close_to_ma5) \ or dic_stock_price['close'] < dic_stock_price['ma_5'] * (1 - self.pct_close_to_ma5): continue except: self.logger.info( 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') self.logger.info(dic_stock_price) lst_code_pool.append(dic_stock_price['ts_code']) # self.logger.info(lst_code_pool) lst_n_days = ds_tushare.get_pre_n_trade_date(self.stock_picked_date, self.n_days) # 日期从大到小排列 arr_code = list() arr_a1 = list() # 最近一天的数据 arr_a2 = list() arr_a3 = list() arr_a4 = list() arr_a5 = list() arr_b1 = list() arr_b2 = list() arr_b3 = list() arr_b4 = list() arr_b5 = list() for item_code in lst_code_pool: lst_stock_price = ds_tushare.get_stock_price_lst( item_code, lst_n_days[-1], lst_n_days[0]) if len(lst_stock_price) < self.n_days: # 排除最近5个交易日有停牌情况的股票 continue arr_code.append(item_code) idx = 0 for item_price in lst_stock_price: idx += 1 if idx == 1: # 第一天数据 n-1 arr_a1.append(item_price['turnover_rate_f']) arr_b1.append(item_price['volume_ratio']) elif idx == 2: # 第二天数据 n-2 arr_a2.append(item_price['turnover_rate_f']) arr_b2.append(item_price['volume_ratio']) elif idx == 3: arr_a3.append(item_price['turnover_rate_f']) arr_b3.append(item_price['volume_ratio']) elif idx == 4: arr_a4.append(item_price['turnover_rate_f']) arr_b4.append(item_price['volume_ratio']) elif idx == 5: arr_a5.append(item_price['turnover_rate_f']) arr_b5.append(item_price['volume_ratio']) else: self.logger.info('lst_stock_price data error!!!') self.logger.info(lst_stock_price) break arr_a1_idx = np.array(arr_a1).argsort()[-(self.n_rank_turnover + 1):-1] arr_a2_idx = np.array(arr_a2).argsort()[-(self.n_rank_turnover + 1):-1] arr_a3_idx = np.array(arr_a3).argsort()[-(self.n_rank_turnover + 1):-1] arr_a4_idx = np.array(arr_a4).argsort()[-(self.n_rank_turnover + 1):-1] arr_a5_idx = np.array(arr_a5).argsort()[-(self.n_rank_turnover + 1):-1] arr_b1_idx = np.array(arr_b1).argsort()[-(self.n_rank_vol + 1):-1] arr_b2_idx = np.array(arr_b2).argsort()[-(self.n_rank_vol + 1):-1] arr_b3_idx = np.array(arr_b3).argsort()[-(self.n_rank_vol + 1):-1] arr_b4_idx = np.array(arr_b4).argsort()[-(self.n_rank_vol + 1):-1] arr_b5_idx = np.array(arr_b5).argsort()[-(self.n_rank_vol + 1):-1] arr_combine = np.hstack((arr_a1_idx, arr_a2_idx, arr_a3_idx, arr_a4_idx, arr_a5_idx, \ arr_b1_idx, arr_b2_idx, arr_b3_idx, arr_b4_idx ,arr_b5_idx)) res_count = Counter(arr_combine) res_stock_idx = res_count.most_common(self.n_rank_times) if len(res_stock_idx) != 0: for item in res_stock_idx: lst_code_picked.append(arr_code[item[0]]) return lst_code_picked
import pymongo from data_service import DataServiceTushare from vnpy.trader.constant import Exchange if __name__ == "__main__": ds_tushare = DataServiceTushare() ds_tushare.build_stock_data(update=True) # ds_tushare._build_top_list() # zz500相关指标入库 # ds_tushare.zz500_stock_pool_in_db(['2018', '2019', '2020']) # ds_tushare.zz500_index_in_db('20180101', '20200818')``
from time import time, sleep from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegressionCV from sklearn.metrics import recall_score, confusion_matrix, precision_score from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV from sklearn.ensemble import BaggingClassifier import numpy as np import pandas as pd from pymongo import MongoClient, ASCENDING, DESCENDING if __name__ == "__main__": logger = Logger().getlog() ds_tushare = DataServiceTushare() # lst_index_price = ds_tushare.getStockPriceLst('000001_SH', '20000301') lst_index_price = ds_tushare.getStockPriceLst('399001_SZ', '20050301') # data_index = np.zeros(shape=(len(lst_index_price), 4)) count_X = lst_index_price.count() data_index = np.zeros(shape=(count_X, 4)) lst_index_price.sort("trade_date", DESCENDING) last_index_val = 0.0 idx = 0 for item in lst_index_price: ma5 = item['close'] - item['ma_5'] ma20 = item['close'] - item['ma_20'] vol_rate = item['vol_rate'] result = 1 if item['close'] <= last_index_val else 0 data_index[idx] = [ma5, ma20, vol_rate, result] idx += 1
import pandas as pd import numpy as np df = pd.read_csv( 'D:\code\quant_big_a\\trade_stock_digu\\dingzengjiejin2020.csv') from data_service import DataServiceTushare df1 = df[df['date_free'] < 20200801] # 计算定增解禁期间股票表现情况 # 计算定增解禁股解禁日前后20个交易日信息 # 解禁日之前的20日作为基准日:计算收盘最大涨幅(跌幅)平均值和中位数 ds_tushare = DataServiceTushare() lst_up = list() lst_down = list() for index, row in df1.iterrows(): date_end = ds_tushare.get_next_trade_date(str(row["date_free"]), 20) date_start = ds_tushare.get_pre_trade_date(str(row["date_free"]), 20) lst_close = list() code = row["code"].replace('.', '_') lst_k_data = ds_tushare.get_stock_price_lst(code, date_start, date_end) for item in lst_k_data: lst_close.append(item['close']) if len(lst_close) == 0: continue price_base = lst_close[0] pct_up = (max(lst_close) - price_base) / price_base pct_down = (min(lst_close) - price_base) / price_base lst_up.append(pct_up) lst_down.append(pct_down) mean_up = np.mean(lst_up) mean_down = np.mean(lst_down) median_up = np.median(lst_up)
def set_date(self, date): # 设置选股日期 ds_tushare = DataServiceTushare() trade_date = ds_tushare.get_trade_date(date) self.stock_picked_date = trade_date