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:,以后空了再来后续骗。

概率统计-贝叶斯分析(Bayesian analysis)

贝叶斯统计

概率是我们个人的一个主观概念, 表明我们对某个事物发生的相信程度。 如同 Pierre Lapalace 说的: Probability theory is nothing but common sense reduced to calculation.   这正是贝叶斯流派的核心,换句话说,它解决的是来自外部的信息与我们大脑内信念的交互关系。

概率这件事大家都觉得自己很熟悉, 叫你说概率的定义 , 你却不一定说的出,我们中学课本里说概率这个东西表述是一件事发生的频率, 或者说这叫做客观概率。

Bayesian analysis

贝叶斯分析

贝叶斯分析的思路对于由证据的积累来推测一个事物发生的概率具有重大作用, 它告诉我们当我们要预测一个事物, 我们需要的是首先根据已有的经验和知识推断一个先验概率, 然后在新证据不断积累的情况下调整这个概率。整个通过积累证据来得到一个事件发生概率的过程我们称为贝叶斯分析 。
图像法, 这里的 A 的面积即先验, 后验是阴影占蓝圈的百分比。

图上红圈和篮圈的面积, 很少我们在开始就知道, 这才是应用中的难点。

贝叶斯分析可以瞬间理解一些常用的理论, 如幸存者偏差 ,你发现一些没读过书的人很有钱,事实上是你发现就已经是幸存者了(对应上图中小红圈), 而死了的人(红圈外的大部分面积)你都没见到啊。还有阴谋论 , 阴谋论的特点是条件很多很复杂, 但是条件一旦成立,结论几乎成立,  你一旦考虑了先验,这些条件成立本身即很困难, 阴谋论不攻自克。

贝叶斯分析的框架也在教我们如何处理特例与一般常识的规律。如果你太注重特例(即完全不看先验概率) 很有可能会误把噪声看做信号, 而奋不顾身的跳下去。 而如果恪守先验概率, 就成为无视变化而墨守成规的人。其实只有贝叶斯流的人生存率会更高, 因为他们会重视特例, 但也不忘记书本的经验,根据贝叶斯公式小心调整信心,甚至会主动设计实验根据信号判断假设,这就是我们下一步要讲的。

贝叶斯决策

叶斯决策主要包含四个部分: 数据(D)、假设(W)、目标(O)、决策(S) 。

假设是我们要验证的事实, 目标是我们最终要取得优化的量, 决策时根据目标得到的最后行为。  与上一步贝叶斯分析增加的部分是目标和决策。假设在问题里如果是连续的往往以参数空间的形式表达。

然后我们可以按照如下步骤做:

第一, 理清因果链条,哪个是假设,哪个是证据

第二,给出所有可能假设,即假设空间

第三,给出先验概率

第四,根据贝叶斯概率公式求解后验概率,得到假设空间的后验概率分布

第五,利用后验概率求解条件期望,得到条件期望最大值对应的行为.

贝叶斯决策如果一旦变成自动化的计算机算法,它就是机器学习。

概率统计-频率学派和贝叶斯学派区别

现代机器学习的终极问题都会转化为解目标函数的优化问题;在这个深度学习盛行的年代,不少同学却都只注重调参数,虽然说从现实出发,调优参数能解决项目上的实际需求问题,但是对于从业者自身的发展来说,只是停留在术业的表面层次,必须对机器学习的一些基础底层知识有进一步了解,才可以降自身的专业性再推进一步。

1、主要流派

有道是“罗马不是一天建成的”,机器学习的发展也是历经了很长时间,在这过程中形成了多个流派,而其中主要有五大流派:

  • 符号主义(Symbolists):起源于逻辑学、哲学; 核心思想是认知即计算,通过对符号的演绎和逆演绎进行结果预测;代表算法是逆演绎算法(Inverse deduction),主要应用是知识图谱
  • 频率学派/贝叶斯派(Bayesians):起源于统计学;核心思想是主观概率估计,发生概率修正,最优决策;代表算法是概率推理(Probabilistic inference);主要应用有反垃圾邮件、概率预测
  • 联结主义(Connectionist): 起源于神经科学;核心思想是对大脑进行仿真;代表算法有反向传播算法(Backpropagation)、深度学习(Deep learning); 主要应用有机器视觉、语音识别
  • 进化主义(Evolutionaries): 起源于进化生物学;核心思想是对进化进行模拟,使用遗传算法和遗传编程; 代表算是基因编程(Genetic programming);主要应用是机器人
  • 行为类比主义(Analogizer): 起源于心理学;核心思想是新旧知识间的相似性;代表算法有核机器(Kernel machines)、近邻算法(Nearest Neightor);主要应用有推荐算法

今天我们对频率学派/贝叶斯派做一些简单的说明,其实频率学派(MLE)和贝叶斯学派(MAP)自身是一直有很大的争议的。

  • 频率学派 – Frequentist – Maximum Likelihood Estimation (MLE,最大似然估计)
  • 贝叶斯学派 – Bayesian – Maximum A Posteriori (MAP,最大后验估计)
机器学习

2、二者区别

知乎上看到一个举例描述:你看打麻将的时候:只看下面有什么牌来决策的就是频率学派;除了看下面有什么牌,还考虑了这个牌是谁打出的,什么时候打出的,这个人打出所有牌友什么联系等一系列问题的就是贝叶斯学派。
另外一个例子:如果你抛硬币抛出10次正面,频率学派依据似然函数认为抛出正面的概率为1,贝叶斯派则会考虑先验信息,现实中这种情况出现的概率太低了。因此可以中和频率学派的极端假设。

往大里说,世界观就不同,频率派认为参数是客观存在,不会改变,虽然未知,但却是固定值;贝叶斯派则认为参数是随机值,因为没有观察到,那么和是一个随机数也没有什么区别,因此参数也可以有分布,个人认为这个和量子力学某些观点不谋而合。


往小处说,频率派最常关心的是似然函数,而贝叶斯派最常关心的是后验分布。我们会发现,后验分布其实就是似然函数乘以先验分布再normalize一下使其积分到1。因此两者的很多方法都是相通的。贝叶斯派因为所有的参数都是随机变量,都有分布,因此可以使用一些基于采样的方法(如MCMC)使得我们更容易构建复杂模型。频率派的优点则是没有假设一个先验分布,因此更加客观,也更加无偏,在一些保守的领域(比如制药业、法律)比贝叶斯方法更受到信任。

MLE介绍
MAP介绍
NLL介绍

参考地址: https://blog.csdn.net/rogerchen1983/article/details/79681463

参考地址: https://www.douban.com/group/topic/16719644/

参考地址:https://www.sohu.com/a/215176689_610300