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

                    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 false
   else :
       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
None
            close
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
None
            close
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| 第四期-阿里巴巴股票行情分析(一)

在看和转发

都是一种支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值