第一步:选出今天的开盘价、收盘价、换手率大于昨天的开盘价、收盘价、换手率的股票;用concat将今天和昨天两天的股票加载到一个DataFrame,用
groupyby 选出今天的和昨天的开盘价、收盘价和换手率,再用merge()函数将昨天和今天的股票并到一起求今天和昨天开盘价、收盘价和换手率之差;
选出今天的开盘价、收盘价、换手率大于昨天的开盘价、收盘价、换手率的股票;
import pandas as pd
dates1=[20161115,20161116]
pieces1=[]
for date in dates1:
path='A_stock/overview-push-%d/stock overview.csv'%date
data1=pd.read_csv(path,encoding='gbk')
pieces1.append(data1)
data1=pd.concat(pieces1,ignore_index=True)
index_data_A=data1[['股票代码','交易日期','开盘价','收盘价','换手率']]
index_data_A.交易日期=pd.to_datetime(index_data_A.交易日期)
index_data_A=index_data_A.set_index('交易日期')
index_data1=index_data_A.groupby(['股票代码']).last()
index_data2=index_data_A.groupby(['股票代码']).first()
index_data1=index_data1.reset_index()
index_data2=index_data2.reset_index()
index_data_A=pd.merge(index_data1,index_data2,on='股票代码')
index_data_A['开盘价差']=index_data_A.开盘价_x-index_data_A.开盘价_y
index_data_A['收盘价差']=index_data_A.收盘价_x-index_data_A.收盘价_y
index_data_A['换手率差']=index_data_A.换手率_x-index_data_A.换手率_y
index_data_A=index_data_A[(index_data_A.开盘价差>0)&(index_data_A.收盘价差>0)&(index_data_A.换手率差>0)]
第二步:重复第一步,选出昨天的收盘价、开盘价、换手率大于前天的收盘价、开盘价、换手率的股票;
dates2=[20161114,20161115]
pieces2=[]
for date in dates2:
path='A_stock/overview-push-%d/stock overview.csv'%date
data2=pd.read_csv(path,encoding='gbk')
pieces2.append(data2)
data2=pd.concat(pieces2,ignore_index=True)
index_data_B=data2[['股票代码','交易日期','开盘价','收盘价','换手率']]
index_data_B.交易日期=pd.to_datetime(index_data_B.交易日期)
index_data_B=index_data_B.set_index('交易日期')
index_data3=index_data_B.groupby(['股票代码']).last()
index_data4=index_data_B.groupby(['股票代码']).first()
index_data3=index_data3.reset_index()
index_data4=index_data4.reset_index()
index_data_B=pd.merge(index_data3,index_data4,on='股票代码')
index_data_B['开盘价差']=index_data_B.开盘价_x-index_data_B.开盘价_y
index_data_B['收盘价差']=index_data_B.收盘价_x-index_data_B.收盘价_y
index_data_B['换手率差']=index_data_B.换手率_x-index_data_B.换手率_y
index_data_B=index_data_B[(index_data_B.开盘价差>0)&(index_data_B.收盘价差>0)&(index_data_B.换手率差>0)]
index_data=pd.merge(index_data_A,index_data_B,on='股票代码')
第三步:将今天的数据与前面merge出来的数据再merge,然后按照今天的流通市值等指标筛选出符合要求的股票:
data=pd.read_csv('a_stock/overview-push-20161116/stock overview.csv',encoding='gbk')
#data=data[data['MACD_金叉死叉']=='金叉']
#data=data[(data.MACD_DIF<0) & (data.MACD_DEA <0)]
#data=data[(abs(data.MACD_DIF)<0.1) & (abs(data.MACD_DEA) <0.1) ]
data=data[(data['开盘价']<data['MA_5'])|(data['开盘价']<data['MA_30'])|(data['开盘价']<data['MA_20'])|(data['开盘价']<data['MA_10'])|(abs(data.开盘价-data.MA_5)<0.1)]
#data=data[(data['收盘价']>data['MA_60'])&(data['开盘价']<data['MA_60'])]
data=data[data.流通市值<10000000000]
#data=data[data.市盈率TTM<60]
#data=data[data.换手率>0.02]
#data=data[data.涨跌幅<0.05]
#data=data[str(data.股票代码).get(2) ==6]
data=data.sort('换手率',ascending=False)
data=data[['股票代码','股票名称','换手率','涨跌幅', '流通市值','市盈率TTM','市销率TTM','市现率TTM','市净率','收盘价','开盘价']]
data=pd.merge(data,index_data,on='股票代码')
data=data[['股票代码','股票名称','换手率','涨跌幅', '流通市值','市盈率TTM','市销率TTM','市现率TTM','市净率']]
data=data[data['股票代码'].str.contains('sz0')|data['股票代码'].str.contains('sh6')] #选取某列中不含某些字符的数据
data
第四步:如果前三步筛选出的股票比较多,用第四步来加载前一段时间(一个月/半年)换手率和涨跌幅标准差由低到高排序的股票,找出前段时间换手率无波动;换手率突然放大的股票;
import pandas as pd
dates=range(20161010,20161116)
pieces=[]
for date in dates:
try:
data1=pd.read_csv('A_stock/overview-push-%d/stock overview.csv' %date, encoding='gbk')
pieces.append(data1)
except OSError:
pass
continue
data1=pd.concat(pieces)
data1=data1[['股票代码','股票名称','换手率','涨跌幅']].groupby(['股票代码']).std()
data1=data1.reset_index()
#data1.shape
data2=pd.merge(data,data1,on='股票代码').sort('换手率_y')
data2
这一策略的最终目标是为了寻找在起步阶段突然连续三天有微放量的股票,如果股票前期很平稳,突然开盘价、收盘价、换手率上升,配合均线法则,则成功率较高。