Pandas小小项目2-----根据10日均线策略买卖股票的股票回溯分析

数据:16-19年的股价,按照目标策略进行回溯,看是否赚钱

1、读取数据,简单观察和处理数据

部分数据源如下
在这里插入图片描述

#########################################################
#阿里巴巴股票分析。目标回溯按照10日均线买卖股票是否盈利
#########################################################
import numpy as np
import pandas as pd
#读取csv数据
alibaba=pd.read_csv('E:/cai-data/BABA_stock.csv',index_col='date')
#usecols代表加载哪些列
#alibaba=pd.read_csv('E:/cai-data/BABA_stock.csv',index_col='date',usecols=[0,1])
print(alibaba.head())
print(alibaba.info())
#数据索引降序排列,最近的日期排在前
alibaba.sort_index(inplace=True)
#print(alibaba.index)
#看到日期索引的格式,为对象,想要转换为datetime类型
#并且使用strip方法将引号去掉。需要先转为str
alibaba.index=pd.DatetimeIndex(alibaba.index.str.strip("'"))
alibaba.index
print(alibaba.head())

<class ‘pandas.core.frame.DataFrame’>
Index: 755 entries, ‘2019/04/15’ to ‘2016/04/15’
Data columns (total 5 columns):
close 755 non-null float64
volume 755 non-null float64
open 755 non-null float64
high 755 non-null float64
low 755 non-null float64
dtypes: float64(5)
memory usage: 35.4+ KB
None
以上alibaba.info()-------------------------------
close volume open high low
date
‘2016/04/15’ 78.97 11696030.0 79.45 79.750 78.46
‘2016/04/18’ 79.01 7761672.0 78.52 79.120 77.71
‘2016/04/19’ 79.46 14727460.0 79.20 80.480 78.47
‘2016/04/20’ 81.21 14900920.0 79.00 81.735 78.99
‘2016/04/21’ 80.78 8812676.0 81.08 81.780 80.20
以上alibaba.head()-------------------------------

2、找出根据策略得出的买点和卖点

#策略1:股价超出10日均线买入,跌破10日均线卖出
#通过rolling计算10日均线,即当天收盘价与前九天收盘价均值
sale10=alibaba.rolling(10).mean().dropna()
print(sale10.head())
print('-------------------------------')
#判断当天收盘价是否大于10日均线,大于为True,小于10日均线为FALSE
deal=alibaba['close']-sale10['close'] > 0
print(deal.head())

#自定义函数判断True和false转换的点即为买卖点
def get_deal_date(w,is_buy=True):
    #自定义函数默认值is_buy=Ture,结果为True代表买入点
    if is_buy == True:
        return True if w[0] == False and w[1]== True else False
    #is_buy=False代表卖出,结果为True代表卖出点
    else:
        return True if w[0] == True and w[1] == False else False
#通过rolling判断FALSE和TRUE 的拐点,有拐点代表操作
#自定义函数的时候,对接apply函数时,若除了其本身,还有其他参数,会有告警,此时需要在apply函数中加raw=False,可消除警告信息
#deal.point=deal.rolling(2).apply(get_deal_date,raw=False)
#为方便后续计算,将rolling第一个NAN值填充为0.并将结果转换为布尔值
#先计算买入点
buydealpoint=deal.rolling(2).apply(get_deal_date,raw=False).fillna(0).astype('bool')
print(buydealpoint.head())
print('-------------------------------')
#再计算卖出点
saledealpoint=deal.rolling(2).apply(get_deal_date, raw=False, args=[False]).fillna(0).astype('bool')
#按下面方法,会报错TypeError: apply() got an unexpected keyword argument 'is_buy',
#有没有小伙伴知道为什么报错?????????????????????
#saledealpoint=deal.rolling(2).apply(get_deal_date, raw=False, is_buy=[False]).fillna(0).astype('bool')
print(saledealpoint.head())

10日均线结果-------------------------------
close
date
‘2016/04/28’ 79.082
‘2016/04/29’ 78.879
‘2016/05/02’ 78.639
‘2016/05/03’ 78.284
‘2016/05/04’ 77.745
判断每天收盘价是否大于10日线结果-------------------------------
date
‘2016/04/15’ False
‘2016/04/18’ False
‘2016/04/19’ False
‘2016/04/20’ False
‘2016/04/21’ False
Name: close, dtype: bool
以下是买点-------------------------------
date
‘2016/04/15’ False
‘2016/04/18’ False
‘2016/04/19’ False
‘2016/04/20’ False
‘2016/04/21’ False
Name: close, dtype: bool
以下是卖点-------------------------------
date
‘2016/04/15’ False
‘2016/04/18’ False
‘2016/04/19’ False
‘2016/04/20’ False
‘2016/04/21’ False
Name: close, dtype: bool

3、获取买卖点收盘价,计算回溯利润

#获取买点和卖点的收盘价
buyinfo=alibaba[buydealpoint.values]
print('buyinfo------------------------------------')
print(buyinfo.head())
print('saleinfo------------------------------------')
saleinfo=alibaba[saledealpoint.values]
print(saleinfo.head())
print('以下是删除日期索引的买数据head-------------')
#计算卖出-买入差值即盈利
#由于日期索引不同,直接计算默认会按照对应日期的数据计算,故删除日期索引列
no_index_date_buyinfo=buyinfo.reset_index(drop=True)
print(no_index_date_buyinfo.head())
no_index_date_saleinfo=saleinfo.reset_index(drop=True)
print('以下是删除日期索引的卖数据head-------------')
print(no_index_date_saleinfo.head())
#计算盈利
print('以下是盈利数据--------------')
profit=no_index_date_saleinfo - no_index_date_buyinfo
print(profit.head())
print(profit.describe())
print('本金1,最后的盈利--------------')
print(profit.sum())

buyinfo------------------------------------
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
saleinfo------------------------------------
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
以下是删除日期索引的买数据head-------------
close
0 78.83
1 79.29
2 79.00
3 80.97
4 77.77
以下是删除日期索引的卖数据head-------------
close
0 77.16
1 79.03
2 75.59
3 76.69
4 77.00
以下是盈利数据--------------
close
0 -1.67
1 -0.26
2 -3.41
3 -4.28
4 -0.77
close
count 63.000000
mean 0.572540
std 6.419356
min -9.190000
25% -3.380000
50% -1.120000
75% 3.435000
max 17.840000
本金1,最后的盈利--------------
close 36.07
dtype: float64

4、计算投入若10000本金,按照策略执行,最后还剩多少钱

print('以下计算本金10000,63次交易后还剩多少钱--------------')
money=10000
remain_money=money
for i in range (len(no_index_date_buyinfo)):
    #buy_count,买入时本金可买的股数
    buy_count=remain_money/no_index_date_buyinfo.iloc[i]
    #卖出时把上次买入的都卖掉的钱
    remain_money = buy_count * no_index_date_saleinfo.iloc[i]
#63次操作后剩的钱
print(remain_money)

以下计算本金10000,63次交易后还剩多少钱--------------
close 13799.294014
dtype: float64

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页