Python量化交易03——海龟策略

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


海龟策略也是经典中的经典。其核心要点是:在股价超过过去的N天交易日的最高点时是买入信号,跌破过去的N天交易日的最低点时是卖出信号。最高点和最低点的通道被称为唐奇安通道。

这也是很多交易者会使用的策略,本文简化计算,下面进行Python实现和验证回测。


获取数据和生成交易信号

#导入必要的库
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()

海龟策略的交易信号

#创建一个名为turtle的数据表,使用原始数据表的日期序号
turtle = pd.DataFrame(index = zgpa.index)
#设置唐奇安通道的上沿为前5天股价的最高点
turtle['high'] = zgpa['close'].shift(1).rolling(5).max()
#设置唐奇安通道的下沿为过去5天的最低点
turtle['low'] = zgpa['close'].shift(1).rolling(5).min()
#当股价突破上沿时,发出买入信号
turtle['buy'] = zgpa['close'] > turtle['high']
#当股价突破下沿时,发出卖出信号
turtle['sell'] = zgpa['close'] < turtle['low']
#检查信号创建情况
turtle.tail()

生成两个布尔序列,不能直接代表买入和卖出,因为要卖出首选i得买入。还要进行一下条件判断构建交易信号。

#初始的订单状态为0
turtle['orders']=0
#初始的仓位为0
position = 0
#设置循环,遍历turtle数据表
for k in range(len(turtle)):
    #当买入信号为True且仓位为0时下单买入1手
    if turtle.buy[k] and position ==0:
        #修改对应的orders值为1
        turtle.orders.values[k] = 1
        #仓位也增加1手
        position = 1
    #而当卖出信号为True且有持仓时买出1手
    elif turtle.sell[k] and position > 0:
        #orders的值修改为-1
        turtle.orders.values[k] = -1
        #仓位相应清零
        position = 0   
#检查是否成功
turtle.tail(15)

 

 画图查看买入和卖出的点

#创建10*5的画布
plt.figure(figsize=(10,5))
#绘制股价的折线图
plt.plot(zgpa['close'],lw=2)
#绘制唐奇安通道上沿
plt.plot(turtle['high'],lw=2, ls='--',c='r')
#绘制唐奇安通道下沿
plt.plot(turtle['low'],lw=2,ls='--',c='g')
#标出买入订单,用正三角标记
plt.scatter(turtle.loc[turtle.orders==1].index,
           zgpa['close'][turtle.orders==1],
           marker='^',s=80,color='r',label='Buy')
#标出卖出订单,用倒三角标记
plt.scatter(turtle.loc[turtle.orders==-1].index,
           zgpa['close'][turtle.orders==-1],
           marker='v',s=80,color='g',label='Sell')
#添加网格、图注并显示
plt.legend()
plt.xticks([0,12,24,36,48])
plt.grid()
plt.show()

20000的初始资金进行交易;计算每一天的市值和账户余额变化

#再次给小瓦2万块初始资金
initial_cash = 20000
#创建新的数据表,序号和turtle数据表一致
positions = pd.DataFrame(index=turtle.index).fillna(0.0)
#每次交易为1手,即100股,仓位即买单和卖单的累积加和
positions['stock'] = 100 * turtle['orders'].cumsum()
#创建投资组合数据表
portfolio = positions.multiply(zgpa['close'], axis=0)
#持仓市值为持仓股票数乘以股价
portfolio['holding_values'] = (positions.multiply(zgpa['close'], axis=0))
#计算出仓位的变化
#剩余的现金是初始资金减去仓位变化产生的现金流累计加和
portfolio['cash'] = initial_cash - (positions.diff().multiply(zgpa['close'], axis=0)).cumsum()
#总资产即为持仓股票市值加剩余现金
portfolio['total'] = portfolio['cash'] + portfolio['holding_values']
portfolio.tail(13)

 

 核心思想也是使用股票仓位的变化的值乘上相应的股价在累计求和就是现金流的变化。

画图查看账户变化

plt.figure(figsize=(10,5))
plt.plot(portfolio['total'])
plt.plot(portfolio['holding_values'],'--')
plt.grid()
plt.legend()
plt.xticks([0,12,24,36,48])
plt.show()

 比双均线策略要好一点。因为整体这段时间股价是在一直下跌的,所以亏得少一点就算得上很不错的策略了。

 

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阡之尘埃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值