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中的自服务式商业智能解决方案为信息工作者提供了数据分析以及可视化功能以帮助他们 ...
随机推荐
- div 底部固定方法(不用position定位)
方法一:全局增加一个负值下边距等于底部高度 <style> html, body { height: 100%; margin: 0; } .content { padding: 20px ...
- java中Error和Exception用法上有什么区别,Error是怎么回事?
顺便提一句, 和Exception 相对应的,还有Error,Error(错误)表示系统级的错误和程序不必处理的异常,是JRE(java运行环境)的内部错误或者硬件问题,比如,另外 某一处地方的bug ...
- mysql-加密函数
1.PASSWORD(str)一般对用户的密码加密 不可逆 2.MD5(str) 普通加密 不可逆 3.ENCODE(str,pswd_str) 加密函数,结果是一个二进制数,必须使用 BLOB 类型 ...
- Mybatis实现批量添加操作
Mybatis实现批量添加操作 学习内容: 1. 使用 2. 代码实现 2.1 UserMapper.java 接口 2.2 UserMapper.xml 总结: 学习内容: 1. 使用 这里通过动态 ...
- 鸿蒙JS 开发整理
目录 一.前言: 二.鸿蒙 JS UI框架 2.1 JS UI特性 2.2 架构 2.3 新的UI框架结构 三.API 四.最后 一.前言: 5月25日,华为对外宣布计划在6月2日正式举办鸿蒙手机发布 ...
- ABP源码分析 - 约定注册(3)
入口 //ConfigureServices foreach (var module in Modules) { if (module.Instance is AbpModule abpModule) ...
- js知识梳理5:关于函数的要点梳理(1)
写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,感谢它们的作者和译者.有发现什么问题的,欢迎留言指出 ...
- C#多线程下的调优
一.原子操作 先看一段问题代码 /// <summary> /// 获取自增 /// </summary> public static void GetIncrement() ...
- linux压缩打包、定时任务
压缩打包 gzip压缩 win中的压缩包:zip rar Linux常见的压缩包有哪些? gzip bzip2 1.gzip压缩 压缩命令:gzip [压缩文件] 解压命令:gzip -d [压缩包] ...
- toggleClass() 把本来的有的类名去掉 本来没有的 加上
连续点击按钮可以交替颜色,就是改变class