使用Pandas库 进行简单的股票买卖策略评估
主要目标:以股价超出十日均线买入,跌破十日均线卖出为策略,计算股票买卖点、股票收益率(固定股数/固定资金)。
用到的重要函数:rolling函数
使用工具:jupyter notebook,新建一个python3项目
原始数据:
(数据来源:使用python爬虫获取纳斯达克(NASDAQ)网站亚马逊股票历史数据,url: https://www.nasdaq.com/market-activity/stocks/amzn/historical)
- 数据清洗
数据导入和格式转换
import numpy as np
import pandas as pd
#数据导入
df = pd.read_csv('AMZN_STOCK.csv',index_col='DATE',usecols=[0,1])
#原时间字符串格式为月/日/年,转换为年/月/日
df.index = [str(x.split('/')[2])+'/'+str(x.split('/')[0])+'/'+str(x.split('/')[1]) for x in df.index]
#将时间字符串转为时间格式
stock_info.index = pd.DatetimeIndex(stock_info.index)
#按时间序列排序
stock_info.sort_index(inplace=True)
- 数据规整
计算十日均线
#计算十日均线
#使用滑动窗口rolling,指定数量分组,计算移动平均
man10 = stock_info.rolling(10).mean().dropna()
#以收盘价大于十日均价为模型
ma10_model = stock_info['CLOSE'] - ma10['CLOSE'] > 0
#自定义聚合函数,查看股票买卖点,股价超出十日均线买入,跌破十日均线卖出
def get_deal_date(w, is_buy = True):
if is_buy :
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
se_buy = ma10_model.rolling(2).apply(get_deal_date,raw = False).fillna(0).astype('bool')
#se_buy中 True是买点
buy_info = stock_info[se_buy.values]
se_sale = ma10_model.rolling(2).apply(get_deal_date,raw=False,args=[False]).fillna(0).astype('bool')
#se_sale中 True是卖点
sale_info = stock_info[se_sale.values]
根据策略计算
1、购买固定股数每股收益率;
#查看数据,看看是否所有买点都在卖点前面,如果不是,可以适当删掉或者调整数据,使他们对应
#此时得到的数据买卖点索引日期不一样,要想计算差值,需要删掉索引,重新定义
info_buy = buy_info.reset_index(drop = True)
info_sale = sale_info.reset_index(drop = True)
#用卖点减去对应买点计算每股收益
profit = info_sale - info_buy
final_profit = profit.sum()
#查看需要投入多少钱
capital = stock_info.max()
#计算每次买一股的每股收益率
return_profit = final_profit/capital
2、投入固定资金的股票年化收益
#计算投入一定资金的收益率,这里假设投入一万美元
all_capital = 10000
remain = 10000
for i in range(len(info_buy)):
buy_count = remain / info_buy.iloc[i]
remain = sale_info.iloc[i] * buy_count
print(remain)
#最后可以看出拿一定的钱取交易比买一定的交易收益要更高