Advertisement

量化交易策略的设计与回测

阅读量:

基于akshare的数据集, 我们可以通过历史数据设计一个简单的策略 并对其进行回测。

最简单的策略:下跌时买入,上涨时卖出。

安装

复制代码
 !pip3 install akshare --upgrade # 这是akshare的

    
 import pandas as pd
    
 import akshare as ak

导入数据

复制代码
 data = ak.fund_etf_fund_info_em('510210','20230101','20230331')

    
 data

运行结果:


筛选要用的数据

复制代码
 df = data[['净值日期','单位净值']]

    
 df

计算环比上一个交易日的涨跌

复制代码
 # 计算每日价格涨跌额

    
 df['diff'] = df['单位净值'].diff()
    
 df.head()

判断每日是否交易

复制代码
 # 如果上涨,则交易信号为1,代表卖出;否则交易信号为0,代表买入

    
 import numpy as np
    
 df['Signal'] = np.where(df['diff']>0,1,0)
    
 df

对以上数据进行可视化

复制代码
 import matplotlib.pyplot as plt

    
 df['单位净值'].plot()
    
 plt.scatter(df['单位净值'].loc[df.Signal==1].index,df['单位净值'][df.Signal==1],marker='v',c='g')
    
 plt.scatter(df['单位净值'].loc[df['Signal']==0].index,df['单位净值'][df['Signal']==0],marker='^',c='r')

根据买卖信号计算每天是买入还是卖出

复制代码
 # 计算每天买卖多少手

    
 df['order'] = df['Signal'].diff()*100 
    
 df = df.fillna(0.0) # 填补空值
    
 df.head(30)

最小交易单位是1手,1手等于100股


回测

复制代码
 # 回测

    
 initial_cash = 100 # 本金
    
 df['stock'] = df['order']*df['单位净值']
    
 df['cash'] = initial_cash- (df['order'].diff()*df['单位净值']).cumsum()
    
 df['total'] = df['stock'] + df['cash']
    
 df.head(30)

单位净值:指股票的市值,股票一般1手起卖,1手100个,单位净值就是1/100手的价格。

order股数:一手等于100股。

stock每次交易的市值:指买入1手要花多少钱,等于100股乘以单位净值。

例如总仓资金为100元时,现金余额即为尚未支取的资金,其计算公式等同于总本金减去当前市值

total总资产=stock市值+cash现金余额。

计算结果发现,这个简单的策略,在这个行情下,能获得2%的收益率 。


持仓和收益率的可视化

复制代码
 # 绘出回测的总资产变化

    
 plt.plot(df['total'])
    
 plt.plot(df['order'].cumsum()*df['单位净值'],'--')

全部评论 (0)

还没有任何评论哟~