python stock 量化投资和股票分析 mpl_finance 画图

python stock 量化投资和股票分析,python的numpy、pandas包写上几行代码,再用matplotlib画上几张图,用sklearn(scikit-learn)包的模型画个传统机器学习的模型又或用tensorflow或者pytorch等框架套入深度学习,云云如是

python stock 这两个词原本是互不相干的,不知具体从何时起,量化投资股票分析数据模型python数据分析等等各种词汇的联系越来越多,从而使得很多所谓的交易高手股市技术流股票大佬在各个平台来吹嘘自己的交易策略有多么的厉害。
拿着python的numpypandas包写上几行很多小白看不明白的代码,再用matplotlib画上几张图,就说自己的交易策略;稍微知道的多就会在用sklearn(scikit-learn)包的模型画个传统机器学习的模型;再厉害一些的呢就用tensorflow或者pytorch等框架套入数据做个深度学习的模型,云云如是… 基本的教学大纲差不多是下边这样的。
我和我的小伙伴都惊呆了...
呆!股市大狗在此,哪里逃…

python stock 股票数据来源

  • 合法爬虫
  • 现成的python包数据调用,如yfinance
  • 臆想出来的

雅虎的yfinance还是很好用的,如果读者没法使用就可以参考笔者之前的爬虫文章去正规的网站上爬取股票数据,至于怎么做到合法呢?就是看网站域名下的robots.txt文件是什么样的,比如很多人都是知道的东方财富网,我们直接在它的根域名后边跟一个robots.txt,在浏览器地址栏中加载看一下

https://www.eastmoney.com/robots.txt

而浏览器加载的结果如下,我们看到User-agent没有具体的指向,并且Disallow 又没有说不允许谁来爬,所以呢爬TM的没问题。

User-agent: *
Allow: /
Sitemap: http://www.eastmoney.com/sitemap.xml

数据初探和哔哩哔哩

如上文所说我们用yfinance加载数据,用特斯拉(TSLA)的日交易数据来演示一哈。

import yfinance as yf

tsla= yf.Ticker("tsla")
data = tsla.history(start="2020-06-01", end="2022-06-30", interval="1d")
print(data.head(2))
print(data.columns)
                           Date        Open  ...  Dividends  Stock Splits
2020-06-01  2020-06-01 00:00:00  171.600006  ...          0           0.0
2020-06-02  2020-06-02 00:00:00  178.940002  ...          0           0.0

Index(['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Dividends',
       'Stock Splits'],
      dtype='object')

到了这里大佬们会比哔哩哔哩一下这些数据都是啥,比如这些数据的含义啊,什么日开盘价、收盘价、交易量等等,然后会在介绍一下,要用什么来计算指标,然后又用这些指标来达到什么样的效果。自己知道且有耐心的老师还会给说一下这些指标具体的数学本质是啥。

matplotlib画个MACD图

先计算上线布林线,整个过程都是pandas dataframe的常规计算,没有什么特殊的,如果非要摆一摆就是把这个MACD的含义啊,pandas的使用啊,数学意义啊,股市指标价值啊,巴拉巴拉讲上几节课。

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt
plt.style.use('seaborn-colorblind')

# 短线EMA
shortEMA = history.Close.ewm(span=12, adjust=False).mean()
# 长线EMA
longEMA = history.Close.ewm(span=26, adjust=False).mean()
# MACD
MACD = shortEMA - longEMA

single_line = MACD.ewm(span=9, adjust=False).mean()

plt.figure(figsize=(12.2, 4.5))
plt.plot(history.index, MACD, label='TSLA MACD', color='r')
plt.plot(history.index, single_line, label='Single Line', color='b')
plt.xticks(rotation=45)
plt.legend(loc='upper left')
plt.show()
matplotlib画的特斯拉MACD图
MACD线

mplfinance 画个K线图

malfinace 本身以前是matplotlib的一个模块,但是从19年开始独立出来了,所以读者如果用的是较新的python环境必须的从新安装一下,模块也好,包也罢都可能会是另一个知识点,因为小白们是不知道怎么用这些工具的,得学啊。

==================================

   WARNING: `mpl_finance` is deprecated:

    Please use `mplfinance` instead (no hyphen, no underscore).

    To install: `pip install --upgrade mplfinance` 

   For more information, see: https://pypi.org/project/mplfinance/

======================================

BOLLING 计算

data['SMA'] = data['Close'].rolling(window=20).mean()
# 计算 standard deviation
data['STD'] = data['Close'].rolling(window=20).std()
data['UpperLine'] = data['SMA'] + (data['STD'] * 2)
data['LowerLine'] = data['SMA'] - (data['STD'] * 2)
add_plot = mpf.make_addplot(data[['UpperLine', 'LowerLine']],linestyle='dashdot')
mpf.plot(data, addplot=add_plot, type='ohlc', volume=True)
malfinace 实现特斯拉的日K线图
malfinace K线图

机器学习做个模型吧

嘿嘿嘿,笔者不想在此篇文章里写模型的代码了,至此算是骗个炮吧:stuck_out_tongue_winking_eye:,以后空了再来后续骗。

首页 » 概率统计

built in functions 内置函数 hive sql 数据计算

built in functions 内置函数,顾名思义是内部的函数,所谓内部主要是指解析器内部。通俗的讲就是我们用什么语言或者什么工具它自带的一些具有某些快速计算逻辑的方法或者函数。hive sql同样也具有很多这样的内置函数

built in functions 内置函数,顾名思义是内部的函数,所谓内部主要是指解析器内部。通俗的讲就是我们用什么语言或者什么工具它自带的一些具有某些快速计算逻辑的方法或者函数。hive sql同样也具有很多这样的内置函数,笔者不对所有的内置函数做罗列,我们拿具体的数据来展示效果。

我们在以前的文章中对于hive sql 的一些内置方法也有过简单的介绍,比如与数据行号相关的方法

背景介绍

字段名注释
article_id文章ID
height屏高
position页面位置
duration阅读时长
scoll_number滚屏次数
words_number文章字数
hive table informations

截取hive table的部分字段来运用内置函数来计算对应数据的科学计数效果

hive table datas for build in functions
hive table datas

平均值、最大值和最小值

SELECT  MIN(scoll_number) min_value
        ,MAX(scoll_number) max_value
        ,AVG(scoll_number) avg_value
        ,SUM(scoll_number) total_value
        ,COUNT(scoll_number) count_value
FROM    ads_recommend_article_statistic
;
min_valuemax_valueavg_valuetotal_valuecount_value
01167.3667296786389423897529
最大值、最小值、平均值 内置函数

方差、协方差、N位值、相关系数

SELECT  STDDEV(scoll_number) stddev_value, --标准差
        STDDEV_SAMP(scoll_number) samp_value --标准差 精度更细,小量数据计算
        ,var_samp(scoll_number) var_value --方差
        ,covar_pop(scoll_number, words_number) covar_value -- 协方差
        ,percentile(scoll_number, 0.4) percent_value --4分位值
        ,percentile(scoll_number, 0.5) percent_value --中位值
        ,corr(scoll_number, words_number) corr_value --皮尔逊系数
FROM    ads_recommend_article_statistic
科学计数公式函数
方差公式:
m为x1,x2...xn数列的期望值(平均数)
s^2 = [(x1-m)^2 + (x2-m)^2 + ... (xn-m)^2]/n

s即为标准差
s^2为方差。
首页 » 概率统计

朴素贝叶斯分类器(Naive Bayesian Classifier)浅谈

In probability theory and statisticsBayes’ theorem (alternatively Bayes’ law or Bayes’ rule; recently Bayes–Price theorem[1]:44, 45, 46 and 67), named after the Reverend Thomas Bayes, describes the probability of an event, based on prior knowledge of conditions that might be related to the event.[2] For example, if the risk of developing health problems is known to increase with age, Bayes’ theorem allows the risk to an individual of a known age to be assessed more accurately (by conditioning it on their age) than simply assuming that the individual is typical of the population as a whole.
One of the many applications of Bayes’ theorem is Bayesian inference, a particular approach to statistical inference. When applied, the probabilities involved in the theorem may have different probability interpretations. With Bayesian probability interpretation, the theorem expresses how a degree of belief, expressed as a probability, should rationally change to account for the availability of related evidence. Bayesian inference is fundamental to Bayesian statistics.

摘自维基百科

上文的翻译请各位童鞋自行解决,简单总一下贝叶斯定律是一种计算概率的公式,这个概率的计算考虑了与随机事件相关的因素;一句话就是它所阐述了后验概率的获得方法

朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;对大数量训练和查询时具有较高的速度,即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已;对小规模的数据表现很好,能个处理多分类任务,适合增量式训练(即可以实时的对新增的样本进行训练);对缺失数据不太敏感,算法也比较简单,常用于文本分类;朴素贝叶斯对结果解释容易理解。

闪亮的贝叶斯定理

预备知识点一:

指数定律
对数特性
贝叶斯定理的数学公式

c表示的是随机事件发生的一种情况。x表示的就是证据(evidence)/状况(condition),泛指与随机事件相关的因素。

  • P(c|x):在x的条件下,随机事件出现c情况的概率。(后验概率)
  • P( c ):(不考虑相关因素)随机事件出现c情况的概率。(先验概率)
  • P(x|c):在已知事件出现c情况的条件下,条件x出现的概率。(后验概率)
  • P(x):x出现的概率。(先验概率)

一般情况下,我们在实际的问题当中,我们想获得的核心结果其实也就是P(c|x),举个现实的栗子?场景来对应P(c|x)的话就可以是这样的:

X 代表一个话,如“我喜欢这部手机”,而 C 表示的是这句话的情感,如“积极”,”消极”–> 那么P(c|x) 表示的就是 “我喜欢这部手机” 是“积极/消极” 的概率有多大。

而从计算上来说,我们需要同时知道P( c ),P(x|c)和P(x)才能算出目标值P(c|x)。“而P(x)对于是c无关的,而且作为共同的分母,在我们计算c的各种取值的可能性时并不会对各结果的相对大小产生影响,因此可以忽略”。(这段话是什么意思呢?用下边的例子说明)

比如c可取值c 1 , c 2 , c 3,并假设已知

p(c1)=o, p(c2)=p, p(c3)=q,P(x|c1)=a, P(x|c2)=b, P(x|c3)=c, p(x)=m

那么最后计算p(c|x)时,分别会得到结果

条件分布

由于p(c_1|x)+p(c_2|x)+p(c_3|x)的和一定为1,固我们可以得到o a + p b + q c = m oa+pb+qc=moa+pb+qc=m,而即使m的值预先不知道也没关系,因为oa,pb,qc的值都是可以计算出来的,m自然也就得到了。所以略掉了P(x)后,最后难点也就落在了计算P(x|c)与P( c )上,而这两个概率分布是必须要通过我们手上有的数据集来进行估计的。

p(c)的获得其实也较为简单:假设我们有了一个数据集D,计算D中c的各个情况出现的频率即可。比如计算P(c1),直接用c1情况出现次数在所有情况中所占的比例值即可–>例如“喜欢”这个词在”积极”情感词的情况下出现了5词,而积极词总量是10000, 那么P(c1)=5/10000(这里用到了大数定律:当训练集包含充足的独立同分布样本时,P(c)可通过各类样本出现的频率来进行估计。)

但是,获得p(x|c)就略显困难,因为x往往包含多个相关因素(是一个多种因素构成的向量),即它可能有多个需要考虑的属性值:x=(x1,x2,x3,…,xn);任一xi都代表了所有相关因素中的其中一个。当x是一个向量时,我们若要计算P(x|c),实际上就是要计算P ( x 1 , x 2 , x 3 , . . . , x n ∣ c )这个理论上也是可以利用我们的数据集D来进行估计的,但是现实情况是,n的值往往非常大(属性非常多),而我们的数据集往往不能保证我们的样本包含了属性值的所有可能组合(假设每个属性都是二值属性,那么就有2n种属性组合)。那么很多p(x|c)我们估计得到的值就是0。然而这些样本很可能仅仅是我们的数据集中没包含到,即“未被观测到”,但不代表它们现实中“出现概率为0”。于是这就给我们计算出真实合理的目标p(c|x)值造成了障碍。

这个时候朴素贝叶斯的“朴素”就要来发挥作用了,我们为了能够获得合理的p(x|c)的值,采用了“很不科学”的属性条件独立性假设

“朴素”贝叶斯

由于朴素贝叶斯分类器在这种naive的假设下仍能在实际问题中取得比较好的效果,因此这个假设的不合理性在某些情况下也就可以不用特别计较了。

贝叶斯分类准则
贝叶斯例子讲解
先验概率
离散属性贝叶斯计算
贝叶斯例子结果

当然以上都是最简单的入门讲解,朴素贝叶斯也有很多的变种,有兴趣的同学可以去自行搜索相关的资料,笔者也会在后期文章中慢慢补充

  • Tree augmented Bayesian Classifier(TAN)
  • Bayesian Network augmented Bayesian Classifier(BAN)
  • Semi-Naive Bayesian Classifiers(SNBC)
  • Multidimensional Bayesian Network Classifiers(MBC)
  • Bayesian chain classifiers(BCC)
首页 » 概率统计