股票数据分析 中国黄金股票连续涨停原因分析
前面我们介绍了Spark 和 Spark SQL,今天我们就使用 Spark SQL来分析一下我们的数据,今天我们主要分析一下股票数据
数据准备这里郑重申明,我们的全部数据来自tushare, tushare 是一个免费提供各类金融数据 , 助力智能投资与创新型投资的社区,也鼓励大家对社区多多支持和赞助。
交易数据我们拿到了最近几年的交易数据
下面是具体的数据格式,csv 文件,ts_code 对于的是一个股票代码
股票详情数据 日期数据因为股票市场不是天天开的,只有交易日才开门,下面就是我们的交易日数据
数据分析当然这里我们的分析并不是教大家去怎么买卖股票,我们的目标是为了学习Spark ,所以我们下面就有一些例子,当然大家也可以自行去补充
统计每天的成交额下面我们统计一下每天的成交额,这也是最简单的了
def lastDaysamount(): Unit ={ sql( """ |select | trade_date,sum(amount) as amount |from | trade |group by | trade_date |order by | trade_date desc |limit | 20 |""".stripMargin ).show(20,false) }统计结果
+----------+---------------------+|trade_date|amount |+----------+---------------------+|20231101 |1.2228828557399983E12||20231029 |1.1381616219410015E12||20231028 |1.1072842704220002E12||20231027 |1.0765778557610035E12||20231026 |1.0821421444879968E12||20231025 |1.0145576773829996E12||20231022 |1.0149981487659999E12||20231021 |9.92753188046003E11 ||20231020 |1.0197585589460028E12||20231019 |9.730877555890015E11 ||20231018 |1.0019797845380023E12||20231015 |9.888019904729999E11 ||20231014 |8.606463289579985E11 ||20231013 |8.894112029519983E11 ||20231012 |9.962537488750033E11 ||20231011 |9.918985312839995E11 ||20231008 |1.0603440896720006E12||20230930 |9.502251816350017E11 ||20230929 |1.0775000013559976E12||20230928 |1.043524548934001E12 |+----------+---------------------+ 过去n天连续涨停的票这个分析是这样的,用户输入一个数字n则代表的是过去n天,我们要做的的是筛选出过去连涨停n天、连涨停n-1天、连涨停n-2天一直到n-(n-1)天连续涨停的票,其实这个实现起来还是有一定难度的,因为这里有个累积的效果,而且就是连续涨停n天的票一定是涨停n-1天的,但是我们需要将它算在n 天里而不是n-1天,还 有就是我们的连续涨停是相对昨天的,例如昨天前天就是连续两次涨停,昨天前天大前天就是连续三次涨停。
数据准备 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") // 连续涨停的方法 lastContinueDays(5)} for循环实现因为直接使用SQL很难实现,所以我们这里使用了混合编程的方式,也就是借助scala 的for 循环和SQL 来配合实现
/** * * @param n 连续多少天 */def lastContinueDays(n:Int): Unit ={ // 因为我们的n 是指n个交易日的数据,这里为了方便所以我们直接多取了一段时间的数据,直接来了个2倍,好的做法是你取dates 里面查 val startDate = LocalDate.now().plusDays(-2*n).format(DateTimeFormatter.ofPattern("yyyyMMdd")) // 创建了一个空的实图,后面需要把for 循环里面的数据放到这个试图里面 sql( """ |select | 0 as days,null as ts_code,null as name,null as industry,null as market |""".stripMargin ).createOrReplaceTempView("base") // 循环实现上面的效果 for(i版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。