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 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 yunei(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['limit'] = data.apply(lambda x: 1 if x['close'] == x['up_limit'] else 0, axis=1) data['down']=data.apply(lambda x: 1 if x['close'] == x['down_limit'] else 0, axis=1) pre = basic().pre_data(data, label=['limit'], pre_days=2) data = data.merge(pre[['ts_code', 'trade_date', 'pre_2_limit']], on=['ts_code', 'trade_date']) pre=basic().pre_data(data,label=['pct_chg'],pre_days=1) data = data.merge(pre[['ts_code', 'trade_date', 'pre_1_pct_chg']], on=['ts_code', 'trade_date']) print(data.shape) data = data.loc[data['pre_2_limit'] == 1] print(data.shape) data = data.loc[data['pre_1_pct_chg'] <-5] print(data.shape) # # 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) print(data.describe()) # wool=sheep.wool(data,rawdata) return data
def __init__(self, start_date=None, end_date=None, days=1): self.start_date = start_date self.end_date = end_date self.raw_data = read_data('daily',start_date=self.start_date,end_date=self.end_date) self.stk_limt=read_data('stk_limit',start_date=self.start_date,end_date=self.end_date) self.basic=read_data('stock_basic') self.basic=self.basic.loc[self.basic['list_date']>=start_date] self.raw_data=self.raw_data.loc[self.raw_data['ts_code'].isin(self.basic['ts_code'])]
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 limit_stock(start_date=None, end_date=None, limit_type='up'): """ 基础价格&涨跌停价格 """ if start_date is None: start_date=cal(end=end_date) data = read_data(table_name='daily', start_date=start_date, end_date=end_date) stk_limit = read_data(table_name='stk_limit', start_date=start_date, end_date=end_date) data = data.merge(stk_limit, on=['ts_code', 'trade_date']) if limit_type == 'both': return data return data[data['close'] == data['%s_limit' % limit_type]]
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)
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 fina(self): ''' 主营业务构成 @return: ''' self.fina_mainbz = read_data('fina_mainbz', ) count = 1 for vars.TS_CODE in self.raw_data[vars.TS_CODE]: count += 1 if count % 50 == 0: time.sleep(60) self.fina_mainbz.append( pro.fina_mainbz(period='20200630', ts_code=vars.TS_CODE, type='P')) counter_all, counter_growth = dict(), dict() for seg in self.fina_mainbz['bz_item']: counter_all[seg] = counter_all.get(seg, 1) + 1 counter_all = sorted(counter_all.items(), key=lambda value: value[1], reverse=True) for seg in self.fina_mainbz[self.fina_mainbz[vars.TS_CODE].isin( self.growth_data[vars.TS_CODE])]['bz_item']: counter_growth[seg] = counter_growth.get(seg, 1) + 1 counter_growth = sorted(counter_growth.items(), key=lambda value: value[1], reverse=True) self.wc(counter_all, '主营业务.jpg') self.wc(counter_growth, '增长股票主营业务.jpg') 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 dis(data,model): start_date=data['trade_date'].min() end_date=data['trade_date'].max() res=pd.DataFrame() rawdata = read_data('daily', start_date=start_date, end_date=end_date) return
def detection(ts_code, end, start=7): start_date = (datetime.datetime.strptime(end_date, '%Y%m%d') - datetime.timedelta(start)).strftime('%Y%m%d') vector = read_data('daily', start_date=start_date, end_date=end) vector = vector.loc[vector['ts_code'] == ts_code].copy().sort_values( vars.TRADE_DATE) check_list = [ n_n, [red_line_limit, red_t_limit, ord_limit], [green_line_limit, green_t_limit, green_block] ]
def line_stock(): raw_data=read_data('daily',start_date=start_date,end_date=end_date) data=raw_data.loc[raw_data['low']==raw_data['high']] print(data.shape) list_days=basic().list_days(data) print(list_days.shape) data=data.merge(list_days,on=['ts_code','trade_date']) res1=sheep.wool2(data.loc[data['pct_chg']>0],raw_data,) res2=sheep.wool2(data.loc[data['pct_chg']<0],raw_data) print(res1.describe()) print(res2.describe()) 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 func1(data, modes, day): ''' 给入股票数据,返回后续表现 @param data: dataframe,股票代码,交易日期 @param mode: 表现方式 @return: dataframe股票后续表现 ''' start, end = data['trade_date'].min() raw_data = read_data('daily', start_date=start) # mode=[close,open,high,mean,low,pct_chg,low_open,high_open] for mode in modes: if mode in ['open', 'close', 'high', 'low']: pass else: # if mode not in ['low_open', 'high_open']: pre = basic().pre_data(data, label=[mode], pre_days=day) raw_data = raw_data.merge( pre[['ts_code', 'trade_date', 'pre_%s_%s' % (day, mode)]], on=['ts_code', 'trade_date']) print('%s/pre_close' % mode, raw_data['pre'])
def func2(): data = read_data('stock_basic')
from keras import layers, Sequential, optimizers, losses from sklearn.cluster import KMeans import numpy as np import pandas as pd import stock.util.basic as basic import tensorflow as tf from stock.sql.data import save_data,read_data start_date='20170101' end_date='20170111' k=4 raw_dataset =read_data('daily',start_date=start_date,end_date=end_date) # t=basic.basic().pre_data(raw_dataset,label=['close'],new_label=['close_5'],pre_days=-5) # raw_dataset=raw_dataset.merge(t,on=['ts_code','trade_date']) # raw_dataset['5_pct_chg']=round(raw_dataset['close_5']/raw_dataset['close']-1) dataset=np.array(()) for code in raw_dataset['ts_code'].unique(): df=raw_dataset.loc[raw_dataset['ts_code']==code] for i in range(df.shape[0]-5): dataset=np.append(dataset,df.iloc[i:i+5,2:].values.reshape((1,-1))) # print(dataset.shape) dataset=dataset.reshape((-1,45)) print('dataset',dataset.shape) # # # 切分为训练集和测试集 # train_dataset = dataset.sample(frac=0.8, random_state=1)
import pandas as pd import datetime import tushare as ts # from numpy import arange # import stock.util.sheep as sheep # import stock.limit_up.get_limit_stock as gls from stock.sql.data import save_data, read_data pro = ts.pro_api() START, END = '20170101', '20200331' # #股票公告 # 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)
from stock.sql.data import read_data import stock.util.vars as sv def slope(s): return s.iloc[0] / s.iloc[-1] if s.iloc[-1] else -1 def asymptote(df, N, similarity=0.8, labels=[sv.CLOSE, sv.OPEN, sv.MA]): """ @param df: datafram,传入股票数据 @param N: int,最短天数 @param similarity: float,落在线内的股票占比 @return: dataframe,股票代码,符合条件的开始结束时间 """ df.sort_values('trade_date', ascending=False, inplace=True) for l in labels: if l in df.columns: z = df.groupby('ts_code')[l].expanding(N).apply(slope, raw=False) return df if __name__ == '__main__': df = read_data('daily', start_date='20200601', end_date='20201231') res = asymptote(df, 2, labels=[sv.CLOSE])
def red_t_limit(x): return (x[vars.OPEN] == x[vars.CLOSE]) & ( x[vars.OPEN] == x[vars.UP_LIMIT]) & (x[vars.LOW] < x[vars.CLOSE]) def up_limit(x): return x[vars.CLOSE] == x[vars.UP_LIMIT] start = '20200101' end = '' raw_data = read_data('daily', start_date=start, end_date=end).merge(read_data('stk_limit', start_date=start, end_date=end)[[ vars.TS_CODE, vars.TRADE_DATE, vars.UP_LIMIT, vars.DOWN_LIMIT ]], on=[vars.TS_CODE, vars.TRADE_DATE]) print(raw_data.shape) list_days = basic().list_days(raw_data, list_days=30) raw_data = raw_data.merge(list_days, on=[vars.TS_CODE, vars.TRADE_DATE]) print(raw_data.shape) def statistic(data, condition): if condition == process: res = process(raw_data, [up_limit, up_limit], next_day=0) else: res = data.loc[condition(data)]
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
import matplotlib.pyplot as plt from stock.sql.data import save_data, read_data from stock.util.basic import basic pro = ts.pro_api() TEST = pro.fina_mainbz(ts_code='600538.SH') start_date = '20200301' end_date = '20200331' # for market in ['msci','csi','sse','szse','cicc','sw','oth']: # index=pro.index_basic(market=market) # if index.loc[index['name'].str.contains('口罩')].empty: # continue # else: # print() limit = read_data('limit_list', start_date=start_date, end_date=end_date) 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
import pandas as pd from functools import partial from stock.sql.data import read_data, save_data, cal import stock.util.basic as basic # 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()
from stock.sql.data import read_data,save_data import stock.util.sheep as sheep # 年报计划 buy_date='20190101' need_date='20191231' end_date='20190630' # 公告日期 disclosure=ts.pro_api().disclosure_date(end_date=need_date,fields='ts_code,ann_date,end_date,pre_date,actual_date,modify_date') # 解禁 # share_float=ts.pro_api().share_float(ts_code='300617.SZ' ) # 分红送股 dividend=ts.pro_api().dividend() dividend=dividend.loc['dividend'].[] disclosure=disclosure.loc[(disclosure['pre_date']>=need_date)&(disclosure['pre_date']<=end_date)].copy() # print(disclosure.shape,disclosure['ts_code'].unique().shape) data=read_data('daily',start_date=buy_date,end_date=end_date) # disclosure res=pd.DataFrame() for ts_code in disclosure['ts_code'].unique(): df=data.loc[data['ts_code']==ts_code].copy() df.sort_values('trade_date',inplace=True) df['buy_date']=df['trade_date'].shift(5) df['buy_price']=df['close'].shift(5) res=pd.concat([res,df],ignore_index=True) disclosure['trade_date']=disclosure['pre_date'] disclosure.sort_values('trade_date',ascending=False,inplace=True) print(disclosure.shape) disclosure=disclosure[['ts_code','trade_date']].drop_duplicates() print(disclosure.shape,disclosure['ts_code'].unique().shape)
# selling = 'close' # 开盘非涨停,涨停,红盘,绿盘,跌停 open_res = [cl.NR,cl.open_not_limit,cl.open_red, cl.open_green,cl.open_up_limit,cl.open_down_limit] con = [cl.up_limit,cl.up_limit,cl.n_n] pre_1 = [] start_date = '20%s0101' end_date = '20%s1231' 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:
def __init__(self, start, end): self.start = start self.end = end self.raw_data = read_data('daily', start_date=start, end_date=end)
# res['product']=[res.loc[:,'pct']].cumprod() return res 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)
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