01    前言                   

近日,A股,沪指出现短期上涨的趋势,经济有回暖的迹象,市场看好中国经济,成为股票投资的热门话题。

怎样的投资策略是可以增加收益的呢?

阿里巴巴股票行情案例分析(二)是以10日线为参考数据计算买卖点并简单模拟投资行为的投资策略,通过分析评估过去三年阿里股票的收益。

知识卡片

数据分析中的数组结构

Python-List:是Python中最基本的数据结构,序列中的每个元素都分配一个数字 - 它的位置或索引, [ ]内的逗号分隔值出现,可以是不同类型的数据,可创建多维数组。

Numpy-Ndarry:是NumPy中的多维数组,它是一系列同类型数据的集合,元素在数组[ ]中显示时元素间没有逗号,基于C语言开发,处理数据速度快。

Pandas-Series:一维序列,可自定义标签或索引,通过标签访问数据,有两个基本属性index 和 values。

Pandas-DataFrame:二维表结构,以表格形式存储,分成行和列,通过DataFrame可以很方便操作行和列的数据。DataFrame()函数的三个基本参数为data、index和columns分别为数据、行索引和列索引。

    数据源:阿里股票行情分析(一)的数据相同,公众号回复 DT16 获取

        

            02 投资策略                     

股价超出10日均线买入,跌破十日均线卖出,卖出前不会进行下一次买入。

简单起见,只采用收盘价进行分析。

# 加载数据,把date这一列设置为索引,简单起见,只用收盘价进行分析
import numpy as np
import pandas as pd
df = pd.read_csv('./BABA_stock.csv', index_col='date', usecols=[0, 1])
# 先查看一下数据
df.head()
# date 列是字符串格式,需要转换成datetime格式作为索引更方便

# 将索引转换为datetime形式 ;
# stripe 把左右两边字符串去掉 也就是单引号
df.index = pd.DatetimeIndex(df.index.str.strip("'"))
df.index
DatetimeIndex(['2016-04-15', '2016-04-18', '2016-04-19', '2016-04-20','2016-04-21', '2016-04-22', '2016-04-25', '2016-04-26','2016-04-27', '2016-04-28',...'2019-04-02', '2019-04-03', '2019-04-04', '2019-04-05','2019-04-08', '2019-04-09', '2019-04-10', '2019-04-11','2019-04-12', '2019-04-15'],dtype='datetime64[ns]', name='date', length=755, freq=None)
# 数据中最近的日期排在前面,按照日期重新排序
df.sort_index(inplace=True)
print(df.head())
df.describe()
                     close
date
2016-04-15 78.97
2016-04-18 79.01
2016-04-19 79.46
2016-04-20 81.21
2016-04-21 80.78

# 计算10日均线数据
ma10 = df.rolling(10).mean().dropna() # 滚动取前十条数据 但是前9条数据没有均值,dropna去除
ma10

                     

03 找出买点和卖点

买点:根据十日均线的变化,买点出现在由跌幅到涨的过程中,因此也就是由false变true的情况下

方法:找到十日均线上的相邻两个数据点,第一个点是false,第二点是true,那么选取true所在的记录

卖点:涨势变跌势,低于当十日均线点时,即由true变false的时候,选取false所在的记录

# 买点:当股价上涨,超出10日均线点的时候
ma10_model = df['close'] - ma10['close'] > 0 # pandas会将日期索引相同的数据相减
ma10_model.head(30)
date
2016-04-15   False
2016-04-18   False
2016-04-19   False
2016-04-20   False
2016-04-21   False
2016-04-22   False
2016-04-25   False
2016-04-26   False
2016-04-27   False
2016-04-28   False
2016-04-29   False
2016-05-02   False
2016-05-03   False
2016-05-04   False
2016-05-05     True
2016-05-06     True
2016-05-09     True
2016-05-10     True
2016-05-11     True
2016-05-12     True
2016-05-13   False
2016-05-16     True
2016-05-17     True
2016-05-18   False
2016-05-19   False
2016-05-20   False
2016-05-23     True
2016-05-24     True
2016-05-25   False
2016-05-26   False
Name: close, dtype: bool
# 建立函数处理一个两行数据 w, 由true和false,可使用rolling函数,两行记录成一组
# 函数再添加一个参数,来判断是买点还是卖点
def get_deal_date(w, is_buy=True):if is_buy == True:return True if w[0] == False and w[1] == True else False
# return True if w[0] == False and w[1] == True else False 这一行是一个三目运算,if then else 简写等于
# if w[0] == False and w[1] == True:
#   return True
# else:
#   return falseelse :return True if w[0] == True and w[1] == False else False
# 对选取的相邻两行记录运行函数,找出买点
# raw=False 没有的话会有警告信息
# raw=False 时行列以pandas series格式来处理,raw = True 时行列以 numpy ndarry格式处理
# ma10_model.rolling(2).apply(get_deal_date, raw=False)
# 运行上面一条语句,有Na值,如果删除Na值,会有缺失,所以这里用0填充,将0,1转换为bool值方便后面取值
se_buy = ma10_model.rolling(2).apply(get_deal_date, raw=False).fillna(0).astype('bool')
se_buy
# 验证数据,2016-05-05是一个买点,从十日均线的数据进行验证,正确
date
2016-04-15   False
2016-04-18   False
2016-04-19   False
2016-04-20   False
2016-04-21   False
2016-04-22   False
2016-04-25   False
2016-04-26   False
2016-04-27   False
2016-04-28   False
2016-04-29   False
2016-05-02   False
2016-05-03   False
2016-05-04   False
2016-05-05     True
2016-05-06   False
2016-05-09   False
2016-05-10   False
2016-05-11   False
2016-05-12   False
2016-05-13   False
2016-05-16     True
2016-05-17   False
2016-05-18   False
2016-05-19   False
2016-05-20   False
2016-05-23     True
2016-05-24   False
2016-05-25   False
2016-05-26   False...
2019-03-05   False
2019-03-06   False
2019-03-07   False
2019-03-08   False
2019-03-11   False
2019-03-12   False
2019-03-13   False
2019-03-14   False
2019-03-15   False
2019-03-18     True
2019-03-19   False
2019-03-20   False
2019-03-21   False
2019-03-22   False
2019-03-25   False
2019-03-26   False
2019-03-27   False
2019-03-28   False
2019-03-29     True
2019-04-01   False
2019-04-02   False
2019-04-03   False
2019-04-04     True
2019-04-05   False
2019-04-08   False
2019-04-09   False
2019-04-10   False
2019-04-11   False
2019-04-12   False
2019-04-15   False
Name: close, Length: 755, dtype: bool
# 找出卖点
# apply的args接受数组或者字典给自定义函数传参,即将is_buy=False传给apply函数
se_sell = ma10_model.rolling(2).apply(get_deal_date, raw=False, args=[False]).fillna(0).astype('bool')
se_sell
# 2016-05-13是一个卖点,从十日均线进行验证,正确
date
2016-04-15   False
2016-04-18   False
2016-04-19   False
2016-04-20   False
2016-04-21   False
2016-04-22   False
2016-04-25   False
2016-04-26   False
2016-04-27   False
2016-04-28   False
2016-04-29   False
2016-05-02   False
2016-05-03   False
2016-05-04   False
2016-05-05   False
2016-05-06   False
2016-05-09   False
2016-05-10   False
2016-05-11   False
2016-05-12   False
2016-05-13     True
2016-05-16   False
2016-05-17   False
2016-05-18     True
2016-05-19   False
2016-05-20   False
2016-05-23   False
2016-05-24   False
2016-05-25     True
2016-05-26   False...
2019-03-05   False
2019-03-06   False
2019-03-07     True
2019-03-08   False
2019-03-11   False
2019-03-12   False
2019-03-13   False
2019-03-14   False
2019-03-15   False
2019-03-18   False
2019-03-19   False
2019-03-20   False
2019-03-21   False
2019-03-22     True
2019-03-25   False
2019-03-26   False
2019-03-27   False
2019-03-28   False
2019-03-29   False
2019-04-01   False
2019-04-02   False
2019-04-03     True
2019-04-04   False
2019-04-05   False
2019-04-08   False
2019-04-09   False
2019-04-10   False
2019-04-11   False
2019-04-12   False
2019-04-15     True
Name: close, Length: 755, dtype: bool
# 具体的买卖点
buy_info = df[se_buy.values]
sell_info = df[se_sell.values]
print(buy_info.info(),'\n',buy_info.head(),'\n')
print(sell_info.info(),'\n',sell_info.head())
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 63 entries, 2016-05-05 to 2019-04-04
Data columns (total 1 columns):
close   63 non-null float64
dtypes: float64(1)
memory usage: 1008.0 bytes
Noneclose
date
2016-05-05 78.83
2016-05-16 79.29
2016-05-23 79.00
2016-05-27 80.97
2016-06-14 77.77<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 63 entries, 2016-05-13 to 2019-04-15
Data columns (total 1 columns):
close   63 non-null float64
dtypes: float64(1)
memory usage: 1008.0 bytes
Noneclose
date
2016-05-13 77.16
2016-05-18 79.03
2016-05-25 75.59
2016-06-01 76.69
2016-06-17 77.00
# 买和卖的索引值不一样,不过数据都有63条,只需要价格信息来算相同索引对应买卖的盈利,所以删除时间索引信息
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())
  close
0 78.83
1 79.29
2 79.00
3 80.97
4 77.77
  close
0 77.16
1 79.03
2 75.59
3 76.69
4 77.00

               04 盈利评估              

# 每次交易的盈利情况
profit = no_index_sale_info - no_index_buy_info
print(profit)
# 大体数据
profit.describe()
# 读图可知,总共交易63次,平均盈利0.57每股,亏得最多一次是9.2,赚的最多一次是17.8

     close
0   -1.67
1   -0.26
2   -3.41
3   -4.28
4   -0.77
5   -1.86
6   5.06
7   9.54
8   5.45
9   -0.45
10 -0.96
..   ...
56 -6.10
57 12.40
58 12.52
59   7.14
60 -5.57
61 -4.13
62   2.00[63 rows x 1 columns]
# 三年总利润,不算手续费
profit.sum()
# 如果按照每股100元买入,三年买卖63次,三年内每股的收益是36.07,平均下来每次买卖一股赚36.07/63等于0.57
close   36.07
dtype: float64
# 假如有1w美元,每次买卖最终盈利是多少呢?
all_money = 10000 # 本金
remain = all_money # 一次买卖之后剩多少钱
fee = 0.0003 # 手续费
# 每次交易买多少股票
for i in range(len(no_index_buy_info)):buy_count = remain / no_index_buy_info.iloc[i]  # 买的数量remain = buy_count * no_index_sale_info.iloc[i] * (1 - fee) print(remain)# 查看最后一条记录,剩下13540.89,平均每年收益有本金的10%多一点,
# 以10日线计算买卖点的投资策略收益还是不错的。
# 事实上过去阿里三年的股价已经翻了一倍,只要买进不卖出,即可享有收益,阿里的历史股票数据分析基本都是涨,投资者在购买时采用的策略会更为复杂
close   13583.272217
dtype: float64
close   14148.920283
dtype: float64
close   13711.381634
dtype: float64
close   13396.985853
dtype: float64
close   13540.898129
dtype: float64

                    05 写在最后                  

投资策略的评估以10日均线为参考,找出买卖点;为加强本次案例的学习,可以将10日均线改成,30日均线或者60日均线进行买卖,观察收益是否会不同,以何种日期长度均线作为参考,收益最高。

案例分析的股票购买策略评估是最基础的股票行情分析,事实上大型的投资机构,会雇佣有很多金融,数学背景的专业人员,使用复杂的模型计算形成投资策略。为避免分析内容产生误导,不提倡在学习股票行情分析的案例后,盲目地进行投资,股票购买有很大的风险,市场波动的影响因素多,变化快,以慎重为益~

需要加群的同学,添加小助手微信 A2XF669 后,回复数字 4 拉你进入学习群,晚上八点半到九点半一起讨论,交流学习!

Day01| 第四期-北京积分落户数据分析

Day02| 第四期-阿里巴巴股票行情分析(一)

在看和转发

都是一种支持

Day03| 第四期-阿里巴巴股票行情分析(二)相关推荐

  1. Day02| 第四期-阿里巴巴股票行情分析(一)

                        01    前言                    2020年高考的第一天到来了,不晓得你的心情如何,我想我们始终忘不了的是对追梦过程中的努力,希望长大以后 ...

  2. python数据分析实战之阿里巴巴股票行情分析

    文章目录 1.明确需求和目的 2.数据收集 3.数据预处理 3.1 加载相关库和数据集 3.2 数据概览 3.3 数据格式处理 3.4 缺失值处理 4.数据分析 4.1 股票K线图 4.2 涨跌情况分 ...

  3. 搭建系统|“财务数据选股工具”如何与“多维度股票行情分析工具”完成无缝切换...

    前言 前几期我们搭建了自定义的量化行情/选股/回测框架: 搭建系统|升级基于财务数据的选股工具!添加上日历和排序功能会更好用 搭建系统|不用数据库选股也行!利用Pandas特性的GUI版基本面选股工具 ...

  4. Python复盘股票_搭建系统|“财务数据选股工具”如何与“多维度股票行情分析工具”完成无缝切换...

    前言 前几期我们搭建了自定义的量化行情/选股/回测框架: 搭建系统|升级基于财务数据的选股工具!添加上日历和排序功能会更好用 搭建系统|不用数据库选股也行!利用Pandas特性的GUI版基本面选股工具 ...

  5. 大数据应用实践1:基于开源架构的股票行情分析与预测

    股票市场行情分析与预测一直是数据分析领域里面的重头戏,确切地说IT行业的每一次重大发展的幕后推动者以及新产品(特别是高端产品)的最先尝试者都包含金融行业,特别是证券交易市场,它符合大数据的四大特征:交 ...

  6. 同花顺python_专题研究|量化交易怎么少得了GUI!手把手教你用 Python 打造股票行情分析界面...

    开场 Python 的出现可以帮助我们快速解决实际的问题,提高工作效率. 如果给Python 脚本加上一个GUI 的话,不仅可以进一步提升使用效率(不用每次停止运行去修改参数),而且还能把自己程序分享 ...

  7. 【深度之眼吴恩达机器学习第四期】笔记(十二)

    目录 大规模学习 小批量梯度下降 在线学习 数据并行 应用举例 人工合成数据 上限分析 总结 大规模学习 现在机器学习的性能比过去的好,其中一个原因就是现在拥有大量的数据. 而且其中一种获得高性能机器 ...

  8. linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)

    fib_info结构 struct fib_info { struct hlist_node fib_hash; struct hlist_node fib_lhash; int fib_treere ...

  9. Day04| 第四期-谷歌应用商店的App分析

                        01    前言                    我们每天都在使用从手机应用商店里下载的App,有没有想过什么样的App是最受欢迎的呢?一个最直接的方法, ...

最新文章

  1. SQL語句大全4(常用函數)
  2. 计算机无法进入桌面怎么备份,无法进入系统如何正常备份数据?
  3. 推荐一个优化分页查询的办法(分页数很大的情况)
  4. webpack来打包你的vue项目,如发现你的vendor.js过大
  5. ❤️六W字《计算机基础知识》(八)(建议收藏)❤️
  6. 推荐系统学习(二)基于用户/物品的协同过滤算法(User-CF / Item-CF)
  7. 牛客网暑期ACM多校训练营(第五场): F. take(期望+线段树)
  8. Intellij IDEA 使用jrebel运行spring-boot并实现自动编译进行热部署
  9. 20171017在线编程题
  10. 【语音去噪】基于matlab GUI FIR窗函数音频去噪【含Matlab源码 875期】
  11. 百会与Zoho达成战略合作,向中国用户推出在线办公套件!
  12. 案例|工业物联网解决方案•污水处理厂智能监控运维云平台
  13. 两台电脑用一根网线组建局域网
  14. oracle中月初月末的表示
  15. 自然语言处理TF-IDF关键词提取算法
  16. 20175208 实验二 《Java面向对象程序设计》实验报告
  17. android 编程词典,基于Android的英文词典的实现方法
  18. anki 新的卡片类型_Anki选择题卡片制作详解
  19. warning.js?d96e:34 Warning: You cannot set a form field before rendering a field associated with the
  20. warning: go env -w GO111MODULE=…does not override conflicting OS environment variable

热门文章

  1. python3如何安装模块_如何用pip为Python3安装模块
  2. OpenGL ES基础教程,绘制三角形(补充,附代码)
  3. 汤姆大叔JavaCript系列10阅读笔记1
  4. 上海黄牛缘何溢价收购公交卡
  5. 里面有qq农场的WZ132
  6. 一键解析还原全景图krpano分析工具
  7. gearman mysql编译_利用gearman实现redis缓存mysql
  8. 【翻译】Extending PyTorch之Extending torch.autograd和Extending torch.nn
  9. Extending GitHub
  10. Python判断输入字符类型