有了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%的收益率。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点