股票打板策略分析 这里我们只分析一件事情,就是如何打板才能最大概率赚到钱,就是我们可以分析过去一天涨停今天还涨停、分析过去两天涨停今天涨的概率,一直到过去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 就可以分区感知,自动读取,否则的话比较麻烦,效果如下
这里有一个地方要注意一下,那就是你可以打开某一天的文件夹,你会发现下面有很多小文件
其实这里我们知道我们每一天的数据量其实很小,所以我们可以针对这些小文件做一下处理,就是在DataFrame 写出的时候调用一下,repartition 或者coalesce 方法,最后的效果如下
分析涨停的分布情况 上面我们统计出了截止每一天的过去10天的连续涨停数据,接下来我们就统计一下涨停的分布,首先我们先看一下我们的数据
这里我们的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)} 复制
计算结果
我们可以看到在8连板之后买入涨停的概率最大,所以打板的小伙伴们,不要在打三连板了,网上很多大佬告诉你打三连板,哈哈!
总结 股市有风险,入市需谨慎,学习无限好,从此自由活
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报 。