金融学习之二——稀里糊涂的回测

看到赵志强、刘志伟编的《Python量化投资技术、模型与策略》的策略回测这一章,打算自己动手弄弄,反正也没看懂,先照着敲敲代码再说。不得不吐槽一下,作者在前后逻辑上考虑的不是很周到,一些变量和语句前面不写,后面又冒出来了,让人猜了好久才猜明白。
先简单说明一下所使用的双均线突破策略:
(1)计算两根移动均线ma1,ma2,周期分别为len1,len2,其中len2>len2。说白了就是一个短期均线和一个长期均线。
(2)若ma1上穿ma2时,即ma1>ma2时,平掉空头仓位,买入做多
若ma1下穿ma2时,即ma1<ma2时,平掉多头仓位,卖出做空
首先利用Tushare获取一支股票的数据:

import tushare as ts
ts.set_token('****************************************')
pro=ts.pro_api()
df=pro.daily(ts_code='600327.SH')
df

随便搞了一支股票,弄到了从2002年到2021年的4464条行情数据
然后利用ta_lib(这个玩意的安装比较无耻,需要手动安装,不能直接在线安装,有需要请自行百度),计算移动平均线,周期分别设为3天和7天

import talib as ta
l1=3
l2=7
df['ma1']=ta.SMA(df.close.values,timeperiod=l1)
df['ma2']=ta.SMA(df.close.values,timeperiod=l2)
df

在这里插入图片描述
然后判断趋势,用1代表多头,-1代表空头。作者冷不丁搞个变量con_long出来,看都看不懂,所以只好自己先写了个函数:

def set_b(x):
    if x['ma1']>x['ma2']:
        return 1
    else:
        return 0
df.loc[:,'big']=df.apply(set_b,axis=1)
df['trend']=0
df.loc[df.big==0,'trend']=1
df.loc[df.big==1,'trend']=-1
df

在这里插入图片描述
接下来就是令人头晕目眩的仓位计算和成交后的收益计算:

#假设出现信号,第二天开盘交易,每次开仓1手
df['pos']=100*df['trend'].shift(1)
#计算新旧仓位
df['new']=df['pos']-df['pos'].shift(1)
df['old']=df['pos']-df['new']
#将开盘价作为交易价格
df['entry']=df['open']
#分别计算两种仓位的盈亏值
df['p_new']=(df['close']-df['entry'])*df['new']
df['p_old']=(df['close']-df['close'].shift(1))*df['old']
#总盈亏由上面两部分构成
df['p']=df['p_new']+df['p_old']
#计算累计盈亏
df['cc']=df['p'].cumsum()
#假设初始资金是1000,计算并绘制净值曲线
ini_cap=1000
df['cap']=df['cc']+ini_cap
df['net_cap']=df['cap']/ini_cap
df=df.set_index('trade_date')
df.plot(figsize=(10,6),y=['net_cap'])

搞笑的是我的图因为没有重新排列数据,居然是倒着来的
然后呢,人就懵了,这是啥?看来还得多学习啊!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值