一站式服务理念,商业网站最佳域名,微商城网站建设新闻,自己制作网站的软件在今年1月2日和1月3日#xff0c;旅游板块两支个股先后涨停#xff0c;此后一支月内三倍#xff0c;另一支连续6个涨停。事后复盘#xff0c;我们如何在1月2日第一支个股涨停之后#xff0c;通过量化分析#xff0c;找出第二支股#xff1f;
一个3倍#xff0c;一个6连…在今年1月2日和1月3日旅游板块两支个股先后涨停此后一支月内三倍另一支连续6个涨停。事后复盘我们如何在1月2日第一支个股涨停之后通过量化分析找出第二支股
一个3倍一个6连板 这是两支个股在2024年1月17日前60日收盘价图。图中红色虚线是个股启动时间。A大概是受董宇辉小作文、或者尔滨旅游热题材发酵带动于1月2日率先启动。
尽管A在半个月内股价接近3倍但从量化的角度目前还难以精准地实现事件驱动上涨这种类型的建模。但是如果我们在A启动之后在1月2日收盘前买入B就这次而言B次日开盘仍有买入机会连续收获6个涨停也完全可以满意。
现在我们就来复盘如何从A涨停到发现B。 首先运行策略的时间应该放在1430分之后此时对市场进行扫描找出首板涨停的个股。当日涨停数据在Akshare可以获得印象中它能区分首板涨停和连板。
对首板涨停的个股我们先获取它所在的概念板块。然后对每个板块的成员股进行遍历通过相关性分析找到关联度较高的个股。
如果仅仅是和龙头同在一个板块是无法保证资金眷顾的。而且一支个股往往身兼多个概念在极短的时间里要弄清楚究竟是炒的它的哪一个概念也不容易。不过通过数据挖掘我们可以完全不去理会炒作背后的逻辑 – 何况很多逻辑根本就是狗p不通。
我们用相关性检测来进行数据挖掘。 相关系数
在概率论和统计学中相关性(Correlation)显示了两个或几个随机变量之间线性关系的强度和方向。
通常使用相关系数来计量这些随机变量协同变化的程度当随机变量间呈现同一方向的变化趋势时称为正相关反之则称为负相关。
我们通过以下公式来计算两个随机变量之间的相关性 ρ X Y c o v ( X , Y ) σ X σ Y \rho_{XY} \frac{cov(X, Y)}{\sigma_X\sigma_Y} ρXYσXσYcov(X,Y)
这样定义的相关系数称作皮尔逊相关系数。一般我们可以通过numpy中的corrcoef或者scipy.stats.pearsonr来计算。
下面的代码演示了正相关、负相关和不相关的例子
# x0与x1正相关 与x2负相关 与x3分别为不同的随机变量
x0 np.random.normal(size100)
x1 10* x0 1
x2 -10 * x0 1
x3 np.random.normal(size100)x np.vstack((x0, x1, x2, x3))
rho np.corrcoef(x)fig, ax plt.subplots(nrows1, ncols3, figsize(12, 3))for i in [0,1,2]:ax[i].scatter(x[0,],x[1i,])desc Pearson: {:.2f}.format(rho[0,i1])ax[i].title.set_text(desc)ax[i].set(xlabelx,ylabely)plt.show()绘图时我们以 x 0 x_0 x0为x轴以 x i x_i xi为y轴如果 x 0 x_0 x0与 x 1 x_1 x1完全正相关那么将绘制出一条 4 5 。 45^。 45。向上的直线。这其实就是QQ-Plot的原理。 从左图过渡到右图只需要在 x 0 x_0 x0中不断掺入噪声即可。读者可以自己尝试一下。
皮尔逊相关系数要求只有变量之间是线性相关时它才能发现这种关联性。很多时候我们必须放宽条件为标的A上涨则B也跟着涨。但不管A涨多少B跟涨又是多少都不改变它们联系的强度。此时就要用Spearman相关性。 上面的例子演示的是皮尔逊相关系数的求法这里使用的是np.corrcoef。它的结果是一个矩阵所以上例中的变量rho其取值实际上是 在这个矩阵中对角线上的值是自相关系数显然它们都应该为1。实际上我们要得到时间序列 s 1 s_1 s1和 s 2 s_2 s2之间的相关系数应该取 ρ [ 0 ] [ 1 ] \rho[0][1] ρ[0][1]对 s 1 s_1 s1和 s 3 s_3 s3之间的相关系数应该取 ρ [ 0 ] [ 2 ] \rho[0][2] ρ[0][2]依次类推这些可以在代码第13行看到。
我们通过scipy.stats.spearmanr来计算Spearman相关。我们将通过真实的例子来进行演示。 发现强相关个股
假设我们已经拿到了概念板块的个股名单。现在我们两两计算它们与龙头个股之间的相关性如果相关系数在0.75以上我们就认为是强相关纳入备选池。
相关系数是一个无量纲的数取值在[-1,1]之间。因此可以把0.75看成具有75分位的含义
async def qqplot(x, y, n60, end):xbars await Stock.get_bars(x, n, FrameType.DAY, endend )ybars await Stock.get_bars(y, n, FrameType.DAY, endend)xclose xbars[close]yclose ybars[close]pearson scipy.stats.pearsonr(xclose, yclose)[0]spearman scipy.stats.spearmanr(xclose, yclose).statisticif pearson 0.75:returna, b np.polyfit(xclose, yclose, 1)ax plt.subplot(1,1,1)ax.scatter(xclose, yclose)ax.plot(xclose, a * xclose b)namex await Security.alias(x)namey await Security.alias(y)ax.title.set_text(f{namex} {namey} pearson: {pearson:.2f} spearman: {spearman:.2f})plt.show()假设现在是1月2日的下午2时已经能确认标的A不会开板。现在我们就拿它与板块内的其它个股逐一计算相关性排除掉弱相关的个股因为既然是弱相关那么它们就不会跟涨也不怎么跟跌在我A跟跌是必须的。
当我们使用 pearson 0.75的判断条件时在该板块的22支个股中筛选出5支个股。如果使用spearman 0.75来判断则只会选出4支并且这4支都在pearson筛选出的范围内。这里为排版美观起见只给出共同的4支 很幸运我们要找的标的正在其中。
你肯定想知道另外三支的结果如何。它们有连板吗有大幅下跌吗
没有下跌。别忘了我们是通过相关系数选出来的标的只要这种关联还存在即使不跟随上涨也不应该大幅下跌不是吗
实际上有一支在我们讨论的区间里持平一支上涨5%另一支最高上涨16.9%。但如果你有更高的期望在这个case中一点点看盘经验可以帮助我们过滤掉另外两只最终我们会买入上涨16.9%和6连板的股票。
这个看盘经验是不要买上方有均线特别是中长均线的股。这种股在上攻过程中将会遇到较大的抛压。如果一个很小的板块资金已经有了一到两个进攻的标的了是不会有多余的钱来关照这些个股的。
这个策略还有一个很好的卖出条件。如果龙头股一直保持上涨而个股的关联系数掉出0.75显然我们可以考虑卖出。如果龙头股出现滞涨开盘半小时内不能封住则也是离场时机。
这一篇我们讨论的是同一板块个股的相关性。如果是处在上下游的两个板块它们也可能存在相关性但会有延时。这种情况称作cross correlation。它应该如何计算又如何使用也许后面我们会继续探索。