处理数据实现双均线模型
模型使用 10、20 两个周期。
python
链接:https://pan.baidu.com/s/16LhFbQ2gPqO9O5hMsuVsKQ?pwd=1111
提取码:1111
另外,整个教程的完整版视频教程请阅读前言部分内容说明。
下面是详细的代码及针对代码的每一部分详细介绍。
代码部分:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
file_name='data.xls'
dataframe = pd.read_excel(file_name, header=0)
close_data=dataframe['close']
close_list=list(close_data)
#计算双均线
arg1=10
arg2=20
data_list=[]
ma1_list=[]
ma2_list=[]
open_price=None
profit_list=[0]
#将数据模拟成逐个回放
for close in close_list:
data_list.append(close)
if len(data_list)>=arg2:
#用numpy来计算均值,mean()
av1=np.mean(data_list[-arg1:])
av2 = np.mean(data_list[-arg2:])
ma1_list.append(av1)
ma2_list.append(av2)
#计算收益
if open_price==None:
profit_list.append(profit_list[-1])
else:
profit=profit_list[-1]+close-data_list[-2]
profit_list.append(profit)
if len(ma1_list) > 1 and len(ma2_list) > 1:
#当金叉,开仓
if ma1_list[-1]>ma2_list[-1] and ma1_list[-2]<ma2_list[-2]:
open_price=close
#当死叉,平仓
if ma1_list[-1] < ma2_list[-1] and ma1_list[-2] > ma2_list[-2]:
open_price=None
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(close_list)
ax1.plot(ma1_list)
ax1.plot(ma2_list)
ax2.plot(profit_list,color='red')
plt.show()
代码解析:
- 导入所需的库:pandas用于数据读取和处理,matplotlib用于绘图,numpy用于计算均值。
- 定义文件名和读取数据:将数据文件名赋值给变量file_name,使用pandas的read_excel函数读取Excel文件并将数据存储在dataframe中。
- 提取收盘价数据:从dataframe中提取'close'列的数据,并将其转换为列表形式存储在close_list中。
- 定义双均线参数:将均线的参数arg1和arg2分别设为10和20。
- 初始化变量和列表:创建空的data_list列表用于存储模拟回放的数据,创建空的ma1_list和ma2_list列表用于存储均线数据,创建open_price变量用于记录开仓价格,创建profit_list列表用于记录收益。
- 模拟回放数据:遍历close_list中的每个收盘价数据,将其添加到data_list中。
- 计算均线:当data_list中的数据数量达到arg2时,使用numpy的mean函数计算最近arg1和arg2个数据的均值,分别存储在av1和av2中。
- 更新均线列表:将计算得到的均值av1和av2分别添加到ma1_list和ma2_list中。
- 计算收益:如果open_price为None,表示当前没有持仓,则将收益列表中的最后一个值添加到profit_list中;否则,计算当前收益并添加到profit_list中。
- 判断金叉和死叉:如果ma1_list和ma2_list的长度都大于1,则判断是否出现金叉和死叉。当ma1_list最新的值大于ma2_list最新的值且ma1_list上一个值小于ma2_list上一个值时,表示出现金叉,将当前收盘价作为开仓价格;当ma1_list最新的值小于ma2_list最新的值且ma1_list上一个值大于ma2_list上一个值时,表示出现死叉,将开仓价格设为None表示平仓。
- 绘制图表:使用matplotlib的subplots函数创建图表,将收盘价数据、均线数据和收益数据分别绘制在不同的坐标轴上,并显示图表。