def concept(limit): concept = pro.concept() count = 1 concept_detail = pd.DataFrame() if os.path.isfile('concept_detail.csv'): concept_detail = pd.read_csv('concept_detail.csv') else: for id in concept['code'].unique(): concept_detail = pd.concat( [concept_detail, pro.concept_detail(id=id)]) count += 1 if count % 190 == 0: time.sleep(60) print(concept_detail.shape) concept_detail.to_csv('concept_detail.csv', index=False) limit = limit.merge(concept_detail, on=['ts_code']) summary = pd.DataFrame( limit.groupby(['trade_date', 'concept_name'])['concept_name'].count()) print(summary.info()) summary.columns = ['count'] print(summary.info()) summary.reset_index(inplace=True) print(summary.info()) save_data(summary, '概念股.csv') summary.sort_values(['trade_date', 'count'], ascending=False, inplace=True) print(summary['concept_name'].unique().shape)
def mengjie(start_date,end_date): # 连续五天一字板涨停,最近一天涨幅在[2,4],后日表现 rawdata = read_data('daily', start_date=start_date, end_date=end_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) print(data.shape) data['limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) guoli=data.copy() for day in range(2,7): pre = basic().pre_data(data, label=['limit'], pre_days=day) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_limit'%day]], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli['pre_%s_limit'%day]==1] data=data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day,guoli.shape) pre = basic().pre_data(data, label=['pct_chg'], pre_days=1) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_1_pct_chg']], on=['ts_code', 'trade_date']) save_data(guoli,'mengjie.csv') guoli=guoli.loc[(guoli['pre_1_pct_chg']>=1)&(guoli['pre_1_pct_chg']<=5)] # 过滤新股 list_days=basic().list_days(guoli,list_days=25) guoli=guoli.merge(list_days,on=['ts_code','trade_date']) print(guoli.shape[0]) guoli['ma']=guoli['amount']/guoli['vol']*10 save_data(guoli,'mengjie相似股票数据.csv') for ps in ['high','low','ma']: guoli['%s/pre_close'%ps]=100*(guoli[ps]/guoli['pre_close']-1) print(guoli['%s/pre_close'%ps].mean()) print(data.shape) print()
def fun1(limit_type='up'): res = pd.DataFrame() # data = read_data('daily', start_date=start_date, end_date=end_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = data.merge(limit, on=['ts_code', 'trade_date']) data['is_roof'] = data.apply( lambda x: 99 if x['close'] == x['up_limit'] else 1 if x['close'] == x['down_limit'] else x['pct_chg'], axis=1) for rate in [-99] + list(range(-10, 10)) + [99]: print(rate) df = data.loc[(data['is_roof'] >= rate) & (data['is_roof'] < (rate + 1))].copy() if df.empty: continue # df['pct']=(df['close']/df['open']-1)*100 # res.loc[rate,'pct']=df['pct'].mean() wool = sheep.wool2(df[['ts_code', 'trade_date']], data, PRICEB=PRICEB, days=1) res.loc[rate, 'mean'] = wool.iloc[:, -3].mean() res.loc[rate, 'n'] = wool.iloc[-1, -2] res.loc[rate, 'all_pct'] = wool.iloc[-1, -1] save_data(res, 'pct_chg_cut_res%s-%s.csv' % (start_date, end_date))
def mv(self): df = pro.daily_basic(ts_code='', trade_date=start, fields='ts_code,trade_date,total_mv,circ_mv') growth_mv = df[df[vars.TS_CODE].isin(self.growth_data[vars.TS_CODE])] # ceil=1000*(int(df['total_mv'].max()//1000)+1) df_count_mv = pd.DataFrame() for col in 'total_mv,circ_mv'.split(','): # print(df[col].index) bins = [ int(df.sort_values(col).iloc[x, df.columns.get_loc(col)]) + 1 for x in range(0, df.shape[0], 200) ] + [ int(df.sort_values(col).iloc[-1, df.columns.get_loc(col)]) + 100 ] # bins=bins.sort() df['all-%s-scope' % col] = pd.cut(df[col], bins) growth_mv['growth-%s-scope' % col] = pd.cut(growth_mv[col], bins) df_count_mv = pd.concat([ group_ana( df, 'all-%s-scope' % col, count_var='all-%s-scope' % col), group_ana(growth_mv, 'growth-%s-scope' % col, count_var='growth-%s-scope' % col) ], axis=1) df_count_mv['rate'] = df_count_mv[ 'growth-%s-scope-pct' % col] / df_count_mv['all-%s-scope-pct' % col] df_count_mv.reset_index(inplace=True, ) save_data(df_count_mv, '%s 分析占比.csv' % col)
def re_limit_up(start_date, end_date): rawdata = read_data('daily', start_date=start_date, end_date=end_date) # list_days=basic().list_days(rawdata) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit']], on=['ts_code', 'trade_date']) print(data.shape) data['red_line'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['reback_limit'] = data.apply( lambda x: 1 if (x['open'] == x['close']) & (x['open'] == x['up_limit']) & (x['low'] < x['close']) else 0, axis=1) print(data.shape) pre = basic().pre_data(data, label=['red_line'], pre_days=2) data = data.merge(pre[['ts_code', 'trade_date', 'pre_2_red_line']], on=['ts_code', 'trade_date']) pre = basic().pre_data(data, label=['reback_limit'], pre_days=1) data = data.merge(pre[['ts_code', 'trade_date', 'pre_1_reback_limit']], on=['ts_code', 'trade_date']) print(data.shape) data = data.loc[(data['pre_2_red_line'] == 1) & (data['pre_1_reback_limit'] == 1)] print(data.shape) # save_data('破板后回封表现.csv') # data=data.loc[(data['up_limit']==data['close'])&(data['open']==data['close'])&(data['low']<data['up_limit'])] # print(data.shape) data = data.merge(basic().list_days(data, list_days=15)) print(data.shape) wool = sheep.wool(data, rawdata) return wool
def increse_count(self, days, growth): self.stock_increse(days, growth) save_data(stock.growth_data, '%s-%s-%s增长股票.csv' % (start, days, growth)) increase_info = self.growth_data.groupby( vars.TRADE_DATE)[vars.TS_CODE].count() save_to_sql(increase_info, 'growth_%s_%s' % (days, growth)) save_data(increase_info, '%s--%s-%s增长-数量.csv' % (start, days, growth))
def jiangxicy(start_date,end_date): # 两个普通涨停,一个一字板,后日表现 rawdata = read_data('daily', start_date=start_date, end_date=end_date) # ma=pd.read_csv('D:\\workgit\\stock\\data\\break_limit\\'+'ma%s.csv'%start_date,index_col=0, dtype={'trade_date': object}) # ma=pd.DataFrame() # for ts_code in rawdata['ts_code'].unique(): # ma=pd.concat([ma,ts.pro_bar(ts_code,start_date=start_date,end_date=end_date,ma=[5])],ignore_index=True) # save_data(ma[['ts_code', 'trade_date', 'ma5']],'ma%s.csv'%start_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) # data = data.merge(ma[['ts_code', 'trade_date', 'ma5']], on=['ts_code', 'trade_date']) print(data.shape) # data['cd'] = data.apply(lambda x: 1 if (x['close'] == x['down_limit'])&(x['open']>0.98*x['pre_close']) else 0, axis=1) # data['open_less_limit']= data.apply(lambda x: 1 if (x['open']!=x['up_limit'])&(x['close']==x['up_limit'])&(x['open'] >= (x['pre_close']*1.05)) else 0, axis=1) # data['line_limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['or_limit']=data.apply(lambda x: 1 if( x['open'] != x['up_limit'])&(x['close'] == x['up_limit']) else 0, axis=1) # data['nn'] = data.apply(lambda x: 1 if (x['high'] < x['up_limit']) & (x['close'] > x['down_limit']) else 0, axis=1) # data['m_ma']=data.apply(lambda x: 1 if( x['close'] > x['ma5'])&(x['close'] != x['up_limit']) else 0, axis=1) data['c_c2']=data.apply(lambda x: 1 if ((x['low']>=(0.93*x['pre_close']))&(x['low']<=(0.94*x['pre_close']))&(x['open']<=x['pre_close'])&(x['pct_chg']<=-4)&(x['pct_chg']>=-5)&(x['open']>=x['close'])) else 0, axis=1) guoli=data.copy() for day in range(len(days)): if not days[day]: continue pre = basic().pre_data(data, label=[days[day]], pre_days=day+1) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_%s'%(day+1,days[day])]], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli['pre_%s_%s'%(day+1,days[day])]==1] data=data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day,guoli.shape) save_data(guoli,'jxcy.csv') # 过滤新股 list_days=basic().list_days(guoli,list_days=30) guoli=guoli.merge(list_days,on=['ts_code','trade_date']) print(guoli.shape[0]) guoli['ma']=guoli['amount']/guoli['vol']*10 save_data(guoli,'jxcy%s%s.csv'%(','.join(days),end_date)) for ps in ['high','low','ma','open','close']: guoli['%s/pre_close'%ps]=100*(guoli[ps]/guoli['pre_close']-1) print(ps,guoli['%s/pre_close'%ps].mean()) print('close_limit_up:',guoli.loc[guoli['close']==guoli['up_limit']].shape[0]/guoli.shape[0]) print('open_limitup:',guoli.loc[guoli['open']==guoli['up_limit']].shape[0]/guoli.shape[0]) print('line_red:',guoli.loc[(guoli['open']==guoli['up_limit'])&(guoli['close']==guoli['up_limit'])&(guoli['low']==guoli['up_limit'])].shape[0]/guoli.shape[0]) print(guoli.shape)
def guolikeji(start_date,end_date): # -5非涨停,-4~-2一字板,-1[-4,-6],上市25天以上 rawdata = read_data('daily', start_date=start_date, end_date=end_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) print(data.shape) data['limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['limit2']=data.apply(lambda x: 1 if x['close'] == x['up_limit'] else 0, axis=1) guoli=data.copy() for day in range(4,1,-1): pre = basic().pre_data(data, label=['limit'], pre_days=day) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_limit'%day]], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli['pre_%s_limit'%day]==1] data=data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day,guoli.shape) print(guoli.shape,guoli.iloc[:,-5:].describe()) # pre = basic().pre_data(data, label=['pct_chg'], pre_days=1) # guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_1_pct_chg']], on=['ts_code', 'trade_date']) # guoli=guoli.loc[(guoli['pre_1_pct_chg']>=-7)&(guoli['pre_1_pct_chg']<=-3)] # data = data.loc[data['ts_code'].isin(guoli['ts_code'])] # print(guoli.shape,guoli.iloc[:,-5:].describe()) pre = basic().pre_data(data, label=['limit2'], pre_days=5) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_5_limit2']], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli ['pre_5_limit2']==0] pre = basic().pre_data(data, label=['pct_chg'], pre_days=1) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_1_pct_chg']], on=['ts_code', 'trade_date']) save_data(guoli,'guoli.csv') guoli=guoli.loc[(guoli['pre_1_pct_chg']>=-7)&(guoli['pre_1_pct_chg']<=-3)] data = data.loc[data['ts_code'].isin(guoli['ts_code'])] print(guoli.shape,guoli.iloc[:,-5:].describe()) # data = data.loc[data['ts_code'].isin(guoli['ts_code'])] # 过滤新股 list_days=basic().list_days(guoli,list_days=25) guoli=guoli.merge(list_days,on=['ts_code','trade_date']) print(guoli.shape[0]) guoli['ma']=guoli['amount']/guoli['vol']*10 save_data(guoli,'guoli相似股票数据.csv') for ps in ['high','low','ma']: guoli['%s/pre_close'%ps]=100*(guoli[ps]/guoli['pre_close']-1) print(guoli['%s/pre_close'%ps].mean()) print(data.shape) print()
def analyse_basic(self, ): self.basic = read_data('stock_basic') self.basic = self.basic[self.basic['list_status'] == 'L'] growth_basic = self.basic[self.basic[vars.TS_CODE].isin( self.growth_data[vars.TS_CODE])] # vs_table=pd.DataFrame() for key in ['industry', 'area', 'is_hs']: count_allmarket = group_ana(self.basic, key) count_growth = group_ana(growth_basic, key) df = pd.concat([count_growth, count_allmarket], ignore_index=True, axis=1) save_data(df, '股票%s对比.csv' % key, encoding='utf_8_sig')
def guangbai(start_date,end_date): # 两个普通涨停,一个一字板,后日表现 rawdata = read_data('daily', start_date=start_date, end_date=end_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) print(data.shape) # data['cd'] = data.apply(lambda x: 1 if (x['close'] == x['down_limit'])&(x['open']>0.98*x['pre_close']) else 0, axis=1) data['open_less_limit']= data.apply(lambda x: 1 if (x['open']!=x['up_limit'])&(x['close']==x['up_limit'])&(x['open'] >= (x['pre_close']*1.05)) else 0, axis=1) data['line_limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['or_limit']=data.apply(lambda x: 1 if( x['open'] != x['up_limit'])&(x['close'] == x['up_limit']) else 0, axis=1) data['nn'] = data.apply(lambda x: 1 if (x['high'] < x['up_limit']) & (x['close'] > x['down_limit']) else 0, axis=1) guoli=data.copy() for day in range(len(days)): if not days[day]: continue pre = basic().pre_data(data, label=[days[day]], pre_days=day+1) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_%s'%(day+1,days[day])]], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli['pre_%s_%s'%(day+1,days[day])]==1] data=data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day,guoli.shape) save_data(guoli,'guangbo.csv') # 过滤新股 list_days=basic().list_days(guoli,list_days=30) guoli=guoli.merge(list_days,on=['ts_code','trade_date']) print(guoli.shape[0]) guoli['ma']=guoli['amount']/guoli['vol']*10 save_data(guoli,'guangbo相似股票数据%s%s.csv'%(','.join(days),end_date)) for ps in ['high','low','ma','open','close']: guoli['%s/pre_close'%ps]=100*(guoli[ps]/guoli['pre_close']-1) print(ps,guoli['%s/pre_close'%ps].mean()) print('close_limit_up:',guoli.loc[guoli['close']==guoli['up_limit']].shape[0]/guoli.shape[0]) print('open_limitup:',guoli.loc[guoli['open']==guoli['up_limit']].shape[0]/guoli.shape[0]) print('line_red:',guoli.loc[(guoli['open']==guoli['up_limit'])&(guoli['close']==guoli['up_limit'])&(guoli['low']==guoli['up_limit'])].shape[0]/guoli.shape[0]) print(guoli.shape) print()
def jiai(start_date,end_date): # 非涨跌停,两个一字板,一字板回封,收盘-2~-6low==down_limit rawdata = read_data('daily', start_date=start_date, end_date=end_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) print(data.shape) data['limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['ulrl']=data.apply(lambda x:1 if ((x['up_limit']==x['close'])&(x['open']==x['close'])&(x['low']<x['close'])) else 0,axis=1) data['nn'] = data.apply(lambda x: 1 if ((x['close'] != x['up_limit']) & (x['close'] != x['down_limit'])) else 0, axis=1) guoli=data.copy() for day in range(3,5): pre = basic().pre_data(data, label=['limit'], pre_days=day) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_limit'%day]], on=['ts_code', 'trade_date']) guoli=guoli.loc[guoli['pre_%s_limit'%day]==1] data=data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day,guoli.shape) pre = basic().pre_data(data, label=['pct_chg','low','down_limit'], pre_days=1) guoli = guoli.merge(pre[['ts_code', 'trade_date','pre_1_low','pre_1_down_limit']], on=['ts_code', 'trade_date']) guoli=guoli.loc[(guoli['pre_1_low']==guoli['pre_1_down_limit'])] data = data.loc[data['ts_code'].isin(guoli['ts_code'])] pre = basic().pre_data(data, label=['nn'], pre_days=5) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_5_nn']], on=['ts_code', 'trade_date']) guoli=guoli.loc[(guoli['pre_5_nn']==1)] data = data.loc[data['ts_code'].isin(guoli['ts_code'])] pre = basic().pre_data(data, label=['ulrl'], pre_days=2) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_2_ulrl']], on=['ts_code', 'trade_date']) guoli = guoli.loc[guoli['pre_2_ulrl' ] == 1] data = data.loc[data['ts_code'].isin(guoli['ts_code'])] # 过滤新股 save_data(guoli,'jiai.csv') list_days=basic().list_days(guoli,list_days=25) guoli=guoli.merge(list_days,on=['ts_code','trade_date']) print(guoli.shape[0]) guoli['ma']=guoli['amount']/guoli['vol']*10 save_data(guoli,'jiai相似股票数据.csv') for ps in ['high','low','ma']: guoli['%s/pre_close'%ps]=100*(guoli[ps]/guoli['pre_close']-1) print(guoli['%s/pre_close'%ps].mean()) print(data.shape) print()
def period(self, N=60): data = pd.DataFrame() for n in range(7, N): df = self.stock_increse(n) df['pre_date'] = df['%s-date' % n] df['days'] = n df = df[[vars.TS_CODE, vars.TRADE_DATE, 'pre_date', 'days']] data = pd.concat([data, df], ignore_index=True) save_data(data, '增长速度.csv') df = data.groupby(by=[vars.TS_CODE, vars.TRADE_DATE])['pre_date'].min() df = pd.DataFrame(df) df['min_days'] = data.groupby( by=[vars.TS_CODE, vars.TRADE_DATE])['days'].min() df.reset_index(inplace=True) save_data(df, '增长统计.csv') print(data.shape)
def segment(self, days=1): res = pd.DataFrame() for cut in self.data['Categories'].unique(): df = self.data.loc[self.data['Categories'] == cut] if df.empty: res.loc[str(cut), 'roi'] = None continue res_seg = self.roi(df, days=days) if res_seg.empty: res.loc[str(cut), 'roi'] = None continue save_data( res_seg, '首板部分回溯%s_%s_%s_%s_%s2.csv' % (cut, self.PRICEB, self.PRICES, self.start_date, self.end_date)) res.loc[str(cut), 'roi'] = res_seg.iloc[-1, -1] res.loc[str(cut), 'n_mean'] = res_seg['n'].mean() res.loc[str(cut), 'days'] = res_seg.shape[0] save_data( res, '首板分类回溯汇总_%s_%s_%s_%s.csv' % (self.PRICEB, self.PRICES, self.start_date, self.end_date)) return res
import pandas as pd from stock.sql.data import read_data, save_data from stock.util import vars start_date, end_date = '20200625', '20200730' data = read_data('daily', start_date=start_date, end_date=end_date).merge(read_data('stk_limit', start_date=start_date, end_date=end_date)[[ 'ts_code', 'trade_date', 'up_limit', 'down_limit' ]], on=['ts_code ', 'trade_date']) df_high = data[data[vars.HIGH] == data[vars.UP_LIMIT]] df_break = data[(data[vars.HIGH] == data[vars.UP_LIMIT]) & (data[vars.CLOSE] != data[vars.UP_LIMIT])] df1 = df_high.groupby('trade_date')['ts_code'].size() df2 = df_break.groupby('trade_date')['ts_code'].size() df = pd.DataFrame([df1, df2]) print(df) save_data(df, 'break_limit.py.csv')
def lianban(start_date, end_date): # 两个普通涨停 rawdata = read_data('daily', start_date=start_date, end_date=end_date) # ma = pd.read_csv('D:\\workgit\\stock\\data\\break_limit\\' + 'ma%s.csv' % start_date, index_col=0, # dtype={'trade_date': object}) # ma=pd.DataFrame() # for ts_code in rawdata['ts_code'].unique(): # ma=pd.concat([ma,ts.pro_bar(ts_code,start_date=start_date,end_date=end_date,ma=[5])],ignore_index=True) # save_data(ma[['ts_code', 'trade_date', 'ma5']],'ma%s.csv'%start_date) limit = read_data('stk_limit', start_date=start_date, end_date=end_date) data = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit', 'down_limit']], on=['ts_code', 'trade_date']) # data = data.merge(ma[['ts_code', 'trade_date', 'ma5']], on=['ts_code', 'trade_date']) print(data.shape) # data['cd'] = data.apply(lambda x: 1 if (x['close'] == x['down_limit'])&(x['open']<0.95*x['pre_close']) else 0, axis=1) # data['open_less_limit']= data.apply(lambda x: 1 if (x['open']!=x['up_limit'])&(x['close']==x['up_limit'])&(x['open'] >= (x['pre_close']*1.05)) else 0, axis=1) # data['line_limit'] = data.apply(lambda x: 1 if x['low'] == x['up_limit'] else 0, axis=1) data['re_limit']=data.apply(lambda x: 1 if (x['close'] == x['up_limit']) & (x['close'] == x['open'])&(x['low'] < x['up_limit']) else 0, axis=1) # data['or_limit'] = data.apply( # lambda x: 1 if (x['open'] != x['up_limit']) & (x['close'] == x['up_limit']) else 0, axis=1) data['c_limit']=data.apply( lambda x: 1 if (x['close'] == x['up_limit']) else 0, axis=1) data['nn'] = data.apply(lambda x: 1 if (x['close'] != x['up_limit']) & (x['close'] != x['down_limit']) else 0, axis=1) # data['c_c'] = data.apply(lambda x: 1 if (x['open']== x['up_limit']) & (x['low'] == x['down_limit'])&(x['pct_chg']<0) else 0, axis=1) # data['c_c'] = data.apply(lambda x: 1 if (x['up_limit']==x['open']) &(0<=x['pct_chg']) &(x['pct_chg']<=5)else 0, axis=1) # data['c_c3'] = data.apply(lambda x: 1 if (x['down_limit']==x['close']) &(x['open']<x['pre_close']) else 0, axis=1) # data['c_c4'] = data.apply(lambda x: 1 if (x['up_limit']!=x['close']) & (x['up_limit']==x['open']) &(x['pct_chg']>5) else 0, axis=1) # data['c_c5'] = data.apply(lambda x: 1 if (1.02<x['open'] / x['pre_close'] <= 1.06) & (-2>x['pct_chg'] >= -6) else 0, axis=1) # data['c_c1'] = data.apply(lambda x: 1 if (-4<(x['open']/ x['pre_close']-1)<-0.02) &((-2>x['pct_chg']>-5) ) else 0, axis=1) # data['all']=1 # data['m_ma5'] = data.apply( # lambda x: 1 if (x['close'] > x['ma5' # ]) & (x['pct_chg'] <= -4) & (x['pct_chg'] >= -6) else 0, axis=1) guoli = data.copy() for day in range(len(days)): if not days[day]: continue pre = basic().pre_data(data, label=[days[day]], pre_days=day + 1) guoli = guoli.merge(pre[['ts_code', 'trade_date', 'pre_%s_%s' % (day + 1, days[day])]], on=['ts_code', 'trade_date']) guoli = guoli.loc[guoli['pre_%s_%s' % (day + 1, days[day])] == 1] data = data.loc[data['ts_code'].isin(guoli['ts_code'])] print(day, guoli.shape) # save_data(guoli, 'lianban.csv',fp_date=True) # 过滤新股 list_days = basic().list_days(guoli, list_days=30) guoli = guoli.merge(list_days, on=['ts_code', 'trade_date']) print(guoli.shape[0]) guoli['ma'] = guoli['amount'] / guoli['vol'] * 10 guoli=guoli.loc[guoli['up_limit']/guoli['pre_close']>=1.08] save_data(guoli, 'lianban1%s%s.csv' % (','.join(days), end_date),fp_date=True) for ps in ['high', 'low', 'ma', 'open', 'close']: guoli['%s/pre_close' % ps] = 100 * (guoli[ps] / guoli['pre_close'] - 1) print(ps, guoli['%s/pre_close' % ps].mean()) # print(ps, guoli['%s/pre_close' % ps].describe()) print('close_limit_up:', guoli.loc[guoli['close'] == guoli['up_limit']].shape[0] / guoli.shape[0]) print('close_down_up:', guoli.loc[guoli['close'] == guoli['down_limit']].shape[0] / guoli.shape[0]) print('open_limitup:', guoli.loc[guoli['open'] == guoli['up_limit']].shape[0] / guoli.shape[0]) print('line_red:', guoli.loc[(guoli['open'] == guoli['up_limit']) & (guoli['close'] == guoli['up_limit']) & ( guoli['low'] == guoli['up_limit'])].shape[0] / guoli.shape[0]) print('high_limitup:', guoli.loc[guoli['high'] == guoli['up_limit']].shape[0] / guoli.shape[0]) # print('dont keep up limit ',guoli.loc[guoli['close'] == guoli['up_limit']].shape[0] / guoli.loc[guoli['high'] == guoli['up_limit']].shape[0] ) print('pobanhoupct',guoli.loc[guoli['open'] == guoli['up_limit']]['pct_chg'].mean()) # print(guoli.shape) # guoli=guoli.loc[(guoli['open']==guoli['up_limit'])&(guoli['low']<guoli['up_limit'])] # rawdata=rawdata.loc[rawdata['ts_code'].isin(guoli['ts_code'].unique())] # for pct in range(0,9,1): # rawdata['pb']=rawdata['open']-rawdata['pre_close']*pct*0.01 # rawdata['pb']=rawdata.apply(lambda x:x['pb'] if x['pb']>=x['low'] else None,axis=1) # rawdata['ps']=rawdata['high']/2+rawdata['low']/2 # res=sheep.wool2(guoli,rawdata,PRICEB='pb',PRICES='ps') # save_data(res,'open=limit-%s-sell-mid.csv'%pct,fp_date=True) return guoli
print(open_res) for open in open_res: if not pre_1: pre_1.append(con.pop(0)) for pre in pre_1: conditions = [open, pre] + con red_line = filter(raw_data, conditions) print(conditions) if red_line.empty: print('no stock') continue save_data(red_line, '%s%sraw_data.csv' % (year, ','.join(conditions)), fp_date=True) res = roi2(red_line, raw_data, selling_price=selling.split('=')[0], cut_left=-24, cut_right=4, step=2) if res.empty: print('当前条件下无数据') continue save_data( res, 'trace_back_to%s%s-%s%s.csv' % (year, ','.join(conditions), selling.split('=')[0], today), fp_date=True)
t.PRICES = 'close' limit_count = pd.DataFrame( t.data.groupby('trade_date')['ts_code'].count()).reset_index() limit_count.columns = ['trade_date', 'count'] t.data = t.data.loc[(t.data['open/pre_close'] <= o[1]) & (t.data['open/pre_close'] >= o[0])] # t['all_count']=limit_count print(t.data.shape) t.data.dropna(inplace=True) res = t.roi(days=sell_days) print(t.data.shape) res = res.merge(limit_count, on='trade_date') res['proportion'] = res['n'] / res['count'] print(res.iloc[-3:, :]) save_data(res, '%s-%s回溯指标.csv' % (start, end)) save_to_sql(res, 'limit_performance') # mlist = [ 'open','close','ma'] + list(range(1, 5)) # summary = pd.DataFrame() # for model in mlist: # print(model, t.data.shape, t.raw_data.shape) # t.sell_model(model) # df = t.segment(days=sell_days) # summary[model] = df['roi'] # save_data(summary, '首板%s回溯汇总%s%s2.csv' % (sell_days,start, end)) # l={} # res=pd.DataFrame() # for rate in arange(1.02,1.06,0.005): # t.sell_model(4,rate=rate) # df=t.roi()
start_date = '20200701' end_date = '20201231' FORMAT = lambda x: '%.3f' % x # cuts_format = 'open/pre_close=100*(open/pre_close-1)' cuts_format = 'pct_chg' limit = vars.CLOSE buy, sell, days, bins = vars.CLOSE, vars.OPEN, 1, 1 raw_data = read_data('daily', start_date=start_date, end_date=end_date).merge(read_data('stk_limit', start_date=start_date, end_date=end_date)[[ 'ts_code', 'trade_date', 'up_limit', 'down_limit' ]], on=['ts_code', 'trade_date']) list_days = basic().list_days(raw_data, list_days=30) raw_data = raw_data.merge(list_days, on=['ts_code', 'trade_date']) # ds=open_cut(raw_data,cuts_format=vars.PCT_CHG,limit=vars.CLOSE,bins=1) # ds=open_cut(raw_data,limit=vars.OPEN,bins=1,PRICEB=vars.OPEN,PRICES=vars.CLOSE,days=0) ds = open_cut(raw_data, cuts_format, limit=limit, bins=bins, PRICEB=buy, PRICES=sell, days=days) save_data(ds, '%s-%s-%s-%s切分回溯%s.csv' % (limit, buy, days, sell, start_date))
print(break_data.shape) return break_data def next_performance(self,data,PRICEBUY='close',PRICESELL='close',days=1): res=pd.DataFrame() for d in range(1, days): wool=sheep.wool2(data,self.raw_data,PRICEB=PRICEBUY,PRICES=PRICESELL,days=d) res['%spct' % d] = wool['pct'] res['%sall_pct' % d] = wool['all_pct'] res['n']=wool['n'] return res.iloc[:-days,:] # t=pro.concept('') # o=idea2(start_date='20190101',end_date='20190201') # o.list_days(days=60) # o.data=o.data[o.data['list_date']>='20190101'] # o.data=o.data.merge(o.stl_limt,on=['ts_code','trade_date']) # o.data['is_up_limit']=o.data.apply(lambda x:1 if x['close']>=x['up_limit'] else 0) # o.data['up_limit_days']=o.data.groupby('ts_code')[] # o.red_line=o.data.loc[o.data['low']>=o.data['up_limit']] # ctnu_days=o.red_line.groupby('ts_code')['list_days'].max() # o.data_can_buy=o.data[(o.data['low']<o.data['up_limit'])|(o.data['close']<o.data['up_limit'])] # buy_date=o.data_can_buy.groupby('ts_code')['list_days'].min() start,end='20180101','20181231' o=idea2(start_date=start,end_date=end) t=o.break_limit(N=50) next=o.next_performance(t,days=5) print(next.describe()) save_data(next,'新股破板后表现%s-%s.csv'%(start,end)) print()
res = [] data.sort_values(vars.TRADE_DATE, inplace=True) for l in range(data.shape[0] - N): vector2 = data.iloc[l:l + N, :] res.append([ vector2.iloc[0][vars.TRADE_DATE], vector2.iloc[-1][vars.TRADE_DATE], cos_sim(vector1[cols].values.reshape(1, -1), vector2[cols].values.reshape(1, -1)) ]) return pd.DataFrame(res, columns=['start', 'end', 'sim']) START, END = '20150101', '20201231' ts_code = '000001.SH' # cols=[vars.OPEN,vars.CLOSE,vars.AMOUNT,vars.VOL] cols = [vars.AMOUNT, vars.VOL] # filer_name = '%s_%s.csv' N = 10 data = get_index(ts_code, START, END) # data = index_slope(data, 4, 1) vector1 = data.iloc[-N - 1:-1, :] if __name__ == '__main__': save_data(cos_cycel(data, N), file_name % (N, '-'.join(cols)), fp_date=True) print()
# #股票公告 # df = pro.anns(ts_code='600627.SH') # #股票更名记录 # namechange=pro.query('namechange') # 股票基本信息 basic = read_data('stock_basic') # 纳斯达克指数 IXIC = pro.query('index_global', ts_code='IXIC', start_date=START) # index_basic=pro.query('index_basic',market='SSE') #上证指数 SSE = pro.index_daily(ts_code='000001.SH', start_date=START) SSE['pre_friday'] = SSE['trade_date'].shift(-1) SSE['today_week'] = pd.to_datetime(SSE['trade_date']).dt.dayofweek SSE['lastday_week'] = pd.to_datetime(SSE['trade_date']).dt.dayofweek save_data(SSE, '上证指数.csv') save_data(IXIC, '纳斯达克.csv') IXIC['sz_date'] = IXIC['trade_date'].shift(1) IXIC.loc[0, 'sz_date'] = datetime.date.today().strftime('%Y%m%d') IXIC = IXIC.iloc[:, 1:] # print(IXIC.columns) columns = dict.fromkeys(IXIC.columns[:-1]) for key in columns.keys(): columns[key] = 'us_%s' % key IXIC.rename(columns=columns, inplace=True) mix = SSE.merge(IXIC, left_on='trade_date', right_on='sz_date') save_data(mix, 'sz&nasdq.csv') data = read_data('daily', start_date=START) data = data[(data['pct_chg'] >= -11) & (data['pct_chg'] <= 11)]
PB='PB' if buy_data.empty: continue print(cut) roi=sheep.wool2(buy_data,data,PRICEB=PB) res.append([cut,roi.shape[0],roi.iloc[-1,-1]]) res=pd.DataFrame(res,columns=['cut','n_days','pct']) return res start_date='20%s0501' end_date='20%s1231' for year in range(20,21): rawdata = read_data('daily', start_date=start_date%year, end_date=end_date%year).iloc[:,:-2] limit = read_data('stk_limit', start_date=start_date%year, end_date=end_date%year) rawdata = rawdata.merge(limit[['ts_code', 'trade_date', 'up_limit','down_limit']], on=['ts_code', 'trade_date']) print(start_date%year,'----',end_date%year,'include %s lines'%rawdata.shape[0]) line_stock=red_line(rawdata).sort_values('trade_date') print(line_stock.loc[line_stock['trade_date']==line_stock.iloc[-1,-1]]) save_data(line_stock,'%s连板.csv'%year) save_data(line_stock.loc[line_stock['trade_date']==line_stock.iloc[-1,-1]],'连板.txt') res=buy_model(line_stock,rawdata) save_data(res,'%s连板回测效果.csv'%year) # res=roi(limit,rawdata) # res=yunei(start_date%year,end_date%year) print()
o.raw_data['pct:o-c'] = (o.raw_data['open'] - o.raw_data['close']) o.raw_data['pct:h-o'] = (o.raw_data['high'] - o.raw_data['open']) print('%s个交易日' % o.raw_data['trade_date'].unique().shape[0]) o.data = o.raw_data.loc[(o.raw_data['pre_%s_is_roof' % days] == 0) & (o.raw_data['pre_%s_is_roof' % (days - 1)] == 1)].copy() df = basic().pre_data(o.data, label=['open'], new_label=['pre_open']) o.data = o.data.merge(df[['ts_code', 'trade_date', 'pre_open']], on=['ts_code', 'trade_date']) o.raw_data.dropna(inplace=True) print(o.raw_data.shape) pct = pd.DataFrame() # for con in ['all','up']+list(range(1,5)): for con in ['all', 'up']: df = o.select(con, days=days) pct_some = pd.DataFrame() for item in [ 'open', 'close', 'ma', 'high', 'low', 'pct:h-l', 'pct:o-c', 'pct:h-o' ]: df['%s_%s/pre_close' % (con, item)] = df[item] / df['pre_close'] pct_some = pd.concat([pct_some, df['%s_%s/pre_close' % (con, item)]], axis=1) pct_some = pd.DataFrame(pct_some.describe(include='all')).reset_index() pct_some['index'] = pct_some['index'].astype('object') pct = pd.concat([pct, pct_some], axis=1) save_data(pct, '不同条件价格分布%s%s.csv' % (start, end))
def m_up_in_n_day(): # N天M板 N,M=7,3 limit_up=read_data('stk_limit') daily=read_data('daily') data=daily.merge(limit_up,on=['ts_code','trade_date']) print(limit_up.shape,daily.shape,data.shape) data['UP']=data.apply(lambda x :1 if x['close']==x['up_limit'] else 0,axis=1) print(data.shape,data.dropna().shape) data.sort_values(['ts_code','trade_date'],inplace=True) data.reset_index(drop=True,inplace=True) data['times']=data.groupby('ts_code')['UP'].rolling(7).sum().reset_index(drop=True) # df=data.groupby('ts_code')['UP'].rolling(7).sum().reset_index() print() if __name__ == '__main__': start = '20180101' data = first_limit(start_date=start, days=2) save_data(data.drop(columns=['change', 'pct_chg', 'vol', 'amount', 'up_limit', 'down_limit']), '连板股票%s.csv' % start) # df=dis_first_limit_second(data=data,start_date=start,days=2) df = dis_first_limit_second(start_date=start, days=2) save_data(df, '连板概率%s.csv' % start) print('have_done')
data = process(raw_data, condition, next_day=1) print(data.shape) # open_cut(data.loc[data['close'] == data['up_limit']],OPEN) res = performance(data, raw_data) reform_performance( res, '-'.join([x.__name__ if x != None else '' for x in condition])) res = performance(data, raw_data, LIMIT=True) reform_performance( res, 'limit' + '-'.join([x.__name__ if x != None else '' for x in condition])) save_data(data, '%s%s%sdata.csv' % (ts_code, '~'.join([ '_' if x == None else x.__name__ if 'lambda' not in x.__name__ else 'special' for x in condition ]), start_date), fp_date=True) save_data(performance_table, '%s%s%sperformance.csv' % (ts_code, '~'.join([ x.__name__ if 'lambda' not in x.__name__ else 'lambda' for x in condition ]), start_date), fp_date=True) save_data(open_cut(data), '%s%s%sperformance.csv' % (ts_code, '~'.join([ x.__name__ if 'lambda' not in x.__name__ else 'lambda' for x in condition ]), start_date), fp_date=True,
for year in range(18, 20): trace = pd.DataFrame() raw_data = read_data('daily', start_date=start_date % year, end_date=end_date % (year)).iloc[:, :-2] limit = read_data('stk_limit', start_date=start_date % year, end_date=end_date % year) raw_data = raw_data.merge(limit[['ts_code', 'trade_date', 'up_limit', 'down_limit']], on=['ts_code', 'trade_date']) print(raw_data.shape[0]) if selling not in raw_data.columns: raw_data.eval(selling, inplace=True) list_days = basic().list_days(raw_data, list_days=25) print(list_days.shape) raw_data = raw_data.merge(list_days, on=['ts_code', 'trade_date']) print(start_date % year, '----', end_date % year, 'include %s items' % raw_data.shape[0]) for o in open_res: ds=cl.process(raw_data,[o]+con) save_data(ds, '%s%sraw_data.csv' % (year, ','.join([o]+con)), fp_date=True) res = cl.roi2(ds, raw_data, selling_price=selling.split('=')[0], cut_left=-24, cut_right=4, step=2) if res.empty: print('当前条件下无数据') continue save_data(res,'trace_back_to%s%s-%s%s.csv' % (year, ','.join([o]+con), selling.split('=')[0], today), fp_date=True) res.rename(columns = {"n_days": "n_days_%s%s"% (year, ','.join([o]+con)),"num": "num_%s%s"% (year, ','.join([o]+con)),"pct": "pct_%s%s"% (year, ','.join([o]+con))},inplace=True) if trace.empty: trace=res.copy() else: trace=trace.merge(res,how='outer',on='pb') save_data(trace, 'trace_back_to%s%s%s.csv' % (year, selling.split('=')[0], today),fp_date=True)
# guolikeji(start_date,end_date) # mengjie(start_date,end_date) # df = ts.pro_bar(ts_code='000001.SZ', adj='qfq', start_date='20180101', end_date='20181011') # 广百股份 # days=[None,'open_less_limit','line_limit','or_limit','nn'] # # days=['cd','or_limit' # # ,'nn'] # guangbai(start_date,end_date) # print() # 联创股份 # days=['m_ma5','or_limit','m_ma','m_ma','m_ma'] # days=['cd','or_limit' # ,'nn'] # lianchuang(start_date,end_date) # days=['c_c2','or_limit'] # jiangxicy(start_date,end_date) # days=['or_limit','or_limit','nn'] # days=['line_limit','line_limit','nn'] # days=['c_c','line_limit','line_limit','nn'] # days=['c_c','re_limit','line_limit','or_limit','nn'] days=['line_limit','line_limit','nn']#603608 # days=['c_c3','line_limit','c_limit','c_limit','c_limit']#603608 # days=['c_c4','c_limit','c_limit','nn']#300374 days=('c_limit', 're_limit', 'c_limit','nn') # days=['c_c','or_limit','or_limit','or_limit','nn'] # days=['c_c1','or_limit','nn'] save_data(lianban(start_date,end_date), '603101%s%s.csv' % (','.join(days), end_date), fp_date=True) print()
from stock.sql.data import save_data from stock.util.basic import basic import stock.limit_up.get_limit_stock as gls # from stock.limit_up import performance_of_first_limit_up as pf fp = os.path.join(os.path.dirname(os.getcwd()), 'data', os.path.basename(sys.argv[0]).split('.py')[0]) fp = os.path.join(fp, '首板涨停回溯.csv') def pro(start_date=None, end_date=None, limit_type='up', days=2): data = gls.first_limit(start_date=start_date, end_date=end_date, limit_type=limit_type, days=days) data = data.loc[(data['pct_chg'] >= -11) & (data['pct_chg'] <= 11)] fl = data.loc[(data['pre_1_is_roof'] == 1) & (data['pre_2_is_roof'] == 0)] return sheep.wool2(fl, fl, days=0, PRICEB='open', PRICES='close') if __name__ == '__main__': if os.path.isfile(fp): t = pro() save_data(t, '首板涨停回溯.csv', mode='a') else: t = pro(start_date='20190101') save_data(t, '首板涨停回溯.csv') # t=pro() # print()
def increase(N, M): data = read_data('daily', start_date=start_date, end_date=end_date).merge(read_data('stk_limit', start_date=start_date, end_date=end_date)[[ 'ts_code', 'trade_date', 'up_limit', 'down_limit' ]], on=['ts_code', 'trade_date']) data.sort_values(vars.TRADE_DATE, inplace=True) data[vars.MA] = (10 * data[vars.AMOUNT] / data[vars.VOL]).map(FORMAT).astype('float') # # data['ma5']=(10*(data.groupby(vars.TS_CODE)[vars.AMOUNT].rolling(5,min_periods=5).sum())/(data.groupby(vars.TS_CODE)[vars.VOL].rolling(5,min_periods=5).sum())).map(FORMAT).astype('float') data = Ma(data, N) data = Ma(data, M) Z = data.groupby(vars.TS_CODE)[vars.HIGH].rolling(10).max().reset_index( level=0).rename(columns={vars.HIGH: '%s10' % vars.HIGH}) data = data.merge(Z[['%s10' % vars.HIGH]], left_index=True, right_index=True, how='inner') Z = data.groupby(vars.TS_CODE)[vars.LOW].rolling(60).min().reset_index( level=0).rename(columns={vars.LOW: '%s60' % vars.LOW}) data = data.merge(Z[['%s60' % vars.LOW]], left_index=True, right_index=True, how='inner') Z = data.groupby(vars.TS_CODE)[vars.HIGH].rolling(3).max().reset_index( level=0).rename(columns={vars.HIGH: '%s3' % vars.HIGH}) data = data.merge(Z[['%s3' % vars.HIGH]], left_index=True, right_index=True, how='inner') data['next_1_ma%s' % M] = data.groupby( vars.TS_CODE)['%s%s' % (vars.MA, M)].shift(-1) data['next_2_ma%s' % M] = data.groupby( vars.TS_CODE)['%s%s' % (vars.MA, M)].shift(-2) data['pre_ma2'] = data.groupby(vars.TS_CODE)[vars.MA].shift(2) # 我的方法,每日涨幅限制,三日收盘与五日均价关系 # res=cl.process(data,[lambda x:(abs(x[vars.PCT_CHG])<1)&(x[vars.CLOSE]>x['ma5']),lambda x:abs(x[vars.PCT_CHG])<1,lambda x:(abs(x[vars.PCT_CHG]<1)&(abs(x[vars.CLOSE]/x['ma5']-1)<0.01))],st=True,next_day=0) # 10dhigh>60dlow*120%,最近一日low<ma5,high-ma5>ma5-low, # 三天内,每日均价在三日均价的0.99-1.01(0.985-1.015) # 最后一天十日最高价大于60日最低价*1.2,最低价小于5日均价,最高价-五日均价大于五日均价-最低价。(补充十日最高价大于三日最高价,却过滤掉部分好数据 res = cl.process(data, [ lambda x: x[vars.MA] > x['pre_ma2'], lambda x: x[vars.MA] > x['pre_ma2'], lambda x: x[vars.MA] > x['pre_ma2'], lambda x: x[vars.MA] > x['pre_ma2'], lambda x: x[vars.MA] > x['pre_ma2'], lambda x: x[vars.MA] > x['pre_ma2'], cl.NR, cl.NR, lambda x: abs(x[vars.MA] / x['next_2_ma%s' % M] - 1) < 0.015, lambda x: abs(x[vars.MA] / x['next_1_ma%s' % M] - 1) < 0.015, lambda x: (abs(x[vars.MA] / x['ma%s' % M] - 1) < 0.015) & (x['high10'] > (1.2 * x['low60'])) & (x[vars.LOW] < x['%s%s' % (vars.MA, N)]) & ( (x[vars.HIGH] - x['%s%s' % (vars.MA, N)]) > (x['%s%s' % (vars.MA, N)] - x[vars.LOW])) ], st=True, next_day=0) save_data(res, '横盘%sprema2.csv' % start_date) print(res.describe()) # performance = pd.DataFrame() # performance['pct'] = pd.Series(cl.performance(res, data)).map(FORMAT) # save_data(performance, '横盘%s表现.csv' % start_date) # # data['vol5']=data.groupby(vars.TS_CODE)[vars.VOL].rolling(5).sum() # save_data(cl.open_cut(res), '横盘%s表现.csv' % start_date, mode='a') return