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

有了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股乘以单位净值。

cash现金余额:比如总仓100元,现金余额就是指还没花出去的本金,等于总本金减去市值。

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

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


持仓和收益率的可视化

# 绘出回测的总资产变化
plt.plot(df['total'])
plt.plot(df['order'].cumsum()*df['单位净值'],'--')

猜你喜欢

转载自blog.csdn.net/Sukey666666/article/details/129905970