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中的自服务式商业智能解决方案为信息工作者提供了数据分析以及可视化功能以帮助他们 ...
随机推荐
- nodejs和树莓派开发以及点亮RGB的LED灯代码
前段时间集团举行前端IOT比赛,借此机会熟悉了树莓派相关的东西,特此记录一些相关的文档和开发指南. 先介绍一些树莓派的入门教程 阮一峰的树莓派入门 微雪电子-树莓派硬件中文官网 ssh链接树莓派 ss ...
- 微信小程序加密数据(encryptedData)解密中的PHP代码,php7.1报错
问题描述 最近在开发微信小程序涉及到加密数据(encryptedData)的解密,用的是PHP代码,在运行后报错mcrypt_module_ xxx is deprecated,提示方法已过时了 经研 ...
- 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
概述 最近,有客户向我们请求开发一个前端下拉控件,需求是显示了一个列表,其中包含可由用户单独选择的项目控件,该控件将在下拉列表中显示多选TreeView(树形图). 如今WijmoJS已经实现了该控件 ...
- 现在做 Web 全景合适吗?
Web 全景在以前带宽有限的条件下常常用来作为街景和 360° 全景图片的查看.它可以给用户一种 self-immersive 的体验,通过简单的操作,自由的查看周围的物体.随着一些运营商推出大王卡等 ...
- Mybatis实现批量添加操作
Mybatis实现批量添加操作 学习内容: 1. 使用 2. 代码实现 2.1 UserMapper.java 接口 2.2 UserMapper.xml 总结: 学习内容: 1. 使用 这里通过动态 ...
- Exchange统计邮箱数量
以Exchange管理员身份登录,打开PowerShell控制台. 1.查询Exchange组织邮箱数量 键入以下命令. Get-Mailbox | Measure-Objcet 2.查询某数据库邮箱 ...
- 居中select中的option选项
select经常有长短不一的选项:选择不同的选项居中不会生效: 使用text-align:center;text-align-last: center; 可以让所有选项都居中: 关于text-dec ...
- Django高级之-缓存
一 缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消 ...
- php文件下载服务器代码
事情的起因 额,平板想下载电脑上的pdf文件,我开启了web服务,局域网下的ipad访问该文件web路径会直接打开该pdf,而不是下载.于是本小白就折腾了一下. 源代码 <?php forceD ...
- python---if、while、for
if语句 当出现选择情况的时候,就需要用到if语句. # 第一种语法 if 条件: # 冒号将条件和结果分开,不可缺少 结果1 结果2 # 条件为真执行结果1,然后结果2:否则直接结果2 # 第二种语 ...