Python量化交易02——双均线策略(移动平均线)

 参考书目:深入浅出Python量化交易实战


本次带来最经典的交易策略,双均线策略的构建和其回测方法。

双均线一般采用5天均值和10天均值,如果5日均线上穿突破了10日均线,说明股价在最近的涨势很猛,买入信号。若下穿了10日均线,说明最近的跌幅较大,应该卖出。


数据获取和策略构建

导入库

#导入必要的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

获取数据

#指定下载股票的日期范围
start_date = '2020-01-01'
end_date = '2020-03-20'
#使用ts获取数据
#将时间范围作为参数传入
zgpa = ts.get_k_data('601318',
                    start_date, end_date)
zgpa = zgpa.set_index('date')
#检查是否下载成功
zgpa.head()

#新建一个数据表,命名为strategy(策略),计算交易的信号和下单数量


#序号保持和原始数据一致
strategy = pd.DataFrame(index = zgpa.index)
#添加一个signal字段,用来存储交易信号
strategy['signal'] = 0
#将5日均价保存到avg_5这个字段
strategy['avg_5'] = zgpa['close'].rolling(5).mean()
#同样,将10日均价保存到avg_10
strategy['avg_10'] = zgpa['close'].rolling(10).mean()
#当5日均价大于10日均价时,标记为1
#反之标记为0
strategy['signal'] = np.where(strategy['avg_5']>strategy['avg_10'], 1,0)
#根据交易信号的变化下单,当交易信号从0变成1时买入
#交易信号从1变成0时卖出
#交易信号不变时不下单
strategy['order'] = strategy['signal'].diff()
#查看数据表后10行
strategy.tail(10)

 singal表示买入信号,order表示相应的买入和卖出的操作点。-1表示卖出,1表示买入。

画图查看

#创建尺寸为10*5的画布
plt.figure(figsize=(10,5))
#使用实线绘制股价
plt.plot(zgpa['close'],lw=2,label='price')
#使用虚线绘制5日均线
plt.plot(strategy['avg_5'],lw=2,ls='--',label='avg5')
#使用-.风格绘制10日均线
plt.plot(strategy['avg_10'],lw=2,ls='-.',label='avg10')
#将买入信号用正三角进行标示
plt.scatter(strategy.loc[strategy.order==1].index,
           zgpa['close'][strategy.order==1],
           marker = '^', s=80,color='r',label='Buy')
#将卖出信号用倒三角进行标示
plt.scatter(strategy.loc[strategy.order==-1].index,
           zgpa['close'][strategy.order==-1],
           marker = 'v', s=80,color='g',label='Sell')
#添加图注
plt.legend()
plt.xticks([0,12,24,36,48])
#添加网格以便于观察
plt.grid()
#显示图像
plt.show()

 20000的初始资金


initial_cash = 20000
#新建一个数据表positions,序号保持和strategy数据表一致
#用0将空值进行替换
positions = pd.DataFrame(index = strategy.index).fillna(0)
#因为A股买卖都是最低100股
#因此设置stock字段为交易信号的100倍
positions['stock'] = strategy['signal'] * 100
#创建投资组合数据表,用持仓的股票数量乘股价得出持仓的股票市值
portfolio = pd.DataFrame(index = strategy.index)
portfolio['stock value'] = positions.multiply(zgpa['close'], axis=0)
#同样仓位的变化就是下单的数量
#用初始资金减去下单金额的总和就是剩余的资金
portfolio['cash'] = initial_cash - positions['stock'].diff().multiply(zgpa['close'],
                                                 axis=0).cumsum()
#剩余的资金+持仓股票市值即为总资产
portfolio['total'] = portfolio['cash'] + portfolio['stock value']
#检查一下后10行
portfolio.tail(10)

这里计算了每一天的市值和现金,总得账户余额。

核心思想也是用仓位的变化就是下单的数量,乘以对应的收盘价然后累计求和就是现金流变化。

画图查看账户变化:

#创建10*5的画布
plt.figure(figsize=(10,5))
#绘制总资产曲线
plt.plot(portfolio['total'], lw=2, label='total')
#绘制持仓股票市值曲线
plt.plot(portfolio['stock value'],lw=2,ls='--', label='stock value')
#添加图注
plt.legend()
#添加网格
plt.grid()
plt.xticks([0,12,24,36,48])
#展示图像
plt.show()

 

 可以看到还是略微亏损,但是整体而言还是很不错了。少亏就是赚

 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是一个简单的均线策略的实现: 1. 策略思路: 均线策略是一种常见的趋势跟踪策略,它的核心思想是通过计算不同时间段的移动平均线来判断市场的趋势,并根据移动平均线之间的交叉信号进行买入或卖出操作。 2. 策略参数: 选择两条不同的移动平均线,一条是较短期的,一条是较长期的。例如,可以选择5日移动平均线和20日移动平均线。 3. 交易信号: 当短期移动平均线上穿长期移动平均线时,产生买入信号;当短期移动平均线下穿长期移动平均线时,产生卖出信号。 4. 代码实现: ```python import pandas as pd import yfinance as yf import matplotlib.pyplot as plt # 下载数据 data = yf.download('AAPL', start='2010-01-01', end='2021-01-01') # 计算5日移动平均线和20日移动平均线 data['MA5'] = data['Close'].rolling(window=5).mean() data['MA20'] = data['Close'].rolling(window=20).mean() # 计算交易信号 data['Signal'] = 0 data['Signal'][5:] = np.where(data['MA5'][5:] > data['MA20'][5:], 1, 0) data['Signal'][5:] = np.where(data['MA5'][5:] < data['MA20'][5:], -1, data['Signal'][5:]) # 计算每日收益率 data['Return'] = np.log(data['Close']/data['Close'].shift(1)) # 计算策略收益率 data['Strategy'] = data['Signal'].shift(1) * data['Return'] # 计算累计收益率 data['Cumulative_Return'] = np.cumsum(data['Strategy']) # 绘制图形 plt.plot(data['Cumulative_Return']) plt.xlabel('Date') plt.ylabel('Cumulative Return') plt.title('Dual Moving Average Strategy') plt.show() ``` 这里以苹果公司的股票价格为例,下载了2010年至2021年的日线数据,计算出了5日移动平均线和20日移动平均线,并根据交叉信号计算出了交易信号。最后计算出了策略的收益率,并绘制了累计收益率曲线。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值