Python实战——基于股票的金融数据量化分析
说明:本文只是通过自己的已学知识对股票数据进行了一个简单的量化分析,只考虑了收盘情况,真实的量化交易中仅仅考虑收盘情况是不够的,还有很多的复杂因素,而且仅仅三年数据是不足以来指导真实的股票交易的,因此本文只是作为一个简单的python练手项目。
一、分析目的
利用预先设定的策略,通过对股票交易的历史数据进行回测,验证该策略是否能指导股票交易。
二、数据处理
1、数据集描述
数据集来源:https://www.nasdaq.com/symbol/baba/historical
数据集简介:此数据集来源于Nasdaq网站,本文获取的是2016/04/15——2019/04/15三年的数据。
列名称理解:
原数据表的字段列名非常规范,无需进行重命名,以下是每个列名称的理解:
date:日期
close:收盘价格
volumn:成交量
open:开盘价格
high:日最高价格
low:日最低价格
本次只是简单针对收盘价格进行了分析。
2、 数据清洗
该数据集比较规范,没有重复值以及它异常值需要处理。
3、数据导入
# 加载库
import numpy as np
import pandas as pd
# 加载数据(本次只用到了日期和收盘价)
df = pd.read_csv('E:/相关文件夹/BABA_stock.csv',index_col = 'date',usecols = [0,1])
df.head()

三、数据分析
# 将索引转化为日期索引
df.index = pd.to_datetime(df.index)
# df.index = pd.DatetimeIndex(df.index.str.strip("'"))
df.index
# 按索引排序
df.sort_index(inplace = True )
df.head()

买卖策略:前一天低于60日平均线第二天高于60日平均线时买入,前一天高于60日平均线第二天低于60日平均线时卖出。
1、计算60日移动平均值
ma60 = df.rolling(60).mean().dropna()
ma60
2、找到值从False变为True时买入,True变为False时卖出
ma60_model = df['close'] - ma60['close'] >0
ma60_model
3、找出买点和卖点
# 自定义方法找出买点和卖点
def get_deal_date(w,is_buy = True):
if is_buy == True:
return True if w[0] == False and w[1] == True else False
else:
return True if w[0] == True and w[1] == False else False
# raw=False没有的话会有警告信息
# 如果删除Na值,会有缺失,所以这里用0填充,转换为bool值方便后面取值
se_buy = ma60_model.rolling(2).apply(get_deal_date,raw = False).fillna(0).astype('bool')
se_buy
# apply的args接受数组或者字典给自定义函数传参
se_sale = ma60_model.rolling(2).apply(get_deal_date,raw = False,args = [False]).fillna(0).astype('bool')
se_sale # 使用布尔索引找出买点和卖点
buy_info = df[se_buy.values]
sale_info = df[se_sale.values]
buy_info
sale_info
4、计算获利情况(每股交易获利情况)
# 转换为数值索引:需要将索引进行处理后再进行运算
no_index_buy_info = buy_info.reset_index(drop = True)
no_index_sale_info = sale_info.reset_index(drop = True)
print(no_index_buy_info.head())
print(no_index_sale_info.head())
# 获利情况
profit = no_index_sale_info - no_index_buy_info
# 最后一组数据中没有卖出点,可能会出现null值
profit.dropna() # 计算总体利润情况
profit.describe()
# 总共赚了多少钱
profit.sum()

图a 图b
close 57.66
dtype: float64
从图a可以看出每次的买入和卖出有盈有亏,从图b的整体情况来看,总共交易12次,亏损最多的时候是8.61美元,平均每次获利4.8,最多的一次赚了75.5美元;通过对
所有交易进行汇总分析,得出了获利总额为57.66美元,总体来说是盈利的。
5、1w美元的最终盈利情况
策略:将每次卖出的钱投入到下一次进行买入
all_money = 10000
remain = all_money
# 如果加上每次交易金额的万分之三手续费
fee = 0.0003
# 由于最后一次未出现卖点,所以交易次数需要用买入次数减一
for i in range(len(no_index_buy_info)-1):
buy_count = remain/no_index_buy_info.iloc[i]
remain = buy_count * no_index_sale_info.iloc[i]*(1-fee)
print(remain)
close 12413.412104
Name: 0, dtype: float64
close 22301.278558
dtype: float64
close 22412.294488
dtype: float64
close 22024.926199
dtype: float64
close 21439.23349
dtype: float64
close 20885.390796
dtype: float64
close 20576.028522
dtype: float64
close 19640.163023
dtype: float64
close 19232.001776
dtype: float64
close 18857.206606
dtype: float64
close 18595.722503
dtype: float64
close 18044.391215
dtype: float64
从以上结果可以看出:三年获得的利润为8044.39美元,年化大概26%左右,收益总体来说还是很不错的,该策略可以放到其他周期或者其他股票里进行分析,如果都可以获利,说明该策略在指导股票交易上是有效的。
Python实战——基于股票的金融数据量化分析的更多相关文章
- python金融与量化分析------Matplotlib(绘图和可视化)
-----------------------------------------------------------Matplotlib:绘图和可视化------------------------ ...
- ORACLE+PYTHON实战:复制A表数据到B表
最近在学习python ,看到了pythod的oracle,不仅可以一次fetch多条,也可以一次insert多条,想写一个复制A表数据到B表的程序来看看实际效率能不能提高.写完发现,非常惊艳!效率提 ...
- python金融与量化分析----Jupyter Notebook使用
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...
- python之金融与量化分析
一.金融 二.ipython 基础功能 ipython 快捷键
- 利用python进行泰坦尼克生存预测——数据探索分析
最近一直断断续续的做这个泰坦尼克生存预测模型的练习,这个kaggle的竞赛题,网上有很多人都分享过,而且都很成熟,也有些写的非常详细,我主要是在牛人们的基础上,按照数据挖掘流程梳理思路,然后通过练习每 ...
- Python 数据分析中金融数据的来源库和简单操作
目录 金融数据 pandas-datareader TuShare 金融学图表 案例 金融数据 数据分析离不开数据的获取,这里介绍几种常用的获取金融方面数据的方法. pandas-datareader ...
- 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据
财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...
- 向大家介绍我的新书:《基于股票大数据分析的Python入门实战》
我在公司里做了一段时间Python数据分析和机器学习的工作后,就尝试着写一本Python数据分析方面的书.正好去年有段时间股票题材比较火,就在清华出版社夏老师指导下构思了这本书.在这段特殊时期内,夏老 ...
- 基于股票大数据分析的Python入门实战(视频教学版)的精彩插图汇总
在我写的这本书,<基于股票大数据分析的Python入门实战(视频教学版)>里,用能吸引人的股票案例,带领大家入门Python的语法,数据分析和机器学习. 京东链接是这个:https://i ...
随机推荐
- Python工作好找吗?没有工作经验和学历怎么找?【就业必学】
大家都知道,随着人工智能时代的到来,Python的需求也变的越来越大了.从目前各大IT招聘网上显示招聘需求是非常大,而且薪资基本都在10k起,高的可达40-50k,当然这个要求很高,看下普遍的吧: 一 ...
- C#使用WebClient时,如果状态码不为200时,如何获取请求返回的内容
目录 一.事故现场 二.解决方法 一.事故现场 使用WebClient发送请求,如果返回的状态码不是2xx或3xx,那么默认情况下会抛出异常, 那如何才能获取到请求返回的内容呢? 二.解决方法 可以通 ...
- Java语法进阶10-泛型
泛型 泛型:参数化的类型,即把数据类型当做参数来传递 有的地方又称为泛化的类型,用一个单个大写字母,例如<T>来代表任意类型,这个T就是泛化的类型. 泛型的好处: (1)表示某个变量的类型 ...
- js简单动画:匀速动画、缓动动画、多物体动画以及透明度动画
主要实现以下几种简单的动画效果(其实原理基本相同): 1.匀速动画:物体的速度固定 2.缓动动画:物体速度逐渐变慢 3.多物体动画 4.透明度动画 效果实现: 1.匀速动画(以物体左右匀速运动为例) ...
- VMware kali虚拟机环境配置
编译内核 (1)执行命令uname -r以查看内核版本. (2)执行命令apt-cache search linux-headers查看是否安装内核头文件. (3) 如果uname -r出现的内容在 ...
- Vim 基本的使用
三种模式 按 ESC 进入命令模式 命令模式下输入 Shift + : 进入末行模式 命令模式下输入插入命令,如(i,a,o) 进入输入模式 进入 vim 文件名 vim直接编辑一个文件,如果是已经存 ...
- Jsonp的js实现,跨域请求,同源策略机制
Jsonp的js实现,跨域请求,同源策略机制1.跨域请求:请求URL的协议,域名,端口三者之间任意一个与当前页面地址不同即为跨域 存在跨域的情况: 网络协议不同,端口不通,域名不同,子域名不同,域名和 ...
- 两种最常用的 HTTP 操作方法是:GET 和 POST。
什么是 HTTP? 超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的请求-应答协议. web 浏览器可能是客户端,而计算机上的网络应用程 ...
- 精通awk系列(10):awk筛选行和处理字段的示例
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk数据筛选示例 筛选行 # 1.根据行号筛选 awk 'NR==2' a.txt # 筛选出第二行 awk 'NR>=2' a ...
- winform实现自定义折叠面板控件
代码文件:https://github.com/Caijt/CollapsePanel 最近在学习做winform,想实现一个系统导航菜单,系统菜单以模块进行分组,菜单是树型结构. 效果类似旧版QQ的 ...