有了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['单位净值'],'--')