126_Power BI中使用DAX计算股票RSI及股票均线相关
博客:www.jiaopengzi.com
一、背景
前些日子,有朋友在交流股票RSI用DAX处理的问题,由于RSI股票软件的算法几乎都是需要用到股票从上市第一天开始的所有数据。当期RSI的大小影响因素【close】随着时间往前推,时间越早影响因素会越小(后面会通过公式推导验证该结论),所以往往在计算RSI的时候也不会取从上市到当期的所有数据,对结果不造成绝对的影响。
先看下结果啥样子(其实就是股票软件的样子)

需要说明的是,笔者并非股票行业从业者,本案例目的是分享DAX如何处理RSI,我们不研究RSI如何用。
二、数据源&计算逻辑
1、数据源

2、RSI计算公式
参考(维基百科,如果打不开你懂得):

变形得到(笔者自定义变形,能看懂就好,其中up表示上涨,down表示下跌,ABS表示求绝对值,all表示上涨和下跌)

3、计算逻辑
LC表示昨日【close】
数据源中【diff】=close-LC
如下对6天的EMA做分解计算,
1、Y表示当期EMA结果,
2、在EMA(up)中X=MAX(close-LC,0),
3、在EMA(down)中X=ABS(MIN(close-LC,0)),
4、在EMA(all)中X=ABS(close-LC,0)。







其中X的角标和temp表中的【INDEX】相对应的。
要想计算EMA结果,就需要递归,但在DAX中目前笔者还没有找到办法来处理递归的问题。
于是我们加以思考
将上述表达式分别带入得到:
提一个1/6出来后得到

发现规律了吗?

最终推导得到k天指数平均6天的EMA

说明
这里补充文章最开始说的结论,不难看出,随着k的增加,时间越早
值越小,我们带入k=30,
=0.00421,和 5/6比起已经可以忽略不计了。所以“当期RSI的大小影响因素【close】随着时间往前推,时间越早影响因素会越小(后面会通过公式推导验证该结论),所以往往在计算RSI的时候也不会取从上市到当期的所有数据,对结果不造成绝对的影响。”
同时我们可以推导得出 k 天中 n 天指数平均EMA值

EMA的值可以通过X的迭代得到了,迭代在DAX中就好处理了。
三、上DAX
1、上面的temp表,中间过程便于观察,实际应用中不需要。
temp =
VAR T1 = ADDCOLUMNS (
ALL ( data ),
"INDEX",
VAR DATEAC1 = data[date]
VAR TP =FILTER ( ALL ( data ), data[date] < DATEAC1 )
RETURN
COUNTROWS ( TP )
)
VAR T2 =ADDCOLUMNS (
T1,
"diff",
VAR I = [INDEX] - 1
VAR PRE =CALCULATE ( SUM ( data[close] ), FILTER ( T1, [INDEX] = I ) )
RETURN IF ( PRE = BLANK (), BLANK (), data[close] - PRE )
)
return
T2
2、RSI6,其中N=12,N=24即可求得RSI12、RS24。
RSI6 =
VAR N = 6
VAR BN = ( N - 1 ) / N
VAR DATE_SELECT = MAX ( 'data'[date] )
VAR T1 = ADDCOLUMNS (
ALL ( data ),
"INDEX",
VAR DATEAC1 = data[date]
VAR TP =FILTER ( ALL ( data ), data[date] < DATEAC1 )
RETURN
COUNTROWS ( TP )
)
VAR T2 =ADDCOLUMNS (
T1,
"diff",
VAR I = [INDEX] - 1
VAR PRE =CALCULATE ( SUM ( data[close] ), FILTER ( T1, [INDEX] = I ) )
RETURN IF ( PRE = BLANK (), BLANK (), data[close] - PRE )
)
VAR T3 =FILTER ( T2, [date] <= DATE_SELECT )
VAR K =COUNTROWS ( T3 ) - 1
VAR T4 =ADDCOLUMNS (
T3,
"UP",
VAR X = [diff]
VAR K1 = [INDEX]
RETURN
IF ( X > 0 || X = BLANK (), POWER ( BN, K - K1 ) * X, BLANK () ),
"ALL",
VAR X = [diff]
VAR K1 = [INDEX]
RETURN
IF ( X = BLANK (), BLANK (), POWER ( BN, K - K1 ) * ABS ( X ) )
)
RETURN
ROUND(DIVIDE ( SUMX ( T4, [UP] ), SUMX ( T4, [ALL] ) ) * 100,2)
3、5均线,其中n=10,20,60即可得到10均线、20均线、60均线。
5均线 =
var n=5
var date1=max('data'[date])
var date2=filter(all('data'[date]),'data'[date]<=date1)
var T=topn(n,date2,'data'[date],DESC)
VAR R=CALCULATE(SUM(data[close]),T)
RETURN
DIVIDE( R,COUNTROWS(T))
四、总结
1、DAX中基本没有难度,就是迭代;
2、主要是数据公式推导后即可迎刃而解;
3、为了更好理解,做了个excel逻辑分解

4、最后验证下我们的计算结果
DAX计算出的RSI结果

股票软件结果(RSI24有一点点差异,主要是软件起始天数或者是小数保留问题,不影响使用。)

5、数据源是通过python的tushare包得到,pbix文件可以当个查询工具使用。

by 焦棚子
126_Power BI中使用DAX计算股票RSI及股票均线相关的更多相关文章
- 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?
https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...
- DAX和Power BI中的参考日期表
本文使用Power BI模板描述DAX中的引用Date表,可以在Analysis Services模型中使用相同的技术.在Dax Date Template页面下载最新版本的模板. 为什么引用Date ...
- 数据可视化之DAX篇(二十七)半累加度量,在Power BI 中轻松处理
https://zhuanlan.zhihu.com/p/96823622 开始半累加的计算之前,我们先看看什么是累加.半累加以及不可累加数据. 在含有大量行的数据表中,各种数据处理语言,包括DAX ...
- 以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)
本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得. 在之前的系列文里,大家能看到K线,均线,成交 ...
- --关于null在oracle数据库中是否参与计算,进行验证,
--关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...
- R语言作为BI中ETL的工具
R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...
- 数据库SQL语句中根据当前日期计算其他日期小结
问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期.结束日期,或者计算上个月的开始日期结束日期等问题.最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一 ...
- 第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...
- Power BI中的QA功能预览
微软在休斯敦的全球合作伙伴大会上发布了Power BI for Office 365,通过Excel和Office 365中的自服务式商业智能解决方案为信息工作者提供了数据分析以及可视化功能以帮助他们 ...
随机推荐
- 一份你可以在 <head> 里设置的列表
A list of everything that could go in the <head> of your document github 原地址:https://github.co ...
- 纹理集打包和动画转换工具Texture Merge的使用教程
Texture Merger 可将零散纹理拼合为整图,同时也可以解析SWF.GIF动画,制作Egret位图文本,导出可供Egret使用的配置文件,其纹理集制作功能在小游戏开发中可以起到降低小游戏包体的 ...
- Vue-cli的打包初体验
前言:我司是一个教育公司,最近要做一个入学诊断的项目,领导让我开始搭建一套基于vue的H5的开发环境.在网上搜集很多的适配方案,最终还是选定flexible方案.选择它的原因很简单: 它的github ...
- 从0搭建vue后台管理项目到颈椎病康复指南(一)
网上搜索了很久Vue项目搭建指南,并没有找到写的比较符合心意的,所以打算自己撸一个指南,集合众家之所长(不善于排版,有点逼死强迫症,如果觉得写的有问题,可以留言斧正,觉得写的太差的,可以留言哪里差, ...
- 如何形成一个完整的HTML对象
写在前面,本文将同步发布于Blog.掘金.segmentfault.知乎等处,如果本文对你有帮助,记得为我得到我的个人技术博客项目给个star哦. 为何写这篇文章? 你可能做Web开发已经有一段时间, ...
- 通过面试题学JavaScript知识(1)
// a 是多少的时候 可以让下面的打印ok if(a == 1 && a == 2 && a ==3){ console.log('ok') } 分析1: == 比较 ...
- LazyCaptcha自定义随机验证码和字体
介绍 LazyCaptcha是仿EasyCaptcha和SimpleCaptcha,基于.Net Standard 2.1的图形验证码模块. 目前Gitee 52star, 如果对您有帮助,请不吝啬点 ...
- Spring Boot-切换嵌入式Servlet容器
首先我们先查看Spring Boot中支持几种嵌入式容器 选中ConfigurableWebServerFactory类,点击ctrl+h键,查看 切换到jetty容器步骤如下 1.排除掉tomcat ...
- SpringBoot其他框架-JPA-Hibernate-Swagger
SpringBoot其他框架 通过了解其他的SpringBoot框架,我们就可以在我们自己的Web服务器上实现更多更高级的功能. 邮件发送:Mail 我们在注册很多的网站时,都会遇到邮件或是手机号验证 ...
- LC-34
package getSecondBiggestNum.nums; public class LC34 { public int[] searchRange(int[] nums, int targe ...