用python量化分析股市:均线交易策略靠谱吗?(一)

时间:2022-04-26 00:24:20

均线交易策略封面

什么移动平均线?

移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。
移动平均线是由著名的美国投资专家Joseph E.Granville(葛兰碧,又译为格兰威尔)于20世纪中期提出来的。均线理论是当今应用最普遍的技术指标之一,它帮助交易者确认现有趋势、判断将出现的趋势、发现过度延生即将反转的趋势。
移动平均线 [1] 常用线有5天、10天、30天、60天、120天和240天的指标


计算方法


N日移动平均线=N日收盘价之和/N
比如:收盘价=pandas.DataFrame([12.35,11.45,13.56,13.42,13.56,13.41,13.14,13.11,13.25,13.27,13.01,12.68,12.1,12.26])
五日移动平均线=收盘价.rolling(5).mean() #rolling(5).mean()函数计算5日移动平均数值
五日移动平均值列表=[nan, nan, nan, nan, 12.868, 13.080000000000002, 13.418000000000001, 13.328, 13.294, 13.235999999999999, 13.156, 13.064000000000002, 12.862, 12.664000000000001]

常见的均线交易策略


均线交易策略是量化交易应用最常见的交易策略,一般有两种策略应用比较多:一种是收盘价向上突破均线买入股票,收盘价向下跌破均线卖出股票;另一种是短周期均线(比如3日均线)向上穿越长周期均线(比如20日均线)买入股票,短周期均线向下穿越长周期均线卖出股票。


均线交易策略一:收盘价突破或跌破均线(代码实战)

#导入相关模块
import jiaoyi #详见系列文章“用python量化分析股市:建立交易类”
import stock #详见系列文章“用python量化分析股市:建立数据接口模块”

import 画K线 #详见系列文章“用python量化分析股市:画K线图”

import pandas as pd

#计算均线参数,一般用ma表示均线数据列表
def 均线计算(收盘价,均线参数):
ma=收盘价.rolling(均线参数).mean()
return ma



#根据交易策略设计模拟交易函数
def 均线交易策略(股票代码,收盘价,ma,均线参数):
i,flag=均线参数,0 #i记录股票交易日起始(根据均线参数确定),flag标志持股状态
交易=jiaoyi.交易(股票代码, str(均线参数)+"日均线策略")
while( i< len(收盘价)-1):
if(收盘价[i]> ma[i] and flag==0):
交易.买入股票(收盘价.index[i],收盘价[i])
i=i+1
flag=1
else:
i=i+1
while(flag and i< len(收盘价)-1):
if(收盘价[i] < ma[i]):
交易.卖出股票(收盘价.index[i],收盘价[i])
i=i+1
flag=0
else:
i=i+1
return 交易

#导入股票日线数据,这里以股票代码002191,天数为500天,截止日期2021-03-12为例:

股票代码="002191"
天数=500
截止日期="20210312"
股票数据=stock.读取csv数据(股票代码, 天数, 截止日期)
均线参数=5
ma=均线计算(股票数据.收盘价,均线参数)
交易记录=均线交易策略(股票代码,股票数据.收盘价,ma,均线参数)
交易记录.显示交易()


均线交易策略运行效果

当选择5日均线(均线参数=5):
5日均线策略 交易次数:45 总收益率:-0.085 盈亏比率:0.24
当选择10日均线(均线参数=10)
10日均线策略 交易次数:29 总收益率:-0.169 盈亏比率:0.24
当选择20日均线:(均线参数=20)
20日均线策略 交易次数:17 总收益率:0.157 盈亏比率:0.41
当选择30日均线:(均线参数=30)
30日均线策略 交易次数:9 总收益率:0.213 盈亏比率:0.33


不难发现,20日和30日均线,总收益率和盈亏比都很好。那么,我们是不是可以直接计算出最佳均线呢?
代码调整一下:


for 均线参数 in range(5,60):
ma=均线计算(股票数据.收盘价,均线参数)
交易记录=均线交易策略(股票代码,股票数据.收盘价,ma,均线参数)
交易记录.计算收益()
print("均线参数%d : 总收益率:%.3f" %(均线参数,交易记录.总收益率))


计算最佳均线

可以看到,均线参数为26时,总收益率最大,为0.398。
当我们把数据时长改为“天数=1000”时,总收益率为0.931,还是26日参数为最佳

现在,我们把均线参数设置为26日,把买入点,卖出点在K线图上标注出来,

#画K线图
k线数据=画K线.读取数据(股票代码, 天数, 截止日期)

#K线图上标记买入价格,卖出价格点
buypd=pd.DataFrame(data={"Date":交易记录.买入时间,"买入价格":交易记录.买入价格})
buypd.Date=pd.to_datetime(buypd.Date)
buypd.set_index("Date",drop=True,append=False, inplace=True)
sellpd=pd.DataFrame(data={"Date":交易记录.卖出时间,"卖出价格":交易记录.卖出价格})
sellpd.Date=pd.to_datetime(sellpd.Date)
sellpd.set_index("Date",drop=True,append=False, inplace=True)

买入交易 = pd.merge(k线数据.Close,buypd,on=["Date"],how="outer")
卖出交易 = pd.merge(k线数据.Close,sellpd,on=["Date"],how="outer")

添加买卖点 = [画K线.mpf.make_addplot(买入交易.买入价格, scatter=True, markersize=50, marker="s", color="r"),
画K线.mpf.make_addplot(卖出交易.卖出价格, scatter=True, markersize=50, marker="v", color="b")
]


画K线.绘图参数 = dict(
type="candle",
mav=(均线参数),
addplot=添加买卖点,
volume=True,
datetime_format="%Y-%m-%d",
title="\n股票代码 %s K线图" % (股票代码),
ylabel="股票蜡烛价格",
ylabel_lower="成交量",
warn_too_much_data=2000, #设置最大显示数据记录条数
figratio=(15, 10),
figscale=10)

画K线.mpf.plot(k线数据,
**画K线.绘图参数,
style=画K线.s,
show_nontrading=False
)

画K线.mpf.show()


看看效果如下:

均线交易策略画K线图


K线图中用红色方块代表买入点,蓝色小三角代表卖出点。从图中清楚
看出,尽管有5次失误,但亏损有限,同时很好抓住了几波重要的行情。
也就是说,对于股票002191来说,使用均线参数26,当收盘价大于26日
均线买入,小于26日均线卖出,是一个不错的交易策略。当然,也可以调整不同截止日期和加长天数,在更大数据集上找到最佳参数,具体就不一一演示了。


附件:文件代码排版格式如下:

举报/反馈