用第三方库tushare之前,在anconda promt输入 pip install tushare
pip install tushare
下载好库之后,我们需要去tushare大数据社区注册账号,新人完善下基本信息,即可免费调取足量的数据。
完善好信息后,进入个人主页页面-接口token,复制里面的代码,即可进入接下来的api初始化了。
ts.set_token('******')
pro=ts.pro_api()
token值(*****)这里输入自己刚才复制的代码即可。
获取某只股票代码如:ts.get_hist_data('600058') ,参数可以设置起始和截至日期,tushare给我们提供了近3年的数据,写一些基本的策略验证对于前期的新手是足够的。
拿到基础数据之后,我们需要对数据进行初步加工。比如这里日期最新的开头,所以我们需要调换下顺序。同时可以取出我们需要的列数据,方便查看。
df.sort_index(ascending=True,inplace=True)
df=df[['open','high','close','low','p_change','volume']]
拿到简单加工后的数据就可以计算出我们策略需要的指标和数据了。我这里调用自己写的MACD指标。函数会对原数据直接修改,不需要重新定义变量。
def getmacd(data,short=12,long=26,dea=9,close='收盘价'):
data['EMA_short']=data['close'].ewm(span=short).mean()
data['EMA_long']=data['close'].ewm(span=long).mean()
data['dif']=data['EMA_short']-data['EMA_long']
data['dea']=data['dif'].ewm(span=dea).mean()
data['macd']= (data['dif']-data['dea'])*2
return data
getmacd(df,close=df['close'])
后面的代码便是对箱体的数据描述了,我这里把箱体定义成前后10天内涨幅不超过5个点,收盘价不超过10前面10天的最高点,同时加入了一些自己定义的指标,比如某天成交量的放大。定义完所有条件后,我们需要找出对应的日期。即用条件去控制:
cond1=df['p_change'].rolling(10).sum()<5.0
cond2=df['dif']>0
cond3=(df['high']>df['10日箱体顶部'])&(df['high'].shift(1)df['close'].rolling(10).mean()
cond6=df['K']>df['K'].shift(1)
df.loc[cond1&cond2&cond3&cond4&cond5&cond6,'突破箱体']=1
按照正常思维,我们希望他阶段性突破一个压力位是希望他放量出来的,否则容易被假象欺骗,那么我们再定义一个指标,突破箱体当天的成交量是放大的,而且箱体中,会伴随着一些天数的成交量变动,感受到是否有资金悄悄接受筹码。我这里采用10日平均成交量作为一个基准,大于这个量便认为有资金入场。
df.loc[df['volume']>df['volume'].rolling(10).mean(),'主力介入']=1
df.loc[df['突破箱体']==1,'主力介入']=1
df=df[df['主力介入'].isin([1])]
df.reset_index(inplace=True)
到这里已经接近完成了。我们可以看到出现很多次资金放量。但是突破了箱体只有一次。
但这一次也还没有完成我们的结果。我想选出这突破的当天,他前面箱体内是出现多次放量的。这里我以基础3为标准,即突破前10天内出现至少出现3次的量能波动。我们只需要将主力介入为NaN的地方填充为0,变可以方便我们计算。
df['主力介入'].fillna(0,inplace=True)
df['波动']=df['主力介入'].rolling(10).sum()
这里可以看出,突破前只有2次量能波动.显然不符合我们预期。换个股票代码002412后看看结果。
打开东财去看看。
基本符合预期,那我们只需要加上最后一个条件,波动次数大于3就行。
df=df[df['波动']>3]
下面是完整代码,感兴趣的可以自行修改。
df=ts.get_hist_data('002412')
df.sort_index(ascending=True,inplace=True)
df=df[['open','high','close','low','p_change','volume']]
def getmacd(data,short=12,long=26,dea=9,close='收盘价'):
data['EMA_short']=data['close'].ewm(span=short).mean()
data['EMA_long']=data['close'].ewm(span=long).mean()
data['dif']=data['EMA_short']-data['EMA_long']
data['dea']=data['dif'].ewm(span=dea).mean()
data['macd']= (data['dif']-data['dea'])*2
return data
getmacd(df,close=df['close'])
df.loc[:,'9_high']=df['high'].rolling(9,min_periods=1).max()
df.loc[:,'9_low']=df['low'].rolling(9,min_periods=1).min()
df.loc[:,'RSV']=((df['close']-df['9_low'])/(df['9_high']-df['9_low']))*100
df.loc[:,'K']=df['RSV'].ewm(com=2).mean()
df.loc[:,'D']=df['K'].ewm(com=2).mean()
df['1日涨跌']=df['close'].shift(-1)-df['close']
df['3日涨跌']=df['close'].shift(-3)-df['close']
df['5日涨跌']=df['close'].shift(-5)-df['close']
df['10日涨跌']=df['close'].shift(-10)-df['close']
df=df[['open','high','close','low','p_change','volume','dif','K','1日涨跌','3日涨跌','5日涨跌','10日涨跌']]
df.loc[:,'10日箱体顶部']=df['close'].rolling(10).max()
cond1=df['p_change'].rolling(10).sum()<5.0
cond2=df['dif']>0
cond3=(df['high']>df['10日箱体顶部'])&(df['high'].shift(1)df['close'].rolling(10).mean()
cond6=df['K']>df['K'].shift(1)
df.loc[cond1&cond2&cond3&cond4&cond5&cond6,'突破箱体']=1
df.loc[df['volume']>df['volume'].rolling(10).mean(),'主力介入']=1
df.loc[df['突破箱体']==1,'主力介入']=1
# df=df[df['主力介入'].isin([1])]
df.reset_index(inplace=True)
df['主力介入'].fillna(0,inplace=True)
df['波动']=df['主力介入'].rolling(10).sum()
df=df[df['突破箱体'].isin([1])]
df=df[df['波动']>3]
df