注:MapReduce环境配置,Jar包导出,上传,hadoop执行等操作可以查看文章:MapReduce程序设计,只需替换为本篇文章的代码即可实现/m0_69488210/article/details/131432125数据集:/download/m0_69488210/87959387
(资料图片仅供参考)
1、滚动收益率计算方法:(1) 忽略N/A所在日的股票数据,思考:可使用插值算法填充异常N/A数据,但退市股票同样会造成N/A数据,需要识别那种数据是退市造成的,而哪种数据是异常形成的。(2)第t日的5日滚动收益Rt= (C_t - C_(t-5) ) / C_(t-5) ,Ct:第t日收盘价 Rt:第t日滚动收益(3) 5日滚动正收益率所有交易日的5日滚动收益为正(赚钱)的概率
所有计算忽略非交易日(节假日)
2、二次排序和组排序MapReduce中的二次排序是指在MapReduce任务中对键值对进行排序时,除了根据键进行排序之外,还可以根据值进行排序。在二次排序中,首先按照键进行排序,然后对于具有相同键的按照指定的值进行排序,最终输出排序后的键值对序列。组排序是将Map任务输出的键值对按照key进行排序并分组,具有相同key的键值对会被划分到同一组,并发送给同一个Reduce任务进行处理。这就确保了拥有相同key的键值对能够在Reduce阶段被合并处理,从而得出结果。
3、基本代码逻辑要求:(1) CodeTimeTuple implements WritableComparable封装一个代码时间类,用以在键中存放股票代码和时间,用以按股票和时间进行二次排序;定义key排序比较器,按股票代码进行一次排序,按时间进行二次排序
(2) Map extends Mapper
输入:一行数据(一只股票的日数据)
处理:使用 \t 将字符串split成数组,提取需要计算的值,并转为浮点数
输出:<代码时间对象, 收盘价>
遇到无效数据不输出(停牌股票或有N/A数据无法提取为浮点数)
在Map阶段首先分割传入的每一行的信息,忽略空置,取出收盘价,股票代码和日期,把股票编号和日期封装到CodeTimeTuple的序列化对象tuple里,在map输出的时候,tuple作为键,收盘价为对应的值,在CodeTimeTuple类里实现了按照股票代码和时间的二次排序,保证传入reduce的是按照股票代码和时间二次排序之后的升序排序
(3) GroupSort extends WritableComparator
创建一个排序比较器,修改组排序逻辑,按股票代码排序
通过组排序保证了传入Reduce的数据是排序之后按照股票代码分组的数据,保证了reduce可以合并相同股票代码的数据
(4) Reduce extends Reducer
输入:<代码时间对象,[收盘价]>
处理:计算每个5日的滚动收益,并统计滚动收益为正的概率
输出:<股票代码,滚动收益为正的概率>
把传入reduce的值存入到列表中,通过Rt= (C_t - C_(t-5) ) / C_(t-5)计算第t日的5日滚动收益,依次判断每个股票代码对应的所有的五日滚动收益是否为正,把正数的数量除以相同股票代码的所有数量就可以得到每个股票代码的5日滚动收益为正(赚钱)的概率,reduce输出的键为股票代码,值为每个股票代码的5日滚动收益为正(赚钱)的概率。
Copyright 2015-2022 北冰洋晨报网 版权所有 备案号:沪ICP备2020036824号-3 联系邮箱:562 66 29@qq.com