博客: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)。


temp

其中X的角标和temp表中的【INDEX】相对应的。
要想计算EMA结果,就需要递归,但在DAX中目前笔者还没有找到办法来处理递归的问题。

于是我们加以思考

将上述表达式分别带入得到:

提一个1/6出来后得到

发现规律了吗?

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

说明

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

同时我们可以推导得出 天中 天指数平均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及股票均线相关的更多相关文章

  1. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  2. DAX和Power BI中的参考日期表

    本文使用Power BI模板描述DAX中的引用Date表,可以在Analysis Services模型中使用相同的技术.在Dax Date Template页面下载最新版本的模板. 为什么引用Date ...

  3. 数据可视化之DAX篇(二十七)半累加度量,在Power BI 中轻松处理

    https://zhuanlan.zhihu.com/p/96823622 ​开始半累加的计算之前,我们先看看什么是累加.半累加以及不可累加数据. 在含有大量行的数据表中,各种数据处理语言,包括DAX ...

  4. 以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)

    本人之前写过若干“给程序员加财商”的系列文,目的是通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得. 在之前的系列文里,大家能看到K线,均线,成交 ...

  5. --关于null在oracle数据库中是否参与计算,进行验证,

    --关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...

  6. R语言作为BI中ETL的工具

    R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...

  7. 数据库SQL语句中根据当前日期计算其他日期小结

    问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期.结束日期,或者计算上个月的开始日期结束日期等问题.最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一 ...

  8. 第16/24周 SQL Server 2014中的基数计算

    大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...

  9. Power BI中的QA功能预览

    微软在休斯敦的全球合作伙伴大会上发布了Power BI for Office 365,通过Excel和Office 365中的自服务式商业智能解决方案为信息工作者提供了数据分析以及可视化功能以帮助他们 ...

随机推荐

  1. 制作任意波形发生器MAX038

  2. Spring Security OAuth 笔记

    1  单点登录 关于单点登录的原理,我觉得下面这位老哥讲的比较清楚,有兴趣可以看一下,下面我把其中的重点在此做个笔记总结 https://juejin.cn/post/6844904079274197 ...

  3. CSS详细解读定位

    一 前言 CSS定位是CSS布局只能够重要的一环.本篇文章带你解读定位属性,可以让你更加深入的理解定位带来的一些特性,熟练使用CSS布局. 二 正文 1.文档流布局的概念 将窗体自上而下分成一行行, ...

  4. 用vue开发一个猫眼电影web app

    前言:之前一直在学习原生的javascript,但是无奈功力太浅,学了很长时候也只能写一些简单的小demo,知道遇见了vue,一切都变了,他的双向绑定和组件化思想让我迅速的爱上了他,可是光学不练是没有 ...

  5. Java/C++实现模板方法模式---数据库操作

    对数据库的操作一般包括连接.打开.使用.关闭等步骤,在数据库操作模板类中我们定义了connDB().openDB().useDB().closeDB()四个方法分别对应这四个步骤.对于不同类型的数据库 ...

  6. JavaScript实现动态表格

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  7. es6语法之模版字符串

    //es6语法之`${}`以及vue语法 `${ }` (模版字符串)const name = '小缘' const age = 14 console.info(`大家好,我叫${name},今年${ ...

  8. 关于data自定义属性

    新的HTML5标准允许你在普通的元素标签里,嵌入类似data-*的属性,来实现一些简单数据的存取.它的数量不受限制,并且也能由JavaScript动态修改,也支持CSS选择器进行样式设置.这使得dat ...

  9. Docker的简介

    前言 Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源. 何为Docker? ...

  10. python中其他数据类型内置方法

    补充字符串数据类型内置方法 1.移除字符串首尾的指定字符可以选择方向1: s1 = '$$$jason$$$' print(s1.strip('$')) # jason print(s1.lstrip ...