股票打板策略分析

股票打板策略分析

这里我们只分析一件事情,就是如何打板才能最大概率赚到钱,就是我们可以分析过去一天涨停今天还涨停、分析过去两天涨停今天涨的概率,一直到过去10天涨停今天涨的概率,其实很多人都喜欢打板,但是可能大家都没分析过打板的胜率。

前面我们已经可以筛选出截止到特定日期的过去10天中的连续涨停了,这里我们只需要将所有日期过去10日的连续涨停计算出来就可以作为我们的数据源,然后计算统计个数算分布就可以了,至于如何计算连续涨停可以参考股票数据分析

计算历史数据的涨停情况

我们今天的打板分析,是在昨天的基础上,这里我们真的是需要一个for 循环了,循环所有日期

def main(args: Array[String]): Unit = {
    
    
    val data=spark
      .read
      .option("header", true)
      .csv(path)
      .select("ts_code","trade_date","open","high","low","close","pre_close","change","pct_chg","vol","amount")

    // close 收盘价   pre_close 昨收价  change 涨跌额  pct_chg 	涨跌幅   vol 成交量 (手)  amount	 成交额 (千元)
    data.createOrReplaceTempView("trade")

    val stocks=spark
      .read
      .option("header", true)
      .csv(stocksPath)
    stocks.createOrReplaceTempView("stocks")

    val dates=spark
      .read
      .option("header", true)
      .csv(datesPath)
    dates.createOrReplaceTempView("dates")



    val start=LocalDate.of(2018,1,1)
    val loop = new Breaks;
    val pattern=DateTimeFormatter.ofPattern("yyyyMMdd")
  	// 循环的日期
    loop.breakable{
    
    
      for(i<- 1 to 2000){
    
    
        val lastDate = start.plusDays(i).format(pattern)
        val startDate=LocalDate.parse(lastDate,pattern).plusDays(-30).format(pattern)
        lastContinueDays(lastDate,startDate)
        if(lastDate.equals("20211104")){
    
    
          loop.break
        }
      }
    }

  }
  
	// 算出截止lastDate过去10天内,连续涨停的情况
  def lastContinueDays(lastDate:String,startDate:String): Unit ={
    
    
    println(s"业务时间: '${startDate}' '${lastDate}'")
    // 首先选出涨停的票
    sql(
      s"""
        |select
        |  ts_code,trade_date,$lastDate as end_date
        |from(
        |   select
        |      ts_code,trade_date,open,high,low,close,pre_close,change,pct_chg,vol,amount,row_number() over(partition by ts_code order by trade_date desc) as rn
        |   from
        |      trade
        |   where
        |     -- 时间要换掉 大致的过滤条件
        |     trade_date>='${startDate}'
        |     and trade_date<='${lastDate}'
        |)tmp
        |where
        |   -- 过去10条记录(这里注意一下不一定是过去10天的)
        |   rn<=10
        |   -- 涨停的数据
        |   and pct_chg>=9.8
        |""".stripMargin

    ).createOrReplaceTempView("zhangting")

    sql(
      """
        |select
        | ts_code,trade_date,end_date,zt_cnt
        |from(
        | select
        |  ts_code,
        |  trade_date,
        |  end_date,
        |  zt_cnt,
        |  row_number()over(partition by ts_code order by zt_cnt desc) as rn
        | -- 筛选出 zt_cnt最大的记录
        | from(
        |  select
        |    a.ts_code,
        |    a.trade_date,
        |    a.end_date,
        |    count(distinct b.trade_date) as zt_cnt
        |  from
        |   zhangting a
        |  left join
        |   zhangting b
        |  on
        |   a.ts_code=b.ts_code
        |   and a.trade_date<=b.trade_date
        |   and a.end_date>=b.trade_date
        |  left join
        |    dates dates
        |  on
        |    dates.cal_date>=a.trade_date
        |    and dates.cal_date<=a.end_date
        |    -- 是否是交易日
        |    and dates.is_open=1
        |  group by
        |   a.ts_code,a.trade_date,a.end_date
        |  having
        |   count(distinct b.trade_date)=count(distinct dates.cal_date)
        | )t
        |)t
        |where
        | rn=1
        |order by
        | zt_cnt
        |""".stripMargin
    )
      .write
      .format("parquet")
      .mode(SaveMode.Overwrite)
      .save(s"/Users/gemii/Desktop/data/day=${lastDate}")
  }

这个代码主要是我们以前讲的SQL,今天的话主要是配合了for循环,唯一要注意的是我们s"/Users/gemii/Desktop/data/day=${lastDate}" 这个路径,文件的命名方式是分区的处理,后面在读取的时候spark 就可以分区感知,自动读取,否则的话比较麻烦,效果如下

image-20211105145332352

这里有一个地方要注意一下,那就是你可以打开某一天的文件夹,你会发现下面有很多小文件

image-20211105145450703

其实这里我们知道我们每一天的数据量其实很小,所以我们可以针对这些小文件做一下处理,就是在DataFrame 写出的时候调用一下,repartition 或者coalesce 方法,最后的效果如下

image-20211105145708764

分析涨停的分布情况

上面我们统计出了截止每一天的过去10天的连续涨停数据,接下来我们就统计一下涨停的分布,首先我们先看一下我们的数据

image-20211105152823303

这里我们的end_date就是我们的业务日期,day是分区信息,所以end_date和day是相等的,zt_cnt是连续涨停的天数,1 就代表只有end_date那天是涨停的

我们想算的是在n连涨的情况下n+1 连涨的概率,我们只需要统计出n连涨的个数和n+1连涨的个数即可。

  def daBan(): Unit ={
    
    
    
    val data=spark
      .read
      .parquet("/Users/gemii/Desktop/data")

    data.createOrReplaceTempView("daban")

    sql(
      """
        |select
        |   zt_cnt,
        |   cnt,
        |   concat(cast(round(cnt/lag(cnt)over(order by zt_cnt)*100,2) as string),"%")  rate
        |from(
        |   select
        |     zt_cnt,
        |     count(ts_code) as cnt
        |   from
        |      daban
        |   group by
        |    zt_cnt
        |)
        |order by
        |   zt_cnt
        |""".stripMargin
    ).show(2000,false)
  }

计算结果

image-20211105171449714

我们可以看到在8连板之后买入涨停的概率最大,所以打板的小伙伴们,不要在打三连板了,网上很多大佬告诉你打三连板,哈哈!

总结

股市有风险,入市需谨慎,学习无限好,从此自由活

猜你喜欢

转载自blog.csdn.net/king14bhhb/article/details/121167166
今日推荐