轻量级BI工具Superset的搭建与使用

系统环境:Windows 10
Python:3.6.6
Superset:0.27.0

0 Superset 简介

Superset 是一款由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。
Superset 的前端主要用到了 ReactNVD3/D3,而后端则基于 Python 的 Flask 框架和 PandasSQLAlchemy 等依赖库,主要提供了这几方面的功能:

  • 集成数据查询功能,支持多种数据库,包括 MySQL、PostgresSQL、Oracle、SQL Server、SQLite、SparkSQL 等,并深度支持 Druid
  • 通过 NVD3/D3 预定义了多种可视化图表,满足大部分的数据展示功能。如果还有其他需求,也可以自开发更多的图表类型,或者嵌入其他的 JavaScript 图表库(如 HighCharts、ECharts)。
  • 提供细粒度安全模型,可以在功能层面和数据层面进行访问控制。支持多种鉴权方式(如数据库、OpenID、LDAP、OAuth、REMOTE_USER 等)。

Superset 的搭建与使用非常简单,只需要一些 Python 基础,下面先从创建虚拟环境开始。

1 创建虚拟环境

Superset 的依赖包较多,为了避免冲突,需要先搭建虚拟环境,再进行安装,这里推荐使用 Anaconda 自带的 conda 工具创建虚拟环境:

conda create -n superset python=3.6

创建虚拟环境成功后,启动虚拟环境:

activate superset

2 安装

使用豆瓣源安装 Superset:

pip install superset -i https://pypi.douban.com/simple 

这里遇到了一个坑,某个依赖包没有被正确的安装,当时随手就解决了,没有记录下来。只大概记得报错信息提到 Microsoft Visual C++ 14.0 is required ,这是因为该依赖包需要安装 C++ 进行编译。
一般不用为此专门安装 Microsoft Visual C++ 14.0,而是去下载该依赖包的 whl 格式文件(需要对应虚拟环境的 python 版本),再进入 whl 文件所在的路径通过 pip install 安装即可。如果在安装过程中遇到其他问题,就把报错信息复制出来,然后去问问神奇的 stackoverflow 吧!

Superset安装出错 cannot import name _maybe_box_datetimelike from pandas.core.common

这是 pandas 库版本太高导致的,需要安装低版本的 pandas 库。

解决办法
# 查看当前 pandas 版本
$ pip list | grep pandas
pandas 0.24.2

# 安装低版本 pandas
$ pip install pandas==0.23.4

然后重新运行 “fabmanager create-admin –app superset” 命令创建管理员用户

3 初始化

初始化的官方步骤如下:

# 创建管理员账号
fabmanager create-admin --app superset 

# 初始化数据库
superset db upgrade

# 载入案例数据
superset load_examples

# 初始化角色和权限
superset init

# 启动服务,端口号 8088,使用 -p 更改端口号
superset runserver

但在命令行中直接运行 superset, 会提示“不是内部或外部命令”。要解决这个问题,可以直接通过 cd 命令进入 Superset 安装目录( …\Anaconda3\envs\superset\Lib\site-packages\superset\bin )。然后运行如下命令:

python superset db upgrade
python superset load_examples
python superset init
python superset runserver

这里直接运行 python superset runserver 会出错,原因是 Superset 使用 gunicorn 作为应用程序服务器,而 gunicorn 不支持 Windows。需要在命令行中添加 -d,使用 development web server 运行。最终运行命令为:

python superset runserver -d

但是这种部署方式,官方并不建议在生产环境中使用。在 Superset 的 issues 922,有人提供了一种方法,使用 waitress。首先安装 waitress:

pip install waitress

接着找到 superset/cil.py 的 debug_run() 函数:

def debug_run(app, port, use_reloader):

    app.run(
        host='0.0.0.0',
        port=int(port),
        threaded=True,
        debug=True,
        use_reloader=use_reloader)

将其改写成:

def debug_run(app, port):
    from waitress import serve #使用 waitress 解决 gunicorn 不支持 windows 问题

    return serve(
        app,
        host='0.0.0.0',
        port=int(port))

再次运行 Superset:

python superset runserver -d -p 8079

最后在浏览器输入 http://localhost:8079 进入登录界面:

输入在 fabmanager create-admin --app superset 这步设置的账号和密码登录,进入 Superset 首页(右上角国旗处可设置语言):

这里 Superset 已经用之前加载的示例数据,建立了 4 个 dashboard,选择其中一个进行查看(即本文开始的那个 dashboard):

4 数据源

接下来,将演示如何连接数据库,以及怎样使用表和导入 CSV 到数据库。Superset 还深度支持 Druid(一个高效的海量数据查询系统),但这里不做介绍。

4.1 连接到数据库

从顶部导航菜单的 Source — Databases 进入数据库列表页:

点击在数据库列表右上角的绿色加号按钮:

点击按钮后,将进入添加数据库的表单页,因为这只是一次简单的演示,只需要填写两项:Database 和 SQLAlchemy URL,分别是数据库名称和 SQLAlchemy 的连接 URI (参阅为目标数据库创建连接 URI 的 SQLAlchemy 文档)。

这里为了方便,用的是本地的 SQLite 数据库。也可以使用其他数据库,如官方文档推荐的 PostgreSQL 的一些示例数据集或官方文档使用的示例天气数据

接着点击 Test Connection 按钮,测试是否能成功连接到数据库。若成功连接,则会看到下图的弹出框:

当连接测试成功后,可在页面底部看到该数据库下的数据表,点击 Save 按钮,完成创建。

4.2 创建表

现在已经配置了数据库,接下来需要向 Superset 添加想要查询的特定表。从 Sources — Tables 进入到数据表列表页:

点击列表页右上角的绿色加号按钮:

点击按钮后,将进入添加数据表的表单页,在该页面依次填写目标数据库、数据表名称、数据库模式(可选),再点击 Save 按钮,即可完成创建。

创建完成后,将重定向回到列表页,此时在页面顶部会出现一条消息提示指示表已创建:

在列表页还可以对已添加的数据表进行编辑:

点击编辑图标,可进入表的编辑页,对表的详细信息、字段、指标进行配置,这里演示对表字段的配置(设置是否可对指定字段进行分组或过滤):

4.3 上传 CSV

Superset 还可以导入 CSV 到数据库中,从 Sources — Upload a CSV 进入到导入 CSV 的表单页:

依次填写表名称、导入 CSV 文件、选择要导入的数据库,再点击 Save 按钮完成导入:

创导入完成后,将重定向回到数据表列表页,此时在页面顶部会出现一条消息提示指示表已创建:

5 创建 dashboard

5.1 探索数据

要开始探索数据,只需在可用数据表列表中点击刚刚创建的表名:

点击表名后进入表的可视化页面,默认的可视化类型为表视图:

在 Datasouce & Chart Type 下方,依次可以进行时间、Group By、Not Group By 以及字段过滤等设置:

在页面左侧完成相关设置后,点击 Run Query 按钮,即可在右侧的可视化视图,查看数据的可视化展示:

5.2 创建图表

通过更改可视化类型和其他设置,可以很灵活地对数据进行探索性分析。若在探索的过程中发现某个有价值的点,可以点击左上角的 Save 按钮,在出现的弹出框中命名图表并选择是否将其添加到 dashboard,以将其保存为图表:

从顶部导航菜单的 Charts 进入到图表的列表页,找到刚刚创建的图表:

点击图表名称进入到刚才的可视化页面,对已保存的图表进行再次编辑。

5.3 创建 dashboard

从顶部导航菜单的 Dashboards 进入到 dashboard 的列表页,点击右上角的绿色加号按钮:

点击按钮后,将进入添加 dashboard 的表单页,在该页面依次填写 dashboard 名称和拥有者,再点击 Save 按钮,即可完成创建:

5.4 编辑 dashboard

完成 dashboard 的创建后,将重定向到 dashboard 的列表页,找到刚创建的 dashboard:

点击 dashboard 的名称,进入 dashboard,此时 dashboard 还未配置任何图表,处于空值状态,点击右上角的 Edit dashboard 按钮进行编辑:

进入编辑状态后,可已导入图表(仅限 dashboard 拥有者拥有的图表)、标签页、行、列、标题、Markdown 和分割线等组件:

并可通过拖拽编辑 dashboard 的布局(在拖拽过程中,Superset 还提供了辅助线和栅格进行提示):

Superset 还可以通过编辑 CSS 修改 dashboard 的样式:

在进行编辑之后,点击 Save changes 按钮,即可完成操作。

6 SQL 查询

在使用 SQL 查询前,需要进行两项设置:
首先,从顶部导航菜单的 Sources — Databases 进入数据库的列表页,选中数据库进行编辑,将 Expose in SQL Lab 和 Allow Run Sync 都勾选上,其余的不要勾选。

在勾选完上述两项之后,Windows 用户还会出现 “module" object has no attribute 'SIGALRM' 错误,这又是由于 Windows 环境下依赖包不兼容导致的 —— Python 的 signal 包只作用于 Linux 和 Mac ,在 Windows 下不启作用。解决方法很简单粗暴,在 superset/utils.py 下找到相关代码,把 signal 所在行都注释,然后再加上一个 pass这块代码的功能是在超时后将查询进程杀掉,注释后没大影响)。

    def __enter__(self):
        try:
            pass
            #signal.signal(signal.SIGALRM, self.handle_timeout)
            #signal.alarm(self.seconds)
        except ValueError as e:
            logging.warning("timeout can't be used in the current context")
            logging.exception(e)

    def __exit__(self, type, value, traceback):
        try:
            pass
            #signal.alarm(0)
        except ValueError as e:
            logging.warning("timeout can't be used in the current context")
            logging.exception(e)

上面两步做完后,即可在 SQL Lab — SQL Editor 进行 SQL 查询操作:

可对查询语句进行执行、保存、分享(复制)操作,还可以对查询结果可以进行可视化和导出为 CSV 文件。

7 安全性

Superset 中的安全性由 Flask AppBuilder(FAB)处理(一个“简单快速的应用程序开发框架,构建在Flask之上”)。FAB 提供身份验证、用户管理、权限和角色,可参阅其安全文档。角色由一组权限组成,不同的用户角色被赋予了不同的权限,Superset 本身提供了一组基本角色:

  • Admin:拥有所有可能的权限,包括从其他用户授予或撤消权限以及更改其他人的切片和 dashboard。
  • Alpha:可以访问所有数据源,但不能授予或撤消其他用户的访问权限。它们也仅限于改变它们拥有的对象。可以添加和更改数据源。
  • Gamma:访问受限,只能使用通过另一个互补角色获得访问权限的数据源。他们只能查看由他们有权访问的数据源制作的切片和 dashboard。无法更改或添加数据源,但可以可以创建切片和 dashboard。
  • sql_lab:被授予对 SQL Lab 的访问权限。
  • public:可以通过在 superset\config.py 设置 PUBLIC_ROLE_LIKE_GAMMA = True,授予该角色与 Gamma 角色相同的权限集。

在执行 superset init 命令时,所有这些基本角色将重新同步到初始值,因此不建议通过授予或撤消权限来更改这些基本角色。

这里不对 Superset 的安全机制做过多展开,如果想了解更多,包括如何为用户提供对特定数据集的访问权限,以及如何定制自己的角色,可以参阅官方的安全文档

8 小结

虽然 Superset 仍有着很多不足,例如:没有提供图表的下钻功能、不支持多图表间的复杂联动、处理大数据集效率较低、权限管理和图表管理的功能设计不友好等。但其作为一款轻量级的 BI 应用,对于个人开发者和中小型团队,其不失为一个优雅且高效的自助式数据分析解决方案。

Superset 的不足,一方面可以看后续 Airbnb 会不会优化,另一方面可以对其进行二次开发。实际上,Superset 应主要提供基于最终结果表的数据查询和报表展示,对于复杂的数据联动,则放在 ETL 的过程中完成。

 

量化研究

股本指标


总股本

在指定日期,公司已发行的普通股股份总数(不含优先股)。

A股

流通A股

在指定日期,公司已发行的境内上市流通、以人民币兑换的股份总数。

限售A股

是限售股中,解禁时转入流通A股的股份数。

A股合计

公司已发行的,境内上市,以人民币兑换的普通股股份总数(含限制流通股),也称为人民币普通股。

总股本 - 境外流通股 - H股流通股 - B股流通股 - 限售B股 - 股改前非流通股

B股

流通B股

指定日期,公司发行的境内上市流通、以外币兑换的股份总数,也称为境内上市外资股(简称B股)。

B股合计

公司已发行的,境内上市,以外币兑换的股份总数,也称为境内上市外资股(简称B股)。

股本合计

三板合计

公司已发行的,在代办股份转让市场转让的股份总数。

流通股合计

在指定日期,公司已发行的可以在合法的证券交易市场公开交易的各类股票股份总数。

流通股合计 = A股流通股 + B股流通股 + H股流通股 + 境外流通股 + 可转让股份(即三板股)

限售股合计

限售股份是指股份持有人依照法律、法规规定或按承诺有转让限制的股份。

限售A股+限售B股

股改前非流通股

除流通股以外,其他不能上市交易或限制上市交易的股份总数。

非流通股本=总股本-流通股合计-股权分置改革限售股份

自由流通股本

Wind自己计算的截至该日股票的流通股总股数
其他扣除数主要包括:

  • 持股>=5%的大股东持有的流通股份
  • 持股<5%的股东持有的流通股份,考虑一致行动人(即和>=5%股东有关联关系或者虽然持股<5%,但关联方累计>=5%)
  • 前10大股东或前10大流通股东中公布的高管持股数,一般全流通情况下扣除75%,(因为公司法规定高管每年实际可流通的不超过其持股数的25%,其他情况视上市公司具体公布情况)
  • 以上不包含基金、基金管理公司、社保基金、保险公司、财务公司、企业年金、券商、券商集合理财、信托公司,银行等金融机构注:目前只计算A股

趋向指标


BBI多空指数

BBI(BullAndBearIndex),是按照几种不同日数的移动平均线值根据天数加权平均得到的一项技术指标。主要是为了综合考虑不同日数的移动平均线。

BBI=(均线1+均线2+均线3+均线4) / 4
四条均线天数默认为3,6,12,24 ,均线的计算:n日均价=n日收盘价之和/n

指标研判

  • 股价在高价区域如果以收市价向下跌破BBI线为卖出信号
  • 股价在低价区域以收市价向上突破BBI线为买入信号
  • 股价在一段时间内保持在BBI线上方表明多方势力占优,可持股
  • 如果股价一直保持在BBI线下方,表明空方势力强劲,不宜介入

DNA平均线差

DMA是依据快慢两条移动平均线的差值情况来分析价格趋势的一种技术分析指标。它主要通过计算两条基准周期不同的移动平均线的差值,来判断当前买入卖出的能量的大小和未来价格走势的趋势。

DMA = 收盘价短期平均值 - 收盘价长期平均值
AMA = DMA短期平均值

指标研判

  • DMA线向上交叉AMA线,做买。
  • DMA线向下交叉AMA线,做卖。
  • DMA指标也可观察与股价的背离。

DMI趋向指标

动向指数又称移动方向指数(Directional Movement Index),是Welles Wilder 于1978年提出的一种用于判断行情是否已经发动的技术指标。

DMI指标的基本原理是在于寻找股票价格涨跌过程中,股价藉以创新高价或新低价的功能,研判多空力量,进而寻求买卖双方的均衡点及股价在双方互动下波动的循环过程。

在大多数指标中,绝大部分都是以每一日的收盘价的走势及涨跌幅的累计数来计算出不同的分析数据,其不足之处在于忽略了每一日的高低之间的波动幅度。

比如某个股票的两日收盘价可能是一样的,但其中一天上下波动的幅度不大,而另一天股价的震幅却在10%以上,那么这两日的行情走势的分析意义决然不同,这点在其他大多数指标中很难表现出来。

而DMI指标则是把每日的高低波动的幅度因素计算在内,从而更加准确的反应行情的走势及更好的预测行情未来的发展变化。

当日动向值 (DM)

上升动向(+DM)+DM代表正趋向变动值即上升动向值,其数值等于当日的最高价减去前一日的最高价,如果<=0 则+DM=0。
下降动向(-DM)-DM代表负趋向变动值即下降动向值,其数值等于前一日的最低价减去当日的最低价,如果<=0 则-DM=0。

再比较+DM和-DM,较大的那个数字保持,较小的数字归0。(注意,+DM和-DM都是非负数)

无动向代表当日动向值为“零”的情况,即当日的+DM和﹣DM同时等于零。有以下两种情况:
1 - 当日的最高价低于前一日的最高价并且当日的最低价高于前一日的最低价
2 - 当上升动向值正好等于下降动向值

真实波幅 (TR)

TR代表真实波幅,是当日价格较前一日价格的最大变动值。取以下三项差额的数值中的最大值(取绝对值)为当日的真实波幅:

- 当日的最高价减去当日的最低价的价差
- 当日的最高价减去前一日的收盘价的价差
- 当日的最低价减去前一日的收盘价的价差

方向线 (DI)

方向线DI是衡量股价上涨或下跌的指标,分为“上升指标”和“下降指标”。在有的股市分析软件上,+DI代表上升方向线,-DI代表下降方向线

+DI=(+DM÷TR)×100
-DI=(-DM÷TR)×100

要使方向线具有参考价值,则必须运用平滑移动平均的原理对其进行累积运算。以12日作为计算周期为例,先将12日内的+DM、-DM及TR平均化,所得数值分别为+DM12,-DM12和TR12

+DI (12) = (+DM12÷TR12) × 100
-DI (12) = (-DM12÷TR12) × 100

动向平均数 (ADX)

依据DI值可以计算出DX指标值。其计算方法是将+DI和—DI间的差的绝对值除以总和的百分比得到动向指数DX。由于DX的波动幅度比较大,一般以一定的周期的平滑计算,得到平均动向指标ADX。

DX = (DI DIF ÷ DI SUM) × 100
DI DIF为上升指标和下降指标的差的绝对值
DI SUM为上升指标和下降指标的总和

ADX就是DX的一定周期n的移动平均值。

评估数值 (ADXR)

ADXR = (当日的ADX + 前n日的ADX) ÷ 2
n为周期数,日周月年

指标研判

和其他技术指标不同的是,DMI指标的研判动能主要是判别市场的趋势。
一方面是分析上升指标+DI,下降指标-DI和平均动向指标ADX之间的关系,另一个方面是对行情的趋势及转势特征的判断。
+DI和-DI两条曲线的走势关系是判断能否买卖的信号
ADX则是判断未来行情发展趋势的信号

+DI和-DI

  • 当股价走势向上发展,而同时+DI从下方向上突破-DI时,表明市场上有新多买家进场,为买入信号,如果ADX伴随上升,则预示股价的涨势可能更强劲。
  • 当股价走势向下发展时,而同时+DI从上向下突破-DI时,表明市场上做空力量在加强,为卖出信号,如果ADX伴随上升,则预示跌势将加剧。
  • 当股价维持某种上升或下降行情时,+DI和﹣DI的交叉突破信号比较准确,但当股价维持盘整时,应将+DI和-DI交叉发出的买卖信号视为无效。

ADX判断行情趋势

  • 当行情走势由横盘向上发展时,ADX值会不断递增。因此,当ADX值高于前一日时,可以判断当前市场行情仍在维持原有的上升趋势,即股价将继续上涨,如果+DI和﹣DI同时增加,则表明当前上升趋势将十分强劲。
  • 当行情走势进入横盘阶段时,ADX值会不断递减。因此,判断行情时,应结合股价走势(+DI和-DI)走势进行判断。
  • 当行情走势由盘整向下发展时,ADX值也会不断递减。因此,当ADX值低于前一日时,可以判断当前市场行情仍维持原有的下降趋势,即股价将继续下跌,如果+DI和-DI同时减少,则表示当前的跌势将延续。

ADX判断行情是否盘整

  • 当市场行情在一定区域内小幅横盘盘整时,ADX值会出现递减情况。当ADX值降至20以下,且呈横向窄幅移动时,可以判断行情为牛皮盘整,上升或下跌趋势不明朗,投资者应以观望为主,不可依据+DI和-DI的交叉信号来买卖股票。

ADX判断行情是否转势

  • 当ADX值在高点由升转跌时,预示行情即将反转
  • 在涨势中的ADX在高点由升转跌,预示涨势即将告一段落
  • 在跌势中的ADX值从高位回落,预示跌势可能停止

四线

  • +DI (PDI)线 白色线
  • DI (MDI)线 黄色线
  • ADX线 红色线
  • ADXR线 绿色线

四线交叉原则

  • 当+DI线同时在ADX线和ADXR线及-DI线以下(特别是在50线以下的位置时),说明市场处于弱市之中,股市向下运行的趋势还没有改变,股价可能还要下跌,投资者应持币观望或逢高卖出股票为主,不可轻易买入股票。这点是DMI指标研判的重点。
  • 当+DI线和-DI线同处50以下时,如果+DI线快速向上突破-DI线,预示新的主力已进场,股价短期内将大涨。如果伴随大的成交量放出,更能确认行情将向上,投资者应迅速短线买入股票。
  • 当+DI线从上向下突破-DI线(即-DI线从下向上突破+DI线)时,此时不论+DI和-DI处在什么位置都预示新的空头进场,股价将下跌,投资者应短线卖出股票或以持币观望为主。
  • 当+DI线、-DI线、ADX线和ADXR线等四线同时在50线以下绞合在一起窄幅横向运动,说明市场处于波澜不兴,股价处于横向整理之中,此时投资者应以持币观望为主。
  • 当+DI线、ADX线和ADXR线等三线同时在50线以下的位置,而此时三条线都快速向上发散,说明市场人气旺盛,股价处在上涨走势之中,投资者可逢低买入﹣或持股待涨。(这点中因为-DI线是下降方向线,其对上涨走势反应不灵,故不予以考虑)。
  • 对于牛股来说,ADX在50以上向下转折,仅仅回落到40-60之间,随即再度掉头向上攀升,而且股价在此期间走出横盘整理的态势。随着ADX再度回升,股价向上再次大涨,这是股价拉升时的征兆。这种情况经常出现在一些大涨的牛股中,此时DMI指标只是提供一个向上大趋势即将来临的参考。在实际操作中,则必须结合均线系统和均量线及其他指标一起研判。

EXPMA指数平均数

指数平均数指标EXPMA指标也简称EMA,是对移动平均线的弥补,EXPMA指标由于其计算公式中着重考虑了价格当天(当期)行情的权重,因此在使用中可克服MACD其他指标信号对于价格走势的滞后性。同时也在一定程度中消除了DMA指标在某些时候对于价格走势所产生的信号提前性,是一个非常有效的分析指标。但该指标在盘整行情中不适用。

EXPMA = [当日或当期收盘价*2 + 上日或上期EXPMA*(N-1)] / (N+1)
首次计算时上期EXPMA值为昨天的EXPMA值,用昨收盘价代替,默认周期为日,默认周期数为12。

当天EMA = 昨天的EMA + 加权因子 * (当天的收盘价-昨天的EMA)
当天EMA = 加权因子 * 当天的收盘价 + (1-加权因子) * 昨天的EMA

MA简单移动平均

移动平均线(MA)具有趋势的特性,它比较平稳,不像日K线会起起落落地震荡。越长期的移动平均线,越能表现稳定的特性。不轻易向上向下,必须等股价趋势的真正明朗。移动平均线说到底是一种趋势追踪工具,便于识别趋势已经终结或者反转,新的趋势是否正在形成。

N日MA = N日收市价的总和 / N (即算术平均数)

MCCD指数平滑移动平均

指数平滑异同移动平均线MACD,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。

DIF线(Difference)短期移动平均线和长期移动平均线的离差值
DEA线(Difference Exponential Average)DIF线的M日指数平滑移动平均线 
MACD线 DIF线与DEA线的差

参数:SHORT(短期)、LONG(长期)、M天数,一般为12、26、9

MTM动力指标

MTM指标又叫动量指标,其英文全称是Momentum Index,是一种专门研究股价波动的中短期技术分析工具。它认为股价的涨跌幅度随着时间的推移会逐渐变小,股价变化的速度和能量也会慢慢减缓后,行情就可能反转。

在多头行情里,随着股价的不断上升,股价上涨的能量和速度必将日渐萎缩,当上涨的能量和速度减少到一定程度时,行情将会出现大幅回荡整理或见顶反转的行情

而在空头行情里,随着股价地不断下跌,股价下跌的能量和速度也将日渐萎缩,当下跌的能量和速度萎缩到一定程度时,行情也会出现大幅反弹或见底反转的行情。

MTM = 当日收盘价 - N日前收盘价
MAMTM = MTM的M日简单移动平均

PRICEOSC价格振荡指标

震荡量是动量指标的另一表现形式,一般用百分比值来加以计算。其内涵是以当日收盘价除以N日前收盘价,再乘以100。

先求收盘价短期(SHORT)均线与长期(LONG)均线的差,
再求差值与收盘价短期均线的比,最后将比值乘100。

参数:SHORT、LONG分别为短期、长期平均天数,一般为12、26

研判规则

  • 当摆动指针上破指数移动平均线(EMA)时,可视作入货讯号。
  • 当摆动指针下破指数移动平均线(EMA)时,为沽货讯号。

SAR抛物转向

该指标又称为抛物线指标,取意Stop and reverse,表示停止及反转,代表应该买进或者抛售价位及转折点,盘整时该指标无效。

上升SAR

  • 前2天的SAR值必须是近期的最低价
  • 每日的SAR都可用上述方法类推,归纳公式如下:
SAR(n) = SAR(n-1) + AF(n-1) * (EP(n-1)-SAR(n-1))
  • 极值点EP: 当前趋势周期内的极高价。
  • 加速因子AF: 初始值为0.02,一旦极值达到新高,则每次加0.02。若无新高则加速因子沿用前一天的数值,但加速因子最高不能超过0.2。
  • 看涨期间,SAR不能高于当日或前一日的最低价。一旦高于其二,则取两者中的较小值。

下跌SAR

  • 前2天的SAR值固定为近期的最高价;
  • 每日的SAR都可用上述方法类推,归纳公式如下:
SAR(n) = SAR(n-1) - AF(n-1) * (SAR(n-1)- EP(n-1))
  • 极值点EP: 当前趋势周期内的极低价。
  • 加速因子AF: 初始值为0.02,一旦极值达到新高,则每次加0.02。若无新高则加速因子沿用前一天的数值,但加速因子最高不能超过0.2。
  • 看跌期间,SAR不能低于当日或前一日的最高价。一旦低于其二,则取两者中的较大值。

TRIX三重指数平滑平均

该指标是一种三重指数平滑平均线,长线操作时采用本指标的讯号,可以过滤掉一些短期波动的干扰,避免交易次数过于频繁,造成部分无利润的买卖,及手续费的损失,但该指标在盘整行情中不适用。

TRIX指标波动频率较低,一年到头出现讯号的机率不多,是一项超长周期的指标,长时间按照本指标讯号交易,获利百分比大于损失百分比,特别是打算进行长期控盘或投资时,利润相当可观。

TR = 收盘价的N日指数移动平均
TRIX = (TR - 昨日TR) ÷ 昨日TR × 100   
MATRIX = TRIX的M日简单移动平均

反趋向指标


B3612三减六日乖离

乖离值围绕多空平衡点零上下波动,正数达到某个程度无法再往上升时,是卖出时机;反之,是买进时机。多头走势中,行情回档多半在三减六日乖离达到零附近获得支撑,即使跌破,也很快能够拉回。

B36 收盘价的3日移动平均线与6日均线的差离
B612  收盘价的6日均线与12日均线的差离

BIAS乖离率

乖离率也称为Y值,是用股价指数与移动平均线的比值关系,来描述股票价格与移动平均线之间的偏离程度。正乖离率值越大,说明股价向上偏离移动平均线的程度越大,有可能回档下调;反之负乖离值越小,表明股价向下偏离移动平均线的程度越大,随时可能反弹。

BIAS(n) =(当日股市收盘价-n日移动平均值)÷ n日移动平均值

CCI顺势指标

Commodity Channel lndex, 该指标用来测量股价脱离正常价格范围之变异性,正常波动范围在±100之间。属于超买超卖类指标中较特殊的一种,是专门对付极端行情的。在一般常态行情下,CCI指标不会发生作用,当CCI扫描到异常股价波动时,立求速战速决,胜负瞬间立即分晓,赌输了也必须立刻加速逃逸。

TP = (最高价 + 最低价 + 收盘价) ÷ 3
MA = 最近n日每日TP之和÷n 
MD = 最近n日 ABS(MATP - 每日TP)累计和 ÷ n
CCI(n) = (TP- MA) ÷MD ÷0.015

系统默认n为14

DPO区间震荡线

区间震荡线(Detrended price Oscillator),由惠特曼•巴塞特(Walt Bressert)提出。是一个排除价格趋势的震荡指标。它试图通过扣除前期移动平均价来消除长期趋势对价格波动的干扰,从而便于发现价格短期的波动和超买超卖水平。

DPO = 收盘价 - 前(N/2+1)日简单移动平均
MADPO = DPO的M日简单移动平均

参数N设置为20,参数M设置为6

KDJ随机指标

随机指标是由乔治•莱恩首创的,它在通过当日或最近几日最高价、最低价及收盘价等价格波动的波幅,反映价格趋势的强弱。KDJ一般是用于股票分析的统计体系,根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。

N日RSV = (N日收盘价 - N日内最低价) ÷ (N日内最高价-N日内最低价) × 100  
当日K值 = 2/3前1日K值 + 1/3当日RSV;  
当日D值 = 2/3前1日D值 + 1/3当日K值;   
当日J值 = 3当日K值 - 2当日D值。   
    
若无前一日K 值与D值,则可分别用50来代替。

SLOWKD慢速KD

Slowed KD是在KD的基础上,对D再进行一次平滑,这次选择的平滑工具是移动平均,而不是指数平滑。Slowed KD 中的K就是KD中的K,Slowed KD中的D就是KD中的K值的移动平均。

RSV =(收盘价-N日内最低价)/(N日内最高价-N日内最低价)*100
MARSV = RSV的M日指数移动平均
K = MARSV的M日移动平均
D = K的M日移动平均

参数N设置为9日,参数M设置为3日

ROC变动速率

该指标用来测量价位动量,可以同时监视常态性和极端性两种行情。ROC以0为中轴线,可以上升至正无限大,也可以下跌至负无限小。以0轴到第一条超买或超卖线的距离,往上和往下拉一倍、两倍的距离,再画出第二条、第三条超买超卖线,则图形上就会出现上下各三条的天地线。

ROC = (当日收盘价-N天前的收盘价) ÷ N天前的收盘价 * 100% 
ROCMA为M日简单移动平均,即MA(ROC、M),M(天数)默认为6

指标研判

  • 当ROC向下则表示弱势,以100为中心线,由中心线上下穿小于100时为卖出信号。
  • 当股价创新高时,ROC未能创新高,出现背离,表示头部形成。
  • 当股价创新低时,ROC未能创新低,出现背离,表示底部形成。

RSI

相对强弱指数是根据一定时期内上涨和下跌幅度之和的比率制作出的一种技术曲线,能够反映出市场在一定时期内的景气程度。
RSI值将0到100之间分成了从”极弱”、”弱””强”到”极强”四个区域。”强”和”弱”以50作为分界线,但”极弱”和”弱”之间以及”强”和”极强”之间的界限则要随着RSI参数的变化而变化。

RSI(n) = N日内收盘价上涨数之和的移动平均值 ÷(N日内收盘价上涨数之和的移动平均值 + N日内收盘价下跌数之和的移动平均值)×100

指标研判

  • RSI值如果超过50,表明市场进入强市,可以考虑买入,但是如果继续进入”极强”区,就要考虑物极必反,准备卖出了
  • 同理RSI值在50以下也是如此,如果进入了”极弱”区,则表示超卖,应该伺机买入。

SI摆动指标

Swing Index基本原理在于探求价格在上升及下降过程中的均衡点,亦即供求关系由紧张状况并通过价格的变化而达成一致。

SRDM

动向速度比率

IF ((最高价 + 最低价) <= (最高价 [1] + 最低价 [1])) THEN 
    DMZ = 0
ELSE
   DMZ = MAX (ABS(最高价 - 最高价 [1]), ABS (最低价 - 最低价 [1])))

IF ((最高价 +最低价) >= (最高价 [1]+最低价 [1])) THEN 
    DMF = 0
ELSE 
    DMF = MAX (ABS(最高价 - 最高价 [1]),  ABS (最低价 - 最低价 [1]))

ADMZ = MA (SRDM_DMZ, 10)
ADMF = MA (SRDM_DMF, 10)

IF (ADMZ > ADMF)  THEN 
    SRDM = (ADMZ - ADMF) / ADMZ

VRDC

VROC指标又名量变动速率指标,是以今天的成交量和N天前的成交量比较,通过计算某一段时间内成交量变动的幅度,应用成交量的移动比较来测量成交量运动趋向,达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿,属于成交量的反趋向指标。

VROC=(成交量-N日前的成交量)÷ N日前的成交量 × 100

N值表示间隔天数,一般取12

VRSI

VRSI指标又名量相对强弱指标,是通过反映股价变动的四个元素:上涨的天数、下跌的天数、成交量增加幅度、成交量减少幅度来研判量能的趋势,预测市场供求关系和买卖力道,是属于量能反趋向指标之一。

VRSI(N) = N日内成交量增加幅度总和 ÷ (N日内成交量增加幅度总和 + N日内成交量减少幅度总和) × 100

WR

威廉指标表示当天的收盘价在过去一段日子的全部价格范围内所处的相对位置。当WR向上突破20超买线而进入超买区运行时,表明股价进入强势拉升行情,这是提醒投资者要密切关注行情的未来走势,只有当WR曲线再次向下突破20线时,才为投资者提出预警,为投资者买卖决策提供参考。

W%R=(Hn - C)÷(Hn - Ln)×100

n:设定的交易期间(常用为30天)。
C:第n日的最新收盘价。
Hn:是过去n日内的最高价(如30天的最高价)。
Ln:是过去n日内的最低价(如30天的最低价)。

能量指标


ARBR人气意愿指标

分为AR指标和BR指标,前者为买卖意愿指标,后者为买卖气势指标,AR可以单独使用,BR必须与AR并用。BR是一种“情绪指标”,就是以反市场心理的立场为基础。AR是一种潜在动能。

AR = ((H - O)26天之和 / (O - L)26天之和) * 100
H: 当天最高价
L: 当天最低价
O: 当天开盘价

BR = ((H - PC)26天之和 / (PC - L)26天之和) * 100
H: 当天之最高价
L: 当天之最低价
PC: 昨天之收盘价

CR能量指标

CR指标同AR、BR指标有很多相似的地方,如计算公式和研判法则等,但它与AR、BR指标最大不同的地方在于理论的出发点有不同之处。CR指标的理论出发点是:中间价是股市最有代表性的价格。CR指标不但能够测量人气的热度、价格动量的潜能,而且能够显示出股价的压力带和支撑带。

CR(N日)=P1 ÷ P2 × 100
P1=Σ(H-YM)表示N日以来多方力量的总和
P2=Σ(YM-L)表示N日以来空方力量的总和
H表示今日的最高价
L表示今日的最低价
YM表示昨日(上一个交易日)的中间价

它是通过对昨日(YM)交易的最高价、最低价、开盘价和收盘价进行加权平均而得到的,比较常用地中间价计算方法有四种:
M =(2C+H+L)÷ 4
M =(C+H+L+O)÷ 4
M =(C+H+L)÷ 3
M =(H+L)÷ 2

PSY

心理线(PSY)指标是研究投资者对股市涨跌产生心理波动的情绪指标,它将一定时期内投资者趋向买方或卖方的心理事实转化为数值,从而判断股价的未来趋势。

PSY = N日内上涨天数 / N * 100
PSYMA = PSY的M日简单移动平均

VR

成交量比率(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值,从而掌握市场买卖气势的中期技术指标。主要用于个股分析,其理论基础是“量价同步”及“量须先予价”,以成交量的变化确认低价和高价,从而确定买卖时法。

VR = N日内上升日成交量总和 / N日内下降日成交量总和

WAD威廉聚散指标

WAD威廉多空力度线的英文全称为Williams Accumulation/Distribution,操作原则与OBV指标相同,但比OBV指标更有意义,能提前指出股价破位。

TRL = 昨日收盘价与今日最低价中价格最低者
TRH = 昨日收盘价与今日最高价中价格最高者

如果今日的收盘价 > 昨日的收盘价,则今日的A/D=今日的收盘价-今日的TRL 
如果今日的收盘价 < 昨日的收盘价,则今日的A/D=今日的收盘价-今日的TRH 

WAD = 今日的A/D + 昨日的WAD
MAWAD = WAD的M日简单移动平均

指标研判

  • 股价一顶比一顶高,而WAD一顶比一顶低,暗示头部即将形成
  • 股价一底比一底低,而WAD一底比一底高,暗示底部即将形成。
  • WAD向上交叉MAWAD,为买进信号
  • WAD向下交叉MAWAD,为卖出信号
  • WAD与OBV指标、PVT指标、ADVOL指标、ADL指标同属一组指标群,使用时应综合研判。

量价指标


MFI资金流向指标

MFI指标实际是将RSI加以修改后演变而来。RSI以成交价为计算基础;MFI指标则结合价和量,将其列入综合考虑的范围。可以说,MFI指标是成交量的RSI指标。

典型价格(TP)= 当日最高价,最低价与收盘价的算术平均值
货币流量(MF)= 典型价格(TP)* 当日成交量
如果当日MF > 昨日MF,则将当日的MF值视为正货币流量(PMF),将N日内的正货币流量加总代入MFI公式
如果当日MF < 昨日MF,则将当日的MF值视为负货币流量(NMF),将N日内的负货币流量加总代入MFI公式

MFI=100 -[100 / (1+PMF/NMF)]

指标研判

  • MFI>80 为超买,当其回头向下跌破80 时,为短线卖出时机
  • MFI<20 为超卖,当其回头向上突破20 时,为短线买进时机
  • MFI>80,而产生背离现象时,视为卖出信号
  • MFI<20,而产生背离现象时,视为买进信号。

OBV

OBV俗称能量潮(On Balance Volume)。能量潮是将成交量数量化,制成趋势线,配合股价趋势线,从价格的变动及成交量的增减关系,推测市场气氛。

今日OBV=昨日OBV + sgn × 今天的成交量

其中,sgn是符号函数,其数值由下式决定:
今日收盘价≥昨日收盘价: sgn=+1  
今日收盘价<昨日收盘价: sgn=-1 

这里的成交量指的是成交股票的手数,不是成交金额
sgn=+1时,其成交量计入多方的能量
sgn=-1时,其成交量计入空方的能量

SOBV能量潮

基本同OBV一样,不同的地方是决定当天成交量,是属于多方的能量还是属于空方能量不是依据收盘价,而是以当天的K线的阴阳决定

当日SOBV = 前SOBV +(-) 当日成交量;

PVT

价量趋势(Price/Volume Trend)指标巧妙地把能量变化与价格趋势有机地联系到了一起,从而构成了量价趋势指标。

设X = (今日收盘价 - 昨日收盘价)/昨日收盘价 × 当日成交量
当日PVT指标值则为从第一个交易日起每日X值的累加

指标研判

  • 价格上升,PVT指标线下降为卖出信号
  • 价格下跌,PVT指标线上升为买进信号
  • PVT的用法基本同OBV,但PVT比OBV能更快地反映趋势

WVAD

威廉变异离散量(WVAD)由拉里•威廉姆斯(Larry Williams)所创,是一种将成交量加权的量价指标。用于测量从开盘价至收盘价期间,买卖双方各自爆发力的程度。主要的理论精髓,在于重视一天中开盘到收盘之间的价位,而将此区域之上的价位视为压力,区域之下的价位视为支撑,求取此区域占当天总波动的百分比,以便测量当天的成交量中,有多少属于此区域。成为实际有意义的交易量。

A = 当天收盘价-当天开盘价                                                                                                        
B = 当天最高价-当天最低价                                                                                                              
C = A / B * 成交量                                                                                                                          
WVAD = N日ΣC  

压力支撑指标


BBIBOL 多空布林线

布林线是一个路径型指标,由上限和下限两条线,构成一个带状的路径。股价超越上限时,代表超买,股价超越下限时,代表超卖。布林线指标的超买超卖作用,只能运用在横向整理的行情。

BBIBOLL =(3日简单移动平均价+6日简单移动平均价+12日简单移动平均价+24日简单移动平均价) / 4
UPR = BBIBOLL + M*BBIBOLL的N日估算标准差
DWN = BBIBOLL - M*BBIBOLL的N日估算标准差

BOLL布林带

布林线指标(Bolinger Bands),是用该指标的创立人约翰布林格(John Bollinger)的姓来命名的,是研判股价运动趋势的一种中长期技术分析工具。

布林指标分别计算中轨线、上轨线、下轨线

中轨线 = N日的移动平均线 
上轨线 = 中轨线+两倍的标准差 
下轨线 = 中轨线-两倍的标准差

指标研判

  • BOLL指标中的上、中、下轨线所形成的股价通道的移动范围是不确定的,通道的上下限随着股价的上下波动而变化。在正常情况下,股价应始终处于股价通道内运行。如果股价脱离股价通道运行,则意味着行情处于极端的状态下。
  • 在BOLL指标中,股价通道的上下轨是显示股价安全运行的最高价位和最低价位。上轨线、中轨线和下轨线都可以对股价的运行起到支撑作用,而上轨线和中轨线有时则会对股价的运行起到压力作用。
  • 一般而言,当股价在布林线的中轨线上方运行时,表明股价处于强势趋势;当股价在布林线的中轨线下方运行时,表明股价处于弱势趋势.

CDP

CDP逆势操作指标在牛皮盘局中是一个较好的高抛低吸的短线操作工具.

H:前一日最高价
L:前一日最低价
C:前一日收市价

CDP =(H + L + C * 2)÷ 4
AH(最高值)= CDP +(H - L)
NH(近高值)= CDP * 2 - L
AL(最低值)= CDP -(H - L)
NL(近低值)= CDP * 2 - H

指标研判

  • 找出这五个数值之后,即用前一天的行情波动来将今日的未来行情做一个高低等级的划分,分析者可利用这个高低区分来判断当日的走势。研判的关键是开市价在CDP五个数值的哪个位置,因开市价通常由市场买卖双方心理期望合理价的折衷后形成的,影响当天的走势。
  • 在波动并不很大的情况下,即开市价处在近高值与近低值之间,通常交易者可以在近低值的价位买进,而在近高值的价位卖出;或在近高值的价位卖出,近低值的价位买进。
  • 在波动较大的情况下,即开市价开在最高值或最低值附近时,意味着跳空开高或跳空开低,是一个大行情的发动开始,因此交易者可在最高值的价位去追买,最低值的价位去追卖。通常一个跳空,意味着一个强烈的涨跌,应有相当的利润。

ENV指标

ENV指标就是趋势线加上二根轨道线。趋势线是以一条线预测未来股价走势,连接下降趋势股价波动的高点的直线为下降趋势线,连接上升趋势股价波动的低点的直线为上升趋势线。轨道线是根据趋势线画出的直线,其画法是在画出趋势线后,通过第一个波峰或波谷作出这条趋势线的平行线,这条平行线就是轨道线,轨道线的作用是限制股价的运动范围。若价格的大趋势不变,股价将在这个通道里变动。

UPPER:简单移动平均(收盘价,N) * 1.06
LOWER:简单移动平均(收盘价,N) * 0.94

MIKE麦克指标

MIKE Base 指标是一种路径指标,依据Typical Price 计算, 包含三条带状支撑与压力。Weak-s、Medium-s、Strong-s三条线代表初级、中级及强力支撑。Weak-r、Medium-r、Strong-r三条线代表初级、中级及强力压力。

计算初始价TYP
TYP =(H+L+C)÷ 3 
TYP =(H+L+2C)÷ 4

三个压力价位:
初级压力WR(N日)= TYP +(TYP - LN)
中级压力MR(N日)= TYP +(HN - LN)
强力压力SR(N日)= 2 * HN - LN

三个支撑价位:
初级支撑WS(N日)= TYP -(HN-TYP)
中级支撑MS(N日)= TYP -(HN-LN)
强力支撑SS(N日)=2 * LN-HN

参数说明:
H = 当日的最高价
L = 当日的最低价
C = 当日的收盘价
TYP = 起始价
LN = N日的最低价
HN = N日的最高价

成交量指标


量比

量比指标依据的是即时每分钟平均成交量与之前连续5天每分钟平均成交量的比较,而不是随意抽取某一天的成交量作为比较,所以能够客观真实地反映盘口成交异动及其力度。

量比 = 当天的成交量 / 过去N日的平均成交量

VMA量简单移动平均

成交量的简单算术平均值。主要通过短期均线穿越长期均线的结果,判断是否为买卖信号。
VMACD VMACD被称为量的平均指数,它是一个以每天成交量的平均指数为分析工具。它的原理与MACD一样,但由于量比价先行的原理,所以该指标的准确性及领先时间都优于仅以价格为变量的MACD指标。在多数情况下,VMACD指标配合KD随机指标一起运用是胜算率更高。

成交量的简单算术平均值

VOSC成交量震荡

VOSC指标又名移动平均成交量指标,但是,它并非仅仅计算成交量的移动平均线,而是通过对成交量的长期移动平均线和短期移动平均线之间的比较,分析成交量的运行趋势和及时研判趋势转变方向。

SHORT = N周期中成交量的总和/N
LONG = M周期中成交量的总和/M
VOSC =(SHORT-LONG)÷ SHORT × 100

参数设置:
SHORT计算短期移动平均成交量的天数,N一般取12天。
LONG计算长期移动平均成交量的天数,M一般取26天。

TAPI加权指数成交量

TAPI (Total Amount Weighted Stock Index) 指标是根据股票的每日成交值与指数间的关系,来反映股市人气的强弱程度及未来股价展望的技术指标。其理论分析重点为成交值。

加权指数成交值(TAPI)= 当日成交总值 / 当日股票加权指数
MATAPI = TAPI的M日简单移动平均

VSTD

VSTD指标又名成交量标准差,标准差是一种表示数据分散程度的统计学概念,主要是根据数据在一段时间内的波动情况计算而来的,用于描述数据的离散程度。

VSTD指标是求N周期的成交量的估算标准差
VSTD = STD(VOL,N)

超买超卖指标


ADTM动态买卖气指标

ADTM是指动态买卖人气指标,用开盘价的向上波动幅度和向下波动幅度的距离差值来描述人气高低的指标。该指标在+1到-1之间波动,低于-0.5时为很好的买入时点。

如果开盘价 ≤ 昨日开盘价,DTM = 0 
如果开盘价 > 昨日开盘价,DTM = (最高价-开盘价)和(开盘价-昨日开盘价)的较大值

如果开盘价 ≥ 昨日开盘价,DBM = 0
如果开盘价 < 昨日开盘价,DBM = (开盘价-最低价)和(昨日开盘价-开盘价)的较大值

STM = DTM在N日内的和
SBM = DBM在N日内的和

如果STM > SBM 则ADTM = (STM-SBM) / STM
如果STM < SBMADTM = (STM-SBM) / SBM 
如果STM = SBMADTM = 0

ADTMMA = ADTM的M日简单移动平均
参数N设置为23日,参数M设置为8

指标研判

  • ADTM指标在+1到-1之间波动
  • 低于-0.5时为低风险区,高于+0.5时为高风险区,需注意风险。
  • ADTM上穿ADTMMA时,买入股票
  • ADTM跌穿ADTMMA时,卖出股票。
  • 实战使用:ADTM单独使用准确率往往偏低(一般低于50%),更多情况必需经过其它指标过滤,例如使用CCI过滤ADTM后准确率能提升至50%以上。

摆动指标


MI动量指标

MI是使用收盘价计算出来的移动平均值。

移动平均(A,N,1)
其中,A:收盘价-向前引用(收盘价,N)

RC变化率指数

变化率指数RC(Rate of Change)是动力指数的一个翻版。

RC = 收盘价 / 向前引用(收盘价,N)
ARC移动平均(向前引用(RC,1),N,1)

SRMI MI修正指标

SRMI MI修正指标

强弱指标


大盘同步指标

统计总数(
  (收盘价>开盘价 AND 对应大盘收盘价>对应大盘开盘价) 
  OR 
  (收盘价<开盘价 AND 对应大盘收盘价<对应大盘开盘价)
, N) / N

阶段强势指标

A / B
A = 统计总数(收盘价>开盘价 AND 对应大盘收盘价<对应大盘开盘价,N)
B = 统计总数(对应大盘收盘价<对应大盘开盘价,N)

阶段弱势指标

A / B
A = 统计总数(收盘价<开盘价 AND 对应大盘收盘价>对应大盘开盘价,N)
B = 统计总数(对应大盘收盘价>对应大盘开盘价,N)

筑底指标

b:简单移动平均(a,N2)
d:简单移动平均(a,N3)。

a = 统计总数(收盘价 >= 向前引用(收盘价,1), N1) / 统计总数(收盘价<向前引用(收盘价,1), N1)

波动指标

ATR真实波幅

TR代表真实波幅,是当日价格较前一日价格的最大变动值。取以下三项差额的数值中的最大值(取绝对值)为当日的真实波幅:

- 当日的最高价减去当日的最低价的价差
- 当日的最高价减去前一日的收盘价的价差
- 当日的最低价减去前一日的收盘价的价差

真实波幅(ATR)= TR的N日简单移动平均

MASS梅丝指标

DIF=最高价 - 最低价
AHL = DIF的N1天指数平均数
BHL = AHL的N1天指数平均数
MASS= ∑(AHL / BHL)   (i=1~N2)

STD标准差

STD={∑[(Xi - X) ^2] / (n-1)}^(0.5)

Xi为每天涨跌幅序列
X为n天平均涨跌幅,
n默认为26天

VHF纵横指标

先计算N日来最高收盘价与最低收盘价的差,统计N日内今收与昨收的差的累加和,二者的比值即为VHF。 VHF指标,也叫十字过滤线.其主要的作用在于分辨行情的种类,判断目前的行情是盘整市还是单边市,提示投资者应该采取追涨杀跌还是高抛低吸的操作手法,对投资者在不同市场阶段选择激进还是保守的策略很有帮助.

NUM = │HCP-LCP│
DEN=SUM(CLS-CLSn)
VHF=NUM / DEN 

HCP=近N日的最高收盘价
LCP=近N日的最低收盘价
CLS=当日收盘价
CLS(n)=昨日收盘价

N=28(147)

指标研判

  • VHF的值越高,代表目前正处于趋势行情,应选择趋势指标为参考工具.
  • VHF的值越低,代表目前正处于箱型行情,应选择超买超卖指标为参考工具.
  • VHF处于上升状态时,代表股价处于趋势行情.
  • VHF处于下跌状态时,代表股价处于箱型行情.
  • 如果DMI指标中的+DI值高于-DI值,而VHF曲线向上或向下突破X轴时,为中线买点.
  • 如果DMI指标中的+DI值低于-DI值,而VHF曲线向上或向下跌破X轴时,为中线卖点.

CVL佳庆离散指标 VOLATI佳庆波动率

(EC-向前引用(EC,N)) / 向前引用(EC,N) * 100

EC = 指数平滑移动平均(最高价-最低价, N) 

Python wrapper for TA-Lib (http://ta-lib.org/)

This is a Python wrapper for TA-LIB based on Cython instead of SWIG. From the homepage:

TA-Lib is widely used by trading software developers requiring to perform technical analysis of financial market data.

  • Includes 150+ indicators such as ADX, MACD, RSI, Stochastic, Bollinger Bands, etc.
  • Candlestick pattern recognition
  • Open-source API for C/C++, Java, Perl, Python and 100% Managed .NET

The original Python bindings use SWIG which unfortunately are difficult to install and aren’t as efficient as they could be. Therefore this project uses Cython and Numpy to efficiently and cleanly bind to TA-Lib — producing results 2-4 times faster than the SWIG interface.

Install TA-Lib or Read the Docs

Examples

Similar to TA-Lib, the function interface provides a lightweight wrapper of the exposed TA-Lib indicators.

Each function returns an output array and have default values for their parameters, unless specified as keyword arguments. Typically, these functions will have an initial “lookback” period (a required number of observations before an output is generated) set to NaN.

All of the following examples use the function API:

import numpy
import talib

close = numpy.random.random(100)

Calculate a simple moving average of the close prices:

output = talib.SMA(close)

Calculating bollinger bands, with triple exponential moving average:

from talib import MA_Type

upper, middle, lower = talib.BBANDS(close, matype=MA_Type.T3)

Calculating momentum of the close prices, with a time period of 5:

output = talib.MOM(close, timeperiod=5)

Abstract API Quick Start

If you’re already familiar with using the function API, you should feel right at home using the abstract API. Every function takes the same input, passed as a dictionary of Numpy arrays:

import numpy as np
# note that all ndarrays must be the same length!
inputs = {
    'open': np.random.random(100),
    'high': np.random.random(100),
    'low': np.random.random(100),
    'close': np.random.random(100),
    'volume': np.random.random(100)
}

Functions can either be imported directly or instantiated by name:

from talib import abstract
sma = abstract.SMA
sma = abstract.Function('sma')

From there, calling functions is basically the same as the function API:

from talib.abstract import *
output = SMA(input_arrays, timeperiod=25) # calculate on close prices by default
output = SMA(input_arrays, timeperiod=25, price='open') # calculate on opens
upper, middle, lower = BBANDS(input_arrays, 20, 2, 2)
slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0) # uses high, low, close by default
slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])

Learn about more advanced usage of TA-Lib here.

Supported Indicators

We can show all the TA functions supported by TA-Lib, either as a list or as a dict sorted by group (e.g. “Overlap Studies”, “Momentum Indicators”, etc):

import talib

print talib.get_functions()
print talib.get_function_groups()

Function Groups

Overlap Studies

BBANDS               Bollinger Bands
DEMA                 Double Exponential Moving Average
EMA                  Exponential Moving Average
HT_TRENDLINE         Hilbert Transform - Instantaneous Trendline
KAMA                 Kaufman Adaptive Moving Average
MA                   Moving average
MAMA                 MESA Adaptive Moving Average
MAVP                 Moving average with variable period
MIDPOINT             MidPoint over period
MIDPRICE             Midpoint Price over period
SAR                  Parabolic SAR
SAREXT               Parabolic SAR - Extended
SMA                  Simple Moving Average
T3                   Triple Exponential Moving Average (T3)
TEMA                 Triple Exponential Moving Average
TRIMA                Triangular Moving Average
WMA                  Weighted Moving Average

Momentum Indicators

ADX                  Average Directional Movement Index
ADXR                 Average Directional Movement Index Rating
APO                  Absolute Price Oscillator
AROON                Aroon
AROONOSC             Aroon Oscillator
BOP                  Balance Of Power
CCI                  Commodity Channel Index
CMO                  Chande Momentum Oscillator
DX                   Directional Movement Index
MACD                 Moving Average Convergence/Divergence
MACDEXT              MACD with controllable MA type
MACDFIX              Moving Average Convergence/Divergence Fix 12/26
MFI                  Money Flow Index
MINUS_DI             Minus Directional Indicator
MINUS_DM             Minus Directional Movement
MOM                  Momentum
PLUS_DI              Plus Directional Indicator
PLUS_DM              Plus Directional Movement
PPO                  Percentage Price Oscillator
ROC                  Rate of change : ((price/prevPrice)-1)*100
ROCP                 Rate of change Percentage: (price-prevPrice)/prevPrice
ROCR                 Rate of change ratio: (price/prevPrice)
ROCR100              Rate of change ratio 100 scale: (price/prevPrice)*100
RSI                  Relative Strength Index
STOCH                Stochastic
STOCHF               Stochastic Fast
STOCHRSI             Stochastic Relative Strength Index
TRIX                 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
ULTOSC               Ultimate Oscillator
WILLR                Williams' %R

Volume Indicators

AD                   Chaikin A/D Line
ADOSC                Chaikin A/D Oscillator
OBV                  On Balance Volume

Volatility Indicators

ATR                  Average True Range
NATR                 Normalized Average True Range
TRANGE               True Range

Price Transform

AVGPRICE             Average Price
MEDPRICE             Median Price
TYPPRICE             Typical Price
WCLPRICE             Weighted Close Price

Cycle Indicators

HT_DCPERIOD          Hilbert Transform - Dominant Cycle Period
HT_DCPHASE           Hilbert Transform - Dominant Cycle Phase
HT_PHASOR            Hilbert Transform - Phasor Components
HT_SINE              Hilbert Transform - SineWave
HT_TRENDMODE         Hilbert Transform - Trend vs Cycle Mode

Pattern Recognition

CDL2CROWS            Two Crows
CDL3BLACKCROWS       Three Black Crows
CDL3INSIDE           Three Inside Up/Down
CDL3LINESTRIKE       Three-Line Strike
CDL3OUTSIDE          Three Outside Up/Down
CDL3STARSINSOUTH     Three Stars In The South
CDL3WHITESOLDIERS    Three Advancing White Soldiers
CDLABANDONEDBABY     Abandoned Baby
CDLADVANCEBLOCK      Advance Block
CDLBELTHOLD          Belt-hold
CDLBREAKAWAY         Breakaway
CDLCLOSINGMARUBOZU   Closing Marubozu
CDLCONCEALBABYSWALL  Concealing Baby Swallow
CDLCOUNTERATTACK     Counterattack
CDLDARKCLOUDCOVER    Dark Cloud Cover
CDLDOJI              Doji
CDLDOJISTAR          Doji Star
CDLDRAGONFLYDOJI     Dragonfly Doji
CDLENGULFING         Engulfing Pattern
CDLEVENINGDOJISTAR   Evening Doji Star
CDLEVENINGSTAR       Evening Star
CDLGAPSIDESIDEWHITE  Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI    Gravestone Doji
CDLHAMMER            Hammer
CDLHANGINGMAN        Hanging Man
CDLHARAMI            Harami Pattern
CDLHARAMICROSS       Harami Cross Pattern
CDLHIGHWAVE          High-Wave Candle
CDLHIKKAKE           Hikkake Pattern
CDLHIKKAKEMOD        Modified Hikkake Pattern
CDLHOMINGPIGEON      Homing Pigeon
CDLIDENTICAL3CROWS   Identical Three Crows
CDLINNECK            In-Neck Pattern
CDLINVERTEDHAMMER    Inverted Hammer
CDLKICKING           Kicking
CDLKICKINGBYLENGTH   Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM      Ladder Bottom
CDLLONGLEGGEDDOJI    Long Legged Doji
CDLLONGLINE          Long Line Candle
CDLMARUBOZU          Marubozu
CDLMATCHINGLOW       Matching Low
CDLMATHOLD           Mat Hold
CDLMORNINGDOJISTAR   Morning Doji Star
CDLMORNINGSTAR       Morning Star
CDLONNECK            On-Neck Pattern
CDLPIERCING          Piercing Pattern
CDLRICKSHAWMAN       Rickshaw Man
CDLRISEFALL3METHODS  Rising/Falling Three Methods
CDLSEPARATINGLINES   Separating Lines
CDLSHOOTINGSTAR      Shooting Star
CDLSHORTLINE         Short Line Candle
CDLSPINNINGTOP       Spinning Top
CDLSTALLEDPATTERN    Stalled Pattern
CDLSTICKSANDWICH     Stick Sandwich
CDLTAKURI            Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP         Tasuki Gap
CDLTHRUSTING         Thrusting Pattern
CDLTRISTAR           Tristar Pattern
CDLUNIQUE3RIVER      Unique 3 River
CDLUPSIDEGAP2CROWS   Upside Gap Two Crows
CDLXSIDEGAP3METHODS  Upside/Downside Gap Three Methods

Statistic Functions

BETA                 Beta
CORREL               Pearson's Correlation Coefficient (r)
LINEARREG            Linear Regression
LINEARREG_ANGLE      Linear Regression Angle
LINEARREG_INTERCEPT  Linear Regression Intercept
LINEARREG_SLOPE      Linear Regression Slope
STDDEV               Standard Deviation
TSF                  Time Series Forecast
VAR                  Variance

pandas –移动窗口rolling的概念

概念:
​​为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。给个例子好理解一点:

import pandas as pd
s = [1,2,3,5,6,10,12,14,12,30]
pd.Series(s).rolling(window=3).mean()
1
2
3
首先为了好理解,先放上放上pd.Series(s)的样子给大家看看

现在pd.Series(s).rolling(window=3).mean()处理后

不知道大家看出了其中规律没有
首先我们设置的窗口window=3,也就是3个数取一个均值。index 0,1 为NaN,是因为它们前面都不够3个数,等到index2 的时候,它的值是怎么算的呢,就是(index0+index1+index2 )/3
index3 的值就是( index1+index2+index3)/ 3

参数详解
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
1
window: 也可以省略不写。表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。offset详解
min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1。
center: 把窗口的标签设置为居中。布尔型,默认False,居右
win_type: 窗口的类型。截取窗的各种函数。字符串类型,默认为None。各种类型
on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。
axis: int、字符串,默认为0,即对列进行计算
closed:定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。

import pandas as pd
s = [1,2,3,5,None,10,12,14,12,30]
pd.Series(s).rolling(3,min_periods=2).mean()
1
2
3

———————
作者:maymay_
来源:CSDN
原文:https://blog.csdn.net/maymay_/article/details/80241627
版权声明:本文为博主原创文章,转载请附上博文链接!

如何搭建一套数据分析平台

今天教大家如何搭建一套数据分析平台。

它可能是最简单的搭建教程,有一点Python基础都能完成。比起动辄研发数月的成熟系统,借助开源工具,整个时间能压缩在一小时内完成。

优秀的数据分析平台,首先要满足数据查询、统计、多维分析、数据报表等功能。可惜很多分析师,工作的第一年,都是埋葬在SQL语句中,以SQL+Excel的形式完成工作,却用不上高效率的工具。

说Excel也很好用的同学,请先回避一下。

另外一方面,以互联网为代表的公司越来越重视数据,数据获取不再是难点,难点是怎样敏捷分析获得洞察。

市面上已经有不少公司推出企业级的分析平台和BI,可惜它们都是收费的。我相信不少读者听说过,但一直没有机会体验,或者老板们囊中羞涩。现在,完完全全能免费建立一套BI系统,即可以单机版用以分析,也能私有化部署到服务器,成为自家公司的分析工具。

这一切,只需要一小时。

Superset

Superset是一款轻量级的BI工具,由Airbnb的数据部门开源。整个项目基于Python框架,不是Python我也不会推荐了,它集成了Flask、D3、Pandas、SqlAlchemy等。

这是官网的案例(本来是动图的,可惜压缩后也超过微信图片大小限制,吐槽下),想必设计界面已经能秒杀一批市面上的产品了,很多BI真的是浓烈的中国式报表风……因为它的前端基于D3,所以绝大部分的可视化图表都支持,甚至更强大。

Superset本身集成了数据查询功能,查询对分析师那是常有的事。它支持各类主流数据库,包括MySQL、PostgresSQL、Oracle、Impala、SparkSQL等,深度支持Druid。

后台支持权限分配管理,针对数据源分配账户。所以它在部署服务器后,分析师们可以通过它查询数据,也能通过数据建立Dashboard报表。

介绍了这么多,想必大家已经想要安装了吧。

安装

Superset同时支持Python2和Python3, 我这里以Python3作为演示。它支持pip形式的下载,不过我不建议直接安装,因为Superset的依赖包较多,如果直接安装,很容易和现有的模块产生冲突。

这里需要先搭建Python的虚拟环境。虚拟环境可以帮助我们在单机上建立多个版本的Python。简而言之,即可以Python2和Python3共存,也能Python3.3、3.4、3.5共济一堂,彼此间互相独立。

虚拟环境的安装方式很多,pyenv和virtualenv等。这里用Anaconda自带的conda工具。打开电脑终端/cmd,输入以下命令。

conda create -n superset python=3.4

conda create是创建虚拟环境的命令。-n是环境的命名参数,在这里,我们创建了名为superset的环境,它安装在Anaconda的envs目录下。python版本为3.4(superset暂时不支持3.6)。

该命令只会安装基础包,如果需要额外安装其他包,在命令行后加上想要的包名字即可,如python=3.4 numpy pandas。

安装很迅速,完成后,我们的Python环境还是默认版本,现在需要激活虚拟环境。

source activate superset

source activate是激活命令,superset为想要激活的虚拟环境名。windows和mac的命令不一样,win只要activate superset 。如果要退出,则是source deactivate或者deactivate。

激活成功后,命令行前面会多出一个前缀(superset),表明切换到了新的虚拟环境。接下来安装superset。

pip install superset

pip会自动安装所有的依赖,速度可能有点慢,建议更改pip源。

命令行后加上 -i https://pypi.douban.com/simple ,我这里用了豆瓣的镜像源,速度嗖嗖的。

如果安装过程中报错,是部分程序缺失,像系统比较老旧的win用户,需要安装新版的visual c++,网上搜索教程即可。在官网的教程中,还要求pip install cryptography==1.7.2,我没有安装也没有影响,供大家参考。其他报错,都可以通过搜索解决。

安装成功后,需要进行初始化配置,也是在命令行输入。

fabmanager create-admin –app superset

首先用命令行创建一个admin管理员账户,也是后续的登陆账号。会依次提示输入账户名,账户使用者的first name、last name、邮箱、以及确认密码。fabmanager是flask的权限管理命令,如果大家忘了密码,也能重新设立。

superset db upgrade

初始化数据源。

superset load_examples

载入案例数据,这里的案例数据是世界卫生组织的数据,也是上文演示的各类可视化图表,大家登陆后能够直接看到。下载速度还行。

superset init

初始化默认的用户角色和权限。

superset runserver

最后一步骤,启动Superset服务。因为我们是本地环境,所以在浏览器输入 http://localhost:8088 即可。在runserver后面添加 -p XXXX 可更改为其他端口。

进入登陆界面,输入登陆密码,大功告成。

使用

先别急着使用,因为Superset是英文,我们先把它汉化了。Superset自身支持语言切换。

进入到Superset所在目录文件,按我之前的步骤,应该在anaconda/envs/superset/lib/python3.4/site-packages/superset中,路径视各位情况可能有差异。

在目录下有一个叫config.py的文件,打开它,找到Setup default language这一行,修改变量。

BABEL_DEFAULT_LOCALE调整为zh,这样界面默认为中文。languages字典中zh前面的注释#去掉。保存后退出。

接下来还是在Superset的目录下新创建文件夹,按translations/zh/LC_MESSAGES的路径依次创建三个。Superset官网提供了汉化包,在最大的同性交友网站github上下载,目录为:

https://github.com/apache/incubator-superset/blob/master/superset/translations/zh/LC_MESSAGES/messages.mo

网址路径有点长,下载后把mo文件放在LC_MESSAGES文件下。清除浏览器的缓存,重新登陆localhost。

搞定!

需要注意的是,它并非完全汉化,而是汉化了superset相关的部分。部分文字被写入在flask app的文件中,汉化起来比较麻烦。

Superset分为多个模块,安全模块是账号管理相关,包括角色列表,视图权限控制,操作日志等。管理模块没什么用,主要是设计元素。

数据源可以访问和连接数据库,切片是各类数据可视化,均是单图;看板即为Dashboard,是切片的集合,Superset提供了三个初始案例,SQL工具箱是数据查询平台。

麻雀虽小,五脏俱全,对于大部分中小型的企业,Superset足以应付数据分析工作。

先学习连接数据库,这里以我电脑中的数据库为准,如果大家学习过早前的教程,那么数据库中都应该有数据分析师的练习数据,我这里不重复了,可以看历史文章。也可用自带的卫生数据照着练习。

Superset使用了sqlalchemy框架,使用前需要安装数据库驱动程序,先退出runserver,进入superset虚拟环境,安装Python中的MySQL驱动程序。

 pip install pymysql

MySQL的驱动程序很多,除了pymysql,还有mysqlclient等。安装好后,进入数据源,新建一个database连接。

在SQLAlchemy URL中加入数据库的地址,格式为:

mysql+pymysql://root:xxxx@localhost:3306/qin?charset=utf8

mysql是数据库类型,pymysql是驱动程序,表示用pymysql连接mysql数据库,+号不能省略。

另外,root是数据库登陆账号,xxxx为密码,这个按大家自己设立的来。localhost是数据库地址,因为我的是本地环境,所以localhost即可,也可以是127.0.0.1。3306是端口,一般默认这个。qin是需要连接的数据库,也是我自己设的名字。后面带参数charset=utf8,表示编码,因为表里面有中文。

其他数据库的连接大同小异,图中绿色的连接是相关教程。

如果大家在公司网络,拥有内网访问数据库的权限,也可以尝试连接,应该是可以的,这样就能在个人电脑上实行敏捷的BI分析。

格式命名好后,点击测试,出现seems ok,表示成功访问。在选项下面还有个Expose in SQL Lab,允许我们在SQL工具箱查询,要打上勾。

进入到SQL工具箱,左边选择table为DataAnalyst。

直接出来了数据库的数据预览。连查询平台的颜值都那么高。大家的SQL技能应该都很不错,有兴趣可以在这里练习一下,语法和MySQL一致。其他数据库则是其他数据库的语法。

执行一段SQL语句,它支持下载为CSV,我没试过支持最大文件的大小,但作为日常的查询平台是绰绰有余了。

选择Visualize,进入切片绘图模式。

这里自动匹配支持的图表选项,包括Bar Chart条形图,Pir Chart饼图等。下面的选项是定义维度,我们将city,education,postitionName,salary,workYear都勾选为维度。agg_func是聚合功能,这里将职位ID求和,改成count(),点击生成图表。

这里按城市生成了各职位ID求和获得的条形图,也就是不同城市的分析师人数。

左边Chart Options可以调整分析需要的维度。Metrics是分析的度量,这里是count(positionId),Series是条形图中的类别,Breakdowns可以认为是分组或者分桶。这里将Series改成workYear,Breakdowns改成city,点击Query执行。

条形图变更为按工作年限和城市细分的多维条形图。点击Stacked Bars,则切换成堆积柱形图。操作不难。

左侧的选项栏还有其他功能,这里就不多做介绍了,和市面上常见的BI没有多大区别,琢磨一下也就会了。

Superset支持的图表很丰富,如果具备开发能力,也能以D3和Flask为基础做二次开发。Airbnb官方也会不断加入新的图表。不同图表,其左侧的操作选项也不同。

\

上图是以数据分析师职位名称为基础绘制的词云图,生成的速度会比较慢。我们选择save保存。完成的图表均存放在切片下。

Dashboard通过多个切片组合完成,每个切片连接不同的数据源,这是BI的基本逻辑。进入看板界面,新建一个Dashboard。

设置看板相应的配置选项,因为我偷懒了,所以只做了两个切片,大家有兴趣可以继续增加。其他选项忽略,都是自动生成的。点击save,到这一步,BI最重要的Dashboard就完成了。

浏览一下最终的成果吧。

关于Superset的新手教学结束了,要是部署到公司,账号和权限多研究下。它和市面上的其他BI没有太多区别,不过它是我们用Python从零到有一手建立,这个感觉可比用Excel爽不少。虽然我的演示以单机版为主,将其建立在linux服务器上大同小异。

从零开始搭建到现在,排除掉下载花费的时间,大家可以计算是不是真的只用一个小时就搭建好一个数据分析平台?没骗你们吧。

通过搭建Superset,数据分析新手对BI应该也有一个大概的了解,市面上的BI大同小异,只是侧重点不同。在Superset的基础上,往底层完成埋点采集和数据ETL,往上拓展报表监控,CRM等,这些也有不少开源软件可用。至于机器学习,以及Hadoop和Spark更是一个大生态,把这些都算上,则是真正完整的大数据分析平台了。

Superset也有缺陷,它使用的是ORM框架,虽然它能连接众多的数据库,但是它有一个关系映射过程,将SQL数据转化为Python中的对象,这也造成它在大数据量的处理效率不如专业的BI软件。在使用SQL工具箱时,应该尽量避免超大表之间的关联,以及复杂的group by。

我个人的建议是,它只是一款轻量级的BI,复杂的数据关联,应该在ETL过程中完成,Superset只需要执行最终结果表的读取即可。它足够支撑TB级别的数据源读取。技术比较成熟的团队,也能尝试将Superset和Kylin整合,这样OLAP的能力又能上一个台阶。

另外,Superset中的表都是独立的,所以多图表间的复杂联动并不支持,仅支持过滤,这点比较可惜。不知道Airbnb后续会不会支持。

好消息是,这个开源项目一直在更新,github什么也有很多新的功能特性待开发,比如dashboard上加入tab切换栏等。可以star一下关注。

如何七周成为数据分析师08:如何建立数据分析的思维框架?

曾经有人问过我,什么是数据分析思维?如果分析思维是一种结构化的体现,那么数据分析思维在它的基础上再加一个准则:

不是我觉得,而是数据证明。

这是一道分水岭,“我觉得”是一种直觉化经验化的思维,工作不可能处处依赖自己的直觉,公司发展更不可能依赖于此。数据证明则是数据分析的最直接体现,它依托于数据导向型的思维,而不是技巧,前者是指导,后者只是应用。

作为个人,应该如何建立数据分析思维呢?

建立你的指标体系

在我们谈论指标之前,先将时间倒推几十年,现代管理学之父彼得·德鲁克说过一句很经典的话:

如果你不能衡量它,那么你就不能有效增长它。

所谓衡量,就是需要统一标准来定义和评价业务。这个标准就是指标。假设隔壁老王开了一家水果铺子,你问他每天生意怎么样,他可以回答卖的不错,很好,最近不景气。这些都是很虚的词,因为他认为卖的不错也许是卖了50个,而你认为的卖的不错,是卖了100。

这就是“我觉得”造成的认知陷阱。将案例放到公司时,会遇到更多的问题:若有一位运营和你说,产品表现不错,因为每天都有很多人评价和称赞,还给你看了几个截图。而另外一位运营说,产品有些问题,推的活动商品卖的不好,你应该相信谁呢?

其实谁都很难相信,这些众口异词的判断都是因为缺乏数据分析思维造成的。

老王想要描述生意,他应该使用销量,这就是他的指标,互联网想要描述产品,也应该使用活跃率、使用率、转化率等指标。

如果你不能用指标描述业务,那么你就不能有效增长它。

了解和使用指标是数据分析思维的第一步,接下来你需要建立指标体系,孤立的指标发挥不出数据的价值。和分析思维一样,指标也能结构化,也应该用结构化。

我们看一下互联网的产品,一个用户从开始使用到离开,都会经历这些环节步骤。电商APP还是内容平台,都是雷同的。想一想,你会需要用到哪些指标?

Clipboard Image.png

而下面这张图,解释了什么是指标化,这就是有无数据分析思维的差异,也是典型的数据化运营,有空可以再深入讲这块。

Clipboard Image.png

指标体系没有放之四海而皆准的模板,不同业务形态有不同的指标体系。移动APP和网站不一样,SaaS和电子商务不一样,低频消费和高频消费不一样。好比一款婚庆相关的APP,不需要考虑复购率指标;互联网金融,必须要风控指标;电子商务,卖家和买家的指标各不一样。

这些需要不同行业经验和业务知识去学习掌握,那有没有通用的技巧和注意事项呢?

好指标与坏指标

不是所有的指标都是好的。这是初出茅庐者常犯的错误。我们继续回到老王的水果铺子,来思考一下,销量这个指标究竟是不是好的?

最近物价上涨,老王顺应调高了水果价格,又不敢涨的提高,虽然水果销量没有大变化,但老王发现一个月下来没赚多少,私房钱都不够存。

老王这个月的各类水果销量有2000,但最后还是亏本了,仔细研究后发现,虽然销量高,但是水果库存也高,每个月都有几百单位的水果滞销最后过期亏本。

这两个例子都能说明只看销量是一件多不靠谱的事情。销量是一个衡量指标,但不是好指标。老王这种个体经营户,应该以水果铺子的利润为核心要素。

好指标应该是核心驱动指标。虽然指标很重要,但是有些指标需要更重要。就像销量和利润,用户数和活跃用户数,后者都比前者重要。

核心指标不只是写在周报的数字,而是整个运营团队、产品团队乃至研发团队都统一努力的目标。

核心驱动指标和公司发展关联,是公司在一个阶段内的重点方向。记住是一个阶段,不同时期的核心驱动指标不一样。不同业务的核心驱动指标也不一样。

互联网公司常见的核心指标是用户数和活跃率,用户数代表市场的体量和占有,活跃率代表产品的健康度,但这是发展阶段的核心指标。在产品1.0期间,我们应把注意力放到打磨产品上,在大推广前提高产品质量,这时留存率是一个核心指标。而在有一定用户基数的产品后期,商业化比活跃重要,我们会关注钱相关的指标,比如广告点击率、利润率等。

核心驱动指标一般是公司整体的目标,若从个人的岗位职责看,也可以找到自己的核心指标。比如内容运营可以关注阅读数和阅读时长。

核心驱动指标一定能给公司和个人带来最大优势和利益,记得二八法则么?20%的指标一定能带来80%的效果,这20%的指标就是核心。

另外一方面,好的指标还有一个特性,它应该是比率或者比例

拿活跃用户数说明就懂了,我们活跃用户有10万,这能说明什么呢?这说明不了什么。如果产品本身有千万级别的注册用户,那么10万用户说明非常不健康,产品在衰退期。如果产品只拥有四五十万用户,那么说明产品的粘性很高。

正因为单纯的活跃用户数没有多大意义,所以运营和产品会更关注活跃率。这个指标就是一个比率,将活跃用户数除以总用户数所得。所以在设立指标时,我们都尽量想它能不能是比率。

坏指标有哪些呢?

其一是虚荣指标,它没有任何的实际意义。

产品在应用商店有几十万的曝光量,有意义吗?没有,我需要的是实际下载。下载了意义大吗?也不大,我希望用户注册成功。曝光量和下载量都是虚荣指标,只是虚荣程度不一样。

新媒体都追求微信公众号阅读数,如果靠阅读数做广告,那么阅读数有意义,如果靠图文卖商品,那么更应该关注转化率和商品销量,毕竟一个夸张的标题就能带来很高的阅读量,此时的阅读量是虚荣指标。可惜很多老板还是孜孜不倦的追求10W+,哪怕刷量。

虚荣指标是没有意义的指标,往往它会很好看,能够粉饰运营和产品的工作绩效,但我们要避免使用。

第二个坏指标是后验性指标,它往往只能反应已经发生的事情。

比如我有一个流失用户的定义:三个月没有打开APP就算做流失。那么运营每天统计的流失用户数,都是很久没有打开过的,以时效性看,已经发生很久了,也很难通过措施挽回。我知道曾经因为某个不好的运营手段伤害了用户,可是还有用吗?

活动运营的ROI(投资回报率)也是后验性指标,一个活动付出成本后才能知道其收益。可是成本已经支出,活动的好与坏也注定了。活动周期长,还能有调整余地。活动短期的话,这指标只能用作复盘,但不能驱动业务。

第三个坏指标是复杂性指标,它将数据分析陷于一堆指标造成的陷阱中。

指标能细分和拆解,比如活跃率可以细分成日活跃率、周活跃率、月活跃率、老用户活跃率等。数据分析应该根据具体的情况选择指标,如果是天气类工具,可以选择日活跃率,如果是社交APP,可以选择周活跃率,更低频的产品则是月活跃率。

每个产品都有适合它的几个指标,不要一股脑的装一堆指标上去,当你准备了二三十个指标用于分析,会发现无从下手。

指标结构

既然指标太多太复杂不好,那么应该如何正确的选择指标呢?

和分析思维的金字塔结构一样,指标也有固有结构,呈现树状。指标结构的构建核心是以业务流程为思路,以结构为导向。

假设你是内容运营,需要对现有的业务做一个分析,提高内容相关数据,你会怎么做呢?

我们把金字塔思维转换一下,就成了数据分析方法了。

从内容运营的流程开始,它是:内容收集—内容编辑发布—用户浏览—用户点击—用户阅读—用户评论或转发—继续下一篇浏览。

这是一个标准的流程,每个流程都有指标可以建立。内容收集可以建立热点指数,看哪一篇内容比较火。用户浏览用户点击则是标准的PV和UV统计,用户阅读是阅读时长。

Clipboard Image.png

从流程的角度搭建指标框架,可以全面的囊括用户相关数据,无有遗漏。

这套框架列举的指标,依旧要遵循指标原则:需要有核心驱动指标。移除虚荣指标,适当的进行删减,不要为添加指标而添加指标。

维度分析法

当你有了指标,可以着手进行分析,数据分析大体可以分三类,第一类是利用维度分析数据,第二类是使用统计学知识如数据分布假设检验,最后一类是使用机器学习。我们先了解一下维度分析法。

维度是描述对象的参数,在具体分析中,我们可以把它认为是分析事物的角度。销量是一种角度、活跃率是一种角度,时间也是一种角度,所以它们都能算维度。

当我们有了维度后,就能够通过不同的维度组合,形成数据模型。数据模型不是一个高深的概念,它就是一个数据立方体。

Clipboard Image.png

上图就是三个维度组成的数据模型/数据立方体。分别是产品类型、时间、地区。我们既能获得电子产品在上海地区的2010二季度的销量,也能知道书籍在江苏地区的2010一季度销量。

数据模型将复杂的数据以结构化的形式有序的组织起来。我们之前谈到的指标,都可以作为维度使用。下面是范例:

将用户类型、活跃度、时间三个维度组合,观察不同用户群体在产品上的使用情况,是否A群体使用的时长更明显?

将商品类型、订单金额、地区三个维度组合,观察不同地区的不同商品是否存在销量差异?

数据模型可以从不同的角度和层面来观察数据,这样提高了分析的灵活性,满足不同的分析需求、这个过程叫做OLAP(联机分析处理)。当然它涉及到更复杂的数据建模和数据仓库等,我们不用详细知道。

数据模型还有几种常见的技巧、叫做钻取、上卷、切片。

选取就是将维度继续细分。比如浙江省细分成杭州市、温州市、宁波市等,2010年一季度变成1月、2月、3月。上卷则是钻取的相反概念,将维度聚合,比如浙江、上海、江苏聚合成浙江沪维度。切片是选中特定的维度,比如只选上海维度、或者只选2010年一季度维度。因为数据立方体是多维的,但我们观察和比较数据只能在二维、即表格中进行。

Clipboard Image.png

上图的树状结构代表钻取(source和time的细分),然后通过对Route的air切片获得具体数据。

聪明的你可能已经想到,我们常用的数据透视表就是一种维度分析,将需要分析的维度放到行列组合进行求和、计数、平均值等计算。放一张曾经用到的案例图片:用城市维度和工作年限维度,计算平均工资。

Clipboard Image.png

除了Excel、BI、R、Python都能用维度分析法。BI是相对最简便的。

谈到维度法,想要强调的是分析的核心思维之一:对比,不同维度的对比,这大概是对新人快速提高的最佳捷径之一。比如过去和现在的时间趋势对比,比如不同地区维度的对比,比如产品类型的区别对比,比如不同用户的群体对比。单一的数据没有分析意义,只有多个数据组合才能发挥出数据的最大价值。

我想要分析公司的利润,利润 = 销售额 – 成本。那么找出销售额涉及的指标/维度,比如产品类型、地区、用户群体等,通过不断的组合和拆解,找出有问题或者表现良好的原因。成本也是同理。

这就是正确的数据分析思维。总结一下吧:我们通过业务建立和筛选出指标,将指标作为维度,利用维度进行分析。

很多人会问,指标和维度有什么区别?

维度是说明和观察事物的角度,指标是衡量数据的标准。维度是一个更大的范围,不只是数据,比如时间维度和城市维度,我们就无法用指标表示,而指标(留存率、跳出率、浏览时间等)却可以成为维度。通俗理解:维度>指标。

到这里,大家已经有一个数据分析的思维框架了。之所以是框架,因为还缺少具体的技巧,比如如何验证某一个维度是影响数据的关键,比如如何用机器学习提高业务,这些涉及到数据和统计学知识,以后再讲解。

这里我想强调,数据分析并不是一个结果,只是过程。还记得“如果你不能衡量它,那么你就不能有效增长它”这句话吗?数据分析的最终目的就是增长业务。如果数据分析需要绩效指标,一定不会是分析的对错,而是最终数据提升的结果。

数据分析是需要反馈的,当我分析出某项要素左右业务结果,那么就去验证它。告诉运营和产品人员,看看改进后的数据怎么样,一切以结果为准。如果结果并没有改善,那么就应该反思分析过程了。

这也是数据分析的要素,结果作导向。分析若只是当一份报告呈现上去,后续没有任何跟进、改进的措施,那么数据分析等与零。

业务指导数据,数据驱动业务。这才是不二法门。

解答上篇文章的思考题,可能大家等急了。

你是淘宝的数据分析师,现在需要你预估双十一的销量,你不能获得双十一当天和之前的所有数据。只能获得11月12日开始的数据,你应该如何预估?

因为是开放题,所以没有固定答案。

大家的回答分为两类:

一类是通过后续双十一的销量,判断16年,缺点是需要等一年,优点是简单到不像话。

二类是通过11月12日之后的销量数据,往前预估,期间会考虑一些权重。缺点是双十一属于波峰,预估难道大,优点是可操作性好。

因为题目主要看的是分析思维,目的是找出可能的思路,所以有没有其他的方法呢?

我们尝试把思维放开,因为销量能反应商品,有没有其他维度?我们可能会想到:退换货率、和商品评价率。因为双十一的商品只能在12日后退换货和收货后评价,我们就能根据这两个指标平日的平均比率,以及双十一商品的后续退换和评价总数,预估卖出总量。退换货率肯定会虚高一些(毕竟双十一退货不少),那么商品评价率更准确。

还有其他方法么?当然有,比如会有不少人用蚂蚁花呗支付双十一,那么后续还款的比率能不能预估?

如果再将思路放开呢?虽然我不知道淘宝当天的数据,但是可以寻求外部数据,比如京东,京东的双十一销量是多少,是平时的多少倍,那么就用这个倍数去预估淘宝的。

整体的分析结构就分为:

外部数据:

  • 京东等其他平台双十一销量

内部数据:

  • 商品数据:商品评价率、退换货率、商品销量
  • 支付数据:蚂蚁花呗支付比率等

《Python数据分析常用手册》一、NumPy和Pandas篇

一、常用链接:

1.Python官网:https://www.python.org/
2.各种库的whl离线安装包:http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn

3.数据分析常用库的离线安装包(pip+wheels)(百度云):http://pan.baidu.com/s/1dEMXbfN 密码:bbs2


二、常用库

1.NumPy

NumPy是高性能科学计算和数据分析的基础包。部分功能如下:

    • ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
    • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
    • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
    • 线性代数、随机数生成以及傅里叶变换功能。
    • 用于集成C、C++、Fortran等语言编写的代码的工具。

  首先要导入numpy库:import numpy as np

  A NumPy函数和属性:

类型 类型代码 说明
int8、uint8 i1、u1 有符号和无符号8位整型(1字节)
int16、uint16 i2、u2 有符号和无符号16位整型(2字节)
int32、uint32 i4、u4 有符号和无符号32位整型(4字节)
int64、uint64 i8、u8 有符号和无符号64位整型(8字节)
float16 f2 半精度浮点数
float32 f4、f 单精度浮点数
float64 f8、d 双精度浮点数
float128 f16、g 扩展精度浮点数
complex64 c8 分别用两个32位表示的复数
complex128 c16 分别用两个64位表示的复数
complex256 c32 分别用两个128位表示的复数
bool ? 布尔型
object O python对象
string Sn 固定长度字符串,每个字符1字节,如S10
unicode Un 固定长度Unicode,字节数由系统决定,如U10

表2.1.A.1 NumPy类型

 

生成函数 作用
np.array( x)

np.array( x, dtype)

将输入数据转化为一个ndarray

将输入数据转化为一个类型为type的ndarray

np.asarray( array ) 将输入数据转化为一个新的(copy)ndarray
np.ones( N )

np.ones( N, dtype)

np.ones_like( ndarray )

生成一个N长度的一维全一ndarray

生成一个N长度类型是dtype的一维全一ndarray

生成一个形状与参数相同的全一ndarray

np.zeros( N)

np.zeros( N, dtype)

np.zeros_like(ndarray)

生成一个N长度的一维全零ndarray

生成一个N长度类型位dtype的一维全零ndarray

类似np.ones_like( ndarray )

np.empty( N )

np.empty( N, dtype)

np.empty(ndarray)

生成一个N长度的未初始化一维ndarray

生成一个N长度类型是dtype的未初始化一维ndarray

类似np.ones_like( ndarray )

np.eye( N )

np.identity( N )

创建一个N * N的单位矩阵(对角线为1,其余为0)
np.arange( num)

np.arange( begin, end)

np.arange( begin, end, step)

生成一个从0到num-1步数为1的一维ndarray

生成一个从begin到end-1步数为1的一维ndarray

生成一个从begin到end-step的步数为step的一维ndarray

np.mershgrid(ndarray, ndarray,…) 生成一个ndarray * ndarray * …的多维ndarray
np.where(cond, ndarray1, ndarray2) 根据条件cond,选取ndarray1或者ndarray2,返回一个新的ndarray
np.in1d(ndarray, [x,y,…]) 检查ndarray中的元素是否等于[x,y,…]中的一个,返回bool数组
矩阵函数 说明
np.diag( ndarray)

np.diag( [x,y,…])

以一维数组的形式返回方阵的对角线(或非对角线)元素

将一维数组转化为方阵(非对角线元素为0)

np.dot(ndarray, ndarray) 矩阵乘法
np.trace( ndarray) 计算对角线元素的和
排序函数 说明
np.sort( ndarray) 排序,返回副本
np.unique(ndarray) 返回ndarray中的元素,排除重复元素之后,并进行排序
np.intersect1d( ndarray1, ndarray2)

np.union1d( ndarray1, ndarray2)

np.setdiff1d( ndarray1, ndarray2)

np.setxor1d( ndarray1, ndarray2)

返回二者的交集并排序。

返回二者的并集并排序。

返回二者的差。

返回二者的对称差

一元计算函数 说明
np.abs(ndarray)

np.fabs(ndarray)

计算绝对值

计算绝对值(非复数)

np.mean(ndarray) 求平均值
np.sqrt(ndarray) 计算x^0.5
np.square(ndarray) 计算x^2
np.exp(ndarray) 计算e^x
log、log10、log2、log1p 计算自然对数、底为10的log、底为2的log、底为(1+x)的log
np.sign(ndarray) 计算正负号:1(正)、0(0)、-1(负)
np.ceil(ndarray)

np.floor(ndarray)

np.rint(ndarray)

计算大于等于改值的最小整数

计算小于等于该值的最大整数

四舍五入到最近的整数,保留dtype

np.modf(ndarray) 将数组的小数和整数部分以两个独立的数组方式返回
np.isnan(ndarray) 返回一个判断是否是NaN的bool型数组
np.isfinite(ndarray)

np.isinf(ndarray)

返回一个判断是否是有穷(非inf,非NaN)的bool型数组

返回一个判断是否是无穷的bool型数组

cos、cosh、sin、sinh、tan、tanh 普通型和双曲型三角函数
arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函数和双曲型反三角函数
np.logical_not(ndarray) 计算各元素not x的真值,相当于-ndarray
多元计算函数 说明
np.add(ndarray, ndarray)

np.subtract(ndarray, ndarray)

np.multiply(ndarray, ndarray)

np.divide(ndarray, ndarray)

np.floor_divide(ndarray, ndarray)

np.power(ndarray, ndarray)

np.mod(ndarray, ndarray)

相加

相减

乘法

除法

圆整除法(丢弃余数)

次方

求模

np.maximum(ndarray, ndarray)

np.fmax(ndarray, ndarray)

np.minimun(ndarray, ndarray)

np.fmin(ndarray, ndarray)

求最大值

求最大值(忽略NaN)

求最小值

求最小值(忽略NaN)

np.copysign(ndarray, ndarray) 将参数2中的符号赋予参数1
np.greater(ndarray, ndarray)

np.greater_equal(ndarray, ndarray)

np.less(ndarray, ndarray)

np.less_equal(ndarray, ndarray)

np.equal(ndarray, ndarray)

np.not_equal(ndarray, ndarray)

>

>=

<

<=

==

!=

logical_and(ndarray, ndarray)

logical_or(ndarray, ndarray)

logical_xor(ndarray, ndarray)

&

|

^

np.dot( ndarray, ndarray) 计算两个ndarray的矩阵内积
np.ix_([x,y,m,n],…) 生成一个索引器,用于Fancy indexing(花式索引)
文件读写 说明
np.save(string, ndarray) 将ndarray保存到文件名为 [string].npy 的文件中(无压缩)
np.savez(string, ndarray1, ndarray2, …) 将所有的ndarray压缩保存到文件名为[string].npy的文件中
np.savetxt(sring, ndarray, fmt, newline=’\n’) 将ndarray写入文件,格式为fmt
np.load(string) 读取文件名string的文件内容并转化为ndarray对象(或字典对象)
np.loadtxt(string, delimiter) 读取文件名string的文件内容,以delimiter为分隔符转化为ndarray

表2.1.A.2 np常用函数

  B NumPy.ndarray函数和属性:

ndarray.ndim 获取ndarray的维数
ndarray.shape 获取ndarray各个维度的长度
ndarray.dtype 获取ndarray中元素的数据类型
ndarray.T 简单转置矩阵ndarray
表2.1.B.1 ndarray属性
函数 说明
ndarray.astype(dtype) 转换类型,若转换失败则会出现TypeError
ndarray.copy() 复制一份ndarray(新的内存空间)
ndarray.reshape((N,M,…)) 将ndarray转化为N*M*…的多维ndarray(非copy)
ndarray.transpose((xIndex,yIndex,…)) 根据维索引xIndex,yIndex…进行矩阵转置,依赖于shape,不能用于一维矩阵(非copy)
ndarray.swapaxes(xIndex,yIndex) 交换维度(非copy)
计算函数 说明
ndarray.mean( axis=0 ) 求平均值
ndarray.sum( axis= 0) 求和
ndarray.cumsum( axis=0)

ndarray.cumprod( axis=0)

累加

累乘

ndarray.std()

ndarray.var()

方差

标准差

ndarray.max()

ndarray.min()

最大值

最小值

ndarray.argmax()

ndarray.argmin()

最大值索引

最小值索引

ndarray.any()

ndarray.all()

是否至少有一个True

是否全部为True

ndarray.dot( ndarray) 计算矩阵内积
排序函数 说明
ndarray.sort(axis=0) 排序,返回源数据

表2.1.B.2 ndarray函数

ndarray[n] 选取第n+1个元素
ndarray[n:m] 选取第n+1到第m个元素
ndarray[:] 选取全部元素
ndarray[n:] 选取第n+1到最后一个元素
ndarray[:n] 选取第0到第n个元素
ndarray[ bool_ndarray ]

注:bool_ndarray表示bool类型的ndarray

选取为true的元素
ndarray[[x,y,m,n]]… 选取顺序和序列为x、y、m、n的ndarray
ndarray[n,m]

ndarray[n][m]

选取第n+1行第m+1个元素
ndarray[n,m,…]

ndarray[n][m]….

选取n行n列….的元素

表2.1.B.3 ndarray索引/切片方式

  C NumPy.random函数和属性:

函数 说明
seed()

seed(int)

seed(ndarray)

确定随机数生成种子
permutation(int)

permutation(ndarray)

返回一个一维从0~9的序列的随机排列

返回一个序列的随机排列

shuffle(ndarray) 对一个序列就地随机排列
rand(int)

randint(begin,end,num=1)

产生int个均匀分布的样本值

从给定的begin和end随机选取num个整数

randn(N, M, …) 生成一个N*M*…的正态分布(平均值为0,标准差为1)的ndarray
normal(size=(N,M,…)) 生成一个N*M*…的正态(高斯)分布的ndarray
beta(ndarray1,ndarray2) 产生beta分布的样本值,参数必须大于0
 chisquare() 产生卡方分布的样本值
 gamma() 产生gamma分布的样本值
 uniform() 产生在[0,1)中均匀分布的样本值

 2.1.C.1 random常用函数

  D NumPy.linalg函数和属性:

函数 说明
det(ndarray) 计算矩阵列式
eig(ndarray) 计算方阵的本征值和本征向量
inv(ndarray)

pinv(ndarray)

计算方阵的逆

计算方阵的Moore-Penrose伪逆

qr(ndarray) 计算qr分解
svd(ndarray) 计算奇异值分解svd
solve(ndarray) 解线性方程组Ax = b,其中A为方阵
lstsq(ndarray) 计算Ax=b的最小二乘解

 2.1.D.1 linalg常用函数

2.Pandas

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

>>> from pandas import Series, DataFrame

>>> import pandas as pd

  A.pandas

函数 说明
pd.isnull(series)

pd.notnull(series)

判断是否为空(NaN)

判断是否不为空(not NaN)

2.2.A.1 pandas常用函数

  B.Series

Series可以运用ndarray或字典的几乎所有索引操作和函数,融合了字典和ndarray的优点。

属性 说明
values 获取数组
index 获取索引
name values的name
index.name 索引的name
2.2.B.1 Series常用属性
函数 说明
Series([x,y,…])Series({‘a’:x,’b’:y,…}, index=param1) 生成一个Series
Series.copy() 复制一个Series
Series.reindex([x,y,…], fill_value=NaN)

Series.reindex([x,y,…], method=NaN)

Series.reindex(columns=[x,y,…])

重返回一个适应新索引的新对象,将缺失值填充为fill_value

返回适应新索引的新对象,填充方式为method

对列进行重新索引

Series.drop(index) 丢弃指定项
Series.map(f) 应用元素级函数
排序函数 说明
Series.sort_index(ascending=True) 根据索引返回已排序的新对象
Series.order(ascending=True) 根据值返回已排序的对象,NaN值在末尾
Series.rank(method=’average’, ascending=True, axis=0) 为各组分配一个平均排名
df.argmax()

df.argmin()

返回含有最大值的索引位置

返回含有最小值的索引位置

2.2.B.2 Series常用函数

reindex的method选项:

      ffill, bfill     向前填充/向后填充
      pad, backfill   向前搬运,向后搬运
    rank的method选项
      ’average’    在相等分组中,为各个值分配平均排名
      ’max’,’min’   使用整个分组中的最小排名

      ’first’      按值在原始数据中出现的顺序排名

  C.DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。

DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。行也可以通过位置或名称的方式进行获取。

为不存在的列赋值会创建新列。

>>> del frame[‘xxx’]  # 删除列

属性 说明
values DataFrame的值
index 行索引
index.name 行索引的名字
columns 列索引
columns.name 列索引的名字
ix 返回行的DataFrame
ix[[x,y,…], [x,y,…]] 对行重新索引,然后对列重新索引
T frame行列转置

2.2.C.1 DataFrame常用属性

 

函数 说明
DataFrame(dict, columns=dict.index, index=[dict.columnnum])

DataFrame(二维ndarray)

DataFrame(由数组、列表或元组组成的字典)

DataFrame(NumPy的结构化/记录数组)

DataFrame(由Series组成的字典)

DataFrame(由字典组成的字典)

DataFrame(字典或Series的列表)

DataFrame(由列表或元组组成的列表)

DataFrame(DataFrame)

DataFrame(NumPy的MaskedArray)

构建DataFrame

数据矩阵,还可以传入行标和列标

每个序列会变成DataFrame的一列。所有序列的长度必须相同

类似于“由数组组成的字典”

每个Series会成为一列。如果没有显式制定索引,则各Series的索引会被合并成结果的行索引

各内层字典会成为一列。键会被合并成结果的行索引。

各项将会成为DataFrame的一行。索引的并集会成为DataFrame的列标。

类似于二维ndarray

沿用DataFrame

类似于二维ndarray,但掩码结果会变成NA/缺失值

 

df.reindex([x,y,…], fill_value=NaN, limit)

df.reindex([x,y,…], method=NaN)

df.reindex([x,y,…], columns=[x,y,…],copy=True)

返回一个适应新索引的新对象,将缺失值填充为fill_value,最大填充量为limit

返回适应新索引的新对象,填充方式为method

同时对行和列进行重新索引,默认复制新对象。

df.drop(index, axis=0) 丢弃指定轴上的指定项。
排序函数 说明
df.sort_index(axis=0, ascending=True)

df.sort_index(by=[a,b,…])

根据索引排序
汇总统计函数 说明
df.count() 非NaN的数量
df.describe() 一次性产生多个汇总统计
df.min()

df.min()

最小值

最大值

df.idxmax(axis=0, skipna=True)

df.idxmin(axis=0, skipna=True)

返回含有最大值的index的Series

返回含有最小值的index的Series

df.quantile(axis=0) 计算样本的分位数
df.sum(axis=0, skipna=True, level=NaN)

df.mean(axis=0, skipna=True, level=NaN)

df.median(axis=0, skipna=True, level=NaN)

df.mad(axis=0, skipna=True, level=NaN)

df.var(axis=0, skipna=True, level=NaN)

df.std(axis=0, skipna=True, level=NaN)

df.skew(axis=0, skipna=True, level=NaN)

df.kurt(axis=0, skipna=True, level=NaN)

df.cumsum(axis=0, skipna=True, level=NaN)

df.cummin(axis=0, skipna=True, level=NaN)

df.cummax(axis=0, skipna=True, level=NaN)

df.cumprod(axis=0, skipna=True, level=NaN)

df.diff(axis=0)

df.pct_change(axis=0)

返回一个含有求和小计的Series

返回一个含有平均值的Series

返回一个含有算术中位数的Series

返回一个根据平均值计算平均绝对离差的Series

返回一个方差的Series

返回一个标准差的Series

返回样本值的偏度(三阶距)

返回样本值的峰度(四阶距)

返回样本的累计和

返回样本的累计最大值

返回样本的累计最小值

返回样本的累计积

返回样本的一阶差分

返回样本的百分比数变化

计算函数 说明 
df.add(df2, fill_value=NaN, axist=1)

df.sub(df2, fill_value=NaN, axist=1)

df.div(df2, fill_value=NaN, axist=1)

df.mul(df2, fill_value=NaN, axist=1)

元素级相加,对齐时找不到元素默认用fill_value

元素级相减,对齐时找不到元素默认用fill_value

元素级相除,对齐时找不到元素默认用fill_value

元素级相乘,对齐时找不到元素默认用fill_value

df.apply(f, axis=0) 将f函数应用到由各行各列所形成的一维数组上
df.applymap(f) 将f函数应用到各个元素上
df.cumsum(axis=0, skipna=True) 累加,返回累加后的dataframe

2.2.C.2 Dataframe常用函数

索引方式 说明
df[val] 选取DataFrame的单个列或一组列
df.ix[val] 选取Dataframe的单个行或一组行
df.ix[:,val] 选取单个列或列子集
df.ix[val1,val2] 将一个或多个轴匹配到新索引
reindex方法 将一个或多个轴匹配到新索引
xs方法 根据标签选取单行或者单列,返回一个Series
icol、irow方法 根据整数位置选取单列或单行,并返回一个Series
get_value、set_value 根据行标签和列标签选取单个值

2.2.C.3 Dataframe常用索引方式

    运算:

默认情况下,Dataframe和Series之间的算术运算会将Series的索引匹配到的Dataframe的列,沿着列一直向下传播。若索引找不到,则会重新索引产生并集。

  D.Index

pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index。Index对象不可修改,从而在多个数据结构之间安全共享。

主要的Index对象 说明
Index 最广泛的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组
Int64Index 针对整数的特殊Index
MultiIndex “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组
DatetimeIndex 存储纳秒级时间戳(用NumPy的Datetime64类型表示)
PeriodIndex 针对Period数据(时间间隔)的特殊Index

2.2.D.1 主要的Index属性

函数 说明
Index([x,y,…]) 创建索引
append(Index) 连接另一个Index对象,产生一个新的Index
diff(Index) 计算差集,产生一个新的Index
intersection(Index) 计算交集
union(Index) 计算并集
isin(Index) 检查是否存在与参数索引中,返回bool型数组
delete(i) 删除索引i处元素,得到新的Index
drop(str) 删除传入的值,得到新Index
insert(i,str) 将元素插入到索引i处,得到新Index
is_monotonic() 当各元素大于前一个元素时,返回true
is_unique() 当Index没有重复值时,返回true
unique() 计算Index中唯一值的数组

2.2.D.2 常用Index函数

pandas DataFrame-行列索引及值的获取

pandas DataFrame是二维的,所以,它既有列索引,又有行索引

import pandas as pd

df = pd.DataFrame({‘A’: [0, 1, 2], ‘B’: [3, 4, 5]})
print df

# 结果:
A B
0 0 3
1 1 4
2 2 5
复制代码
行索引自动生成了 0,1,2

如果要自己指定行索引和列索引,可以使用 index 和 column 参数:

这个数据是5个车站10天内的客流数据:

复制代码
ridership_df = pd.DataFrame(
data=[[ 0, 0, 2, 5, 0],
[1478, 3877, 3674, 2328, 2539],
[1613, 4088, 3991, 6461, 2691],
[1560, 3392, 3826, 4787, 2613],
[1608, 4802, 3932, 4477, 2705],
[1576, 3933, 3909, 4979, 2685],
[ 95, 229, 255, 496, 201],
[ 2, 0, 1, 27, 0],
[1438, 3785, 3589, 4174, 2215],
[1342, 4043, 4009, 4665, 3033]],
index=[’05-01-11′, ’05-02-11′, ’05-03-11′, ’05-04-11′, ’05-05-11′,
’05-06-11′, ’05-07-11′, ’05-08-11′, ’05-09-11′, ’05-10-11′],
columns=[‘R003’, ‘R004’, ‘R005’, ‘R006’, ‘R007’]
)
复制代码
data 参数为一个numpy二维数组, index 参数为行索引, column 参数为列索引

生成的数据以表格形式显示:

复制代码
R003 R004 R005 R006 R007
05-01-11 0 0 2 5 0
05-02-11 1478 3877 3674 2328 2539
05-03-11 1613 4088 3991 6461 2691
05-04-11 1560 3392 3826 4787 2613
05-05-11 1608 4802 3932 4477 2705
05-06-11 1576 3933 3909 4979 2685
05-07-11 95 229 255 496 201
05-08-11 2 0 1 27 0
05-09-11 1438 3785 3589 4174 2215
05-10-11 1342 4043 4009 4665 3033
复制代码
下面说下如何获取DataFrame里的值:

1.获取某一列: 直接 [‘key’]

复制代码
print(ridership_df[‘R003’])

# 结果:
05-01-11 0
05-02-11 1478
05-03-11 1613
05-04-11 1560
05-05-11 1608
05-06-11 1576
05-07-11 95
05-08-11 2
05-09-11 1438
05-10-11 1342
Name: R003, dtype: int64
复制代码
2.获取某一行: .loc[‘key’]

复制代码
print(ridership_df.loc[’05-01-11′])
# 或者
print(ridership_df.iloc[0])

# 结果:
R003 0
R004 0
R005 2
R006 5
R007 0
Name: 05-01-11, dtype: int64
复制代码
3.获取某一行某一列的某个值:

print(ridership_df.loc[’05-05-11′,’R003′])
# 或者
print(ridership_df.iloc[4,0])

# 结果:
1608
4.获取原始的numpy二维数组:

复制代码
print(ridership_df.values)

# 结果:
[[ 0 0 2 5 0]
[1478 3877 3674 2328 2539]
[1613 4088 3991 6461 2691]
[1560 3392 3826 4787 2613]
[1608 4802 3932 4477 2705]
[1576 3933 3909 4979 2685]
[ 95 229 255 496 201]
[ 2 0 1 27 0]
[1438 3785 3589 4174 2215]
[1342 4043 4009 4665 3033]]
复制代码
*注意在这过程中,数据格式如果不一致,会发生转换.

一个综合栗子:

从 ridership_df 找出第一天里客流量最多的车站,然后返回这个车站的日平均客流,以及返回所有车站的平均日客流,作为对比:

复制代码
def mean_riders_for_max_station(ridership):
max_index = ridership.iloc[0].argmax()
mean_for_max = ridership[max_index].mean()
overall_mean = ridership.values.mean()
return (overall_mean, mean_for_max)

print mean_riders_for_max_station(ridership_df)

# 结果:
(2342.6, 3239.9)
复制代码

正确安装python talib库

1.环境 win7,64位, anaconder,pyhon2.7,3.5.。网上找来很多方法不管用。

2. 用anaconda装也不行。最后是从这个帖子,发现好像官网的是32位,我们要下64位的:
    http://stackoverflow.com/questions/28103010/error-installing-ta-lib-for-anaconda
    找到这个link:
    http://www.lfd.uci.edu/~gohlke/pythonlibs/
    从那边下载的这个:

    TA_Lib-0.4.17-cp35-cp35m-win_amd64.whl

    TA_Lib-0.4.17-cp27-cp27m-win_amd64.whl

3. 然后在anaconder python2.7 的命令行下: 

    pip install TTA_Lib-0.4.17-cp27-cp27m-win_amd64.whl,显示安装成功,但实际在python2.7的环境下,

    import talib会明显出错。 报:“ImportError: cannot import name __TA_FUNCTION_NAMES__”

    不知原因。

4. 然后在anaconder python3.5 的命令行下: 

    pip install TA_Lib-0.4.9-cp35-none-win_amd64.whl

    实测通过。

如何将 WordPress 博客发布到静态 GitLab Pages 上

很久以前,我为一个家庭成员建立了一个 WordPress 博客。如今有很多选择,但是当时如果你需要一个带有所见即所得的编辑器的基于 Web 的 CMS,那么就没什么像样的的选择了。而一切运行良好的不幸的副作用是随着时间的推移该博客产生了很多内容。这意味着我要经常更新 WordPress 以防止不断出现的漏洞。

因此,当我决定劝说家人切换到 Hugo[1] 会相对容易,然后可以在 GitLab[2] 上托管博客。但是尝试提取所有内容并将其转换为 Markdown[3] 变成了一个巨大的麻烦。有自动脚本完成了 95% 的工作,但并不完美。手动更新所有帖子不是我想做的事情,所以最终,我放弃了试图移动博客。

最近,我又开始考虑这个问题,并意识到有一个我没有考虑过的解决方案:我可以继续维护 WordPress 服务器,但将其设置为发布静态镜像,并使用 GitLab Pages[4](或 GitHub Pages[5] ,如果你喜欢的话)提供服务。这能让我自动化 Let’s Encrypt[6] 证书续订并消除与托管 WordPress 站点相关的安全问题。然而,这意味着评论将无法使用,但在这种情况下感觉就像是一个小损失,因为博客没有收到很多评论。

这是我提出的解决方案,到目前为止似乎运作良好:

托管 WordPress 站点中的 URL 没有链接到或来自其他任何地方,以减少它被利用的几率。在此例中,我们将使用 http://private.localconspiracy.com(即使此站点实际上是使用 Pelican 构建的)。
将公共 URL https://www.localconspiracy.com 托管到 GitLab Pages 上[7]。
添加 cron 任务[8],确定两个 URL 之间的最后构建日期何时不同。如果构建日期不同,则镜像 WordPress 版本。
使用 wget 镜像后,将所有链接从“私有”更新成“公共”。
运行 git push 来发布新内容。
这是我使用的两个脚本:

check-diff.sh (cron 每 15 分钟调用一次):

#!/bin/bash

ORIGINDATE=”$(curl -v –silent http://private.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)”
PUBDATE=”$(curl -v –silent https://www.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)”

if [ “$ORIGINDATE” != “$PUBDATE” ]
then
/home/doc/repos/localconspiracy/mirror.sh
fi
mirror.sh:

#!/bin/sh

cd /home/doc/repos/localconspiracy

wget \
–mirror \
–convert-links \
–adjust-extension \
–page-requisites \
–retry-connrefused \
–exclude-directories=comments \
–execute robots=off \
http://private.localconspiracy.com

git rm -rf public/*
mv private.localconspiracy.com/* public/.
rmdir private.localconspiracy.com
find ./public/ -type f -exec sed -i -e ‘s|http://private.localconspiracy|https://www.localconspiracy|g’ {} \;
find ./public/ -type f -exec sed -i -e ‘s|http://www.localconspiracy|https://www.localconspiracy|g’ {} \;
git add public/*
git commit -m “new snapshot”
git push origin master
就是这些了!现在,当博客发生变化时,在 15 分钟内将网站镜像到静态版本并推送到仓库,这将在 GitLab Pages 中反映出来。

如果你想在本地运行 WordPress[9],这个概念可以进一步扩展。在这种情况下,你不需要服务器来托管你的 WordPress 博客。你可以在本机运行它。在这种情况下,你的博客不可能被攻击利用。只要你可以在本地运行 wget,就可以使用上面的方法在 GitLab Pages 上托管 WordPress 站点。