# 量化回测平台
**Repository Path**: qdphenix/quant-strategy
## Basic Information
- **Project Name**: 量化回测平台
- **Description**: 这是一个量化回测平台,能基于日数据编写策略并回测,能直接在python上运行。
作者疑似是聚宽上的 智习
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 12
- **Created**: 2023-08-22
- **Last Updated**: 2023-08-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 量化回测平台
## 介绍
能实现日数据的量化回测平台,此处提供了三个可用策略,用户也可根据自己需要编辑自己的策略。
## 目录
1. 安装教程
2. 使用说明
3. 软件架构
4. 各模块介绍
5. 策略说明
6. 参与贡献
## 安装教程
1. 下载各个模块和数据文件(数据文件可以根据自己需要导,本平台如果导入全部数据运行将会非常慢)
2. 将数据放在运行路径之下,写好回测模块里的初始参数和交易模块里的策略后,即可直接运行。
3. 文件夹里写好了三个策略,ETF轮动策略(这个策略运行速度快)、量价双金叉策略(10分钟)、基于随机森林的策略(10分钟)。用户如果要写自己的策略,请参照使用说明。(这里我们给了三个策略)
## 使用说明
用户只需要在以下两个地方写:
1. 选拟采用数据(我们系统里只放了沪深300股票2020年的数据,避免文件太大)
具体操作:下载拟采用的数据,在path变量更换文件名。
2. 写回测初始参数
具体操作:在主函数(main函数)处,写回测开始时间、结束时间、初始资金、手续费。
3. 写具体策略
具体操作:在strategy模块写出写具体将用的策略。
## 软件架构
程序分为各个功能模块类和回测模块(即主函数),执行主函数的时候不断调用功能模块里的函数或对象。
功能模块主要分为:
1. 获取数据函数类find
2. 账户类portfolio
3. 交易数据记录类history
4. 结果输出类output
5. 交易策略类strategy(我们的策略写在这个类里)
6. 收盘后更新和记录数据模块trade_after
7. 主函数模块main(回测模块)
## 各模块介绍
***
### 一、获取数据函数类find
该类中包括以下函数:
1. get_data_all(path)
功能说明:获取总数据
参数说明:path为文件路径
返回:得到一个字典,字典的keys是日期,values是一个dataframe,这个dataframe里index是股票代码,values是各个指标(收盘价、波动率等)
2. get_date_all(data_all,start_date,end_date)
功能说明:获取从某一天开始到另外一天内所有交易日数据
参数说明:stat_date表示回测开始时间,end_date表示回测结束时间,data_all表示全部导入数据
返回:得到一个list,包括所有区间交易日的日期
3. get_data(self,date,stock,s_index)
功能说明:数据获取函数(根据和日期和股票获得各类指标)
参数说明:date表示日期,stock表示股票代码,s_index表示希望获得的参数
返回:得到一个某股票某日某参数值
4. get_date(self,date_get,i)
功能说明:获取周围几个交易日的日期
参数说明:date表示日期,i表示前后天数,如get_date(‘2020-01-03’,-2)表示获取2020年1月3日前2天的日期
返回:得到一个日期
5. get_hist_data(self,start_date,date, stock)
功能说明:获取某一支股票在某个交易日之前的所有历史交易信息
参数说明:start_date为开始时间,date为结束时间,stock为股票
返回:一个Dataframe
***
### 二、账户类portfolio
该类中包括以下重要参数:
1. cash
参数说明:当前现金
2. total_value
参数说明:当前总市值
3. stock_hold
参数说明:当前持仓信息,一个dateframe,横坐标是股票代码,纵坐标是数量num和价格price
4. stock_value
参数说明:当前股票价值
该类中包括以下函数:
1. buy(self,stock,num,date)
功能说明:买股票函数
参数说明:stock为股票代码,num为买的数量
2. sell(self,stock,num,date)
功能说明:卖股票函数
参数说明:stock为股票代码,num为买的数量
3. sell_all(self,date)
功能说明:卖出所有持仓股票
***
### 三、交易数据记录类history
该类中包括以下重要参数:
1. hold_histroy
参数说明:持仓历史。 此处为一个dataframe,记录每日持仓情况。包括日期、现金、持仓股票、总资产价值。
效果示例:2017-01-03 729.61450 [510500.OF] 9.995006e+05
2. order_history
参数说明:交易信息。这是一个list,每次交易后append一下。
效果示例:order_history.append(['2021-09-23', '510500.OF', 197400.0, 8.429, '买'])
3. return_history
参数说明:收益率信息。这是一个datafrane,index是日期,values是收益率,这样写方便最后画图。
效果示例:2021-11-05 0.7123
***
### 四、输出类output
该类包括以下几个函数:
1. get_plot()
功能说明:将一个策略回测收益率画图,并计算这个策略的夏普比率、最大收益率、最小收益率。
2. get_order_history()
功能说明:将一个策略回测所有交易历史输出成excel文件。
3. get_hold_histroy()
功能说明:将一个策略回测每日持仓历史信息输出成excel文件
***
### 五、交易策略类strategy(我们的策略写在这里)
主要包括以下几个函数:
1. get_strategy_golden_price_num(self,date)
功能说明:执行量价双金叉策略
2. get_strategy_ETFchange(self,date)
功能说明:执行ETF轮动策略
3. get_strategy_Randomforest(self,date)
功能说明:执行随机森林量化策略
***
### 六、 收盘后数据更新和记录模块trade_after
功能:
1. 更新每日持仓数据价格
2. 记录每日持仓
3. 记录收益率
***
### 七、主函数模块(回测模块)
模块重要参数(用户回测前给定,下面是参数举例,都可以修改)
1. start_date = '2017-01-03'
参数说明:说明回测开始时间
2. end_date = '2021-11-05'
参数说明:回测结束时间
3. commission = 0.0005
参数说明:手续费
4. cash = 1000000
参数说明:一百万初始资金
5. me = porfolio(cash)
参数说明:创建我的账户,里面记录了现金、股票持仓、资产总价值、股票市值、资产总市值
6. buy_list = data_all[start_date].index.tolist()
参数说明:获取将要买的股票池,此处默认为导入数据的股票池
7. my_history = history()
参数说明:创建我的历史信息,里面记录了历史持仓信息,历史订单信息,历史收益率信息
8. date_all = find.get_date_all(start_date, end_date)
参数说明:通过这个函数得到从开始到结束所有交易日的日期
9. path = "./Python_2020.xlsx"
参数说明:选取目标数据文件地址
回测执行逻辑:按照所选回测区间对日期进行循环,每日执行get_strategy()(策略函数)和after_trade()(收盘后数据更新函数)
***
## 策略说明
### 一、量价双金叉策略
#### 具体做法
1. 每2天轮动换仓,求出满足量价双金叉的股票池,先空仓卖出,然后满仓等市值权重买入上个操作日至今涨幅最小的三只金股。
2. 若金股池为空,则当天不操作;若金股池有1-3只股票,则等市值权重买入池中所有股票;若金股池有三只以上股票,则等市值
权重买入上个操作日至今涨幅最小的三只金股。
#### 参数说明
1. golden_buy_list: list,量价双金叉股票池(简称金股池)
2. goldenprice_buy_list: list,价双金叉股票池
3. goldennum_buy_list: list,量金叉股票池
4. averageprice_last5d: float,上个交易日的5日均价
5. averageprice_last10d:float,上个交易日的10日均价
6. averageprice_5d: float,本交易日的5日均价
7. averageprice_10d: float,本交易日的10日均价
8. averagenum_last5d: float,上个交易日的5日均量
9. averagenum_last10d:float,上个交易日的10日均量
10. averagenum_5d: float,本交易日的5日均量
11. param averagenum_10d: float,本交易日的10日均量
#### 回测结果
1. 日期:2020.1.16-2020.11.16
2. 股票池:沪深300全部股票
3. 回测结果:11个月实现78%收益率,具体效果见图和输出文件
### 二、ETF轮动策略(这个策略运行很快)
#### 具体做法
6个etf,每个周期排一次序,比如五天,然后买涨幅最大的那个。
#### 回测结果
1. 日期:2017.01.03-2021.11.5
2. 股票池:300ETF、500ETF、纳指ETF、创业板ETF、红利ETF、50ETF
3. 回测结果:将近4年实现71.23%收益率,具体效果见图和输出文件
### 三、随机森林量化策略
#### 策略思路:应用随机森林算法选出最有可能上涨的股票。
1. 每天进行一次随机森林计算,判断股票池内每只股票在当天上涨的概率,卖出所有存量股票并选取上涨概率最高的三支股票买入。
2. 如果最高的三个上涨概率都小于0.55,则当天不买入任何股票。
3. 训练集:2020年1月1日开始的,到交易日前两天为止的历史交易信息。
4. 预测集:交易日前一天的交易数据。通过前一天的数据预测;股票当天是否会上涨。
5. 训练集选用的特征:历史交易数据的每日开盘价、收盘价、市盈率、市净率、换手率、成交量等共15个特征。
6. 训练标签:相比前一天上涨为1,下跌为-1。
#### 策略结果
3个月收益率为0.65%,主要是因为我们指标选取随意,如果精选下因子应该结果会好很多。