# 五个摆烂人
**Repository Path**: wenyangsix/python-five-tanking-man
## Basic Information
- **Project Name**: 五个摆烂人
- **Description**: python金融的大作业
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-11-04
- **Last Updated**: 2021-12-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于PyQt5的量化回测系统
> 组员:杨文登,高铭,马敏,黄俊杰,赵建韬
## 运行
> pip install -r requirements.txt
>
> python main.py
## 使用
### 回测步骤
先点击界面左上角“文件”菜单,点击“添加股票”,在弹出的窗口中,选择“data/data.pkl"文件。
然后在界面右侧,点击“股票选择”tag,选择策略和回测需要使用的股票池。
在界面左侧,输入需要回测的日期范围,初始资金,手续费(输入框进行了非法或异常情况处理,比如限制了手续费的类型和最大值)
在界面右侧,点击“策略池”,选择使用的策略,输入相应参数,然后点击“采用该策略”按钮,下方进度条显示策略运行进度。
策略运行完成后,左下角的交易日志信息部分,会记录每个交易日的资产组合价值(当前总资金),每个调仓日卖出的股票信息。
## 项目结构
| 目录 | 说明 |
| ---- | ---- |
| src | 某些模块的源代码 |
| data | 一些数据文件 |
| ui | 产品ui代码 |
| log | 保存的日志文件
| images | 图片文件
## 类的划分
### 主窗体类
* 名称:MainWindow
* 所在文件: main.py
* 功能描述
* 加载主窗口,初始化ui组件
* 初始化与用户交互的信号参数, 初始化回测的基本参数
* 加载输入输出框参数的校验
示意图
### 信号类
* 名称: TaskSignals
* 所在文件: taskSignals.py
* 功能描述
* 子线程/一些任务执行中发出的信号,以便更新窗口内的UI
* `loadFile`:加载文件信号,然后显示在statusBar上
* `logSignal`:打印日志信号,让窗口主线程的窗口打印一些信息
* `progressBarSignal`:进度条更新信号,让主窗口内的进度条更新
* `updateBackTestingSignal`: 负责更新回测结果的信号
### 数据读写类
* 名称:StockDataHelper
* 所在文件: `src/dataHelper.py`
* 功能描述
* 主要是负责处理股票的数据,包括以下:
* 根据用户给定的path,从磁盘中读入.pkl类型的数据
* 负责找到某段时间内所有交易日的数据
* 找到离date往后最近一天的交易日数据
### 回测数据管理类
* BackTestingData
* 所在文件: `src/backTestingData.py`
* 功能描述
* 负责处理主窗口内一些回测的基本参数,以便给策略使用
* 比如`selected_stocks: 开市选了哪些股票,start_date: 回测开始日期`等
* 方法
* `update_data(key: str, val: any)`
* 外部掉用这个函数,就可以更新这个数据内部的值
### 日志读写类
* 名称:Log
* 所在文件: `src/log.py`
* 功能描述
* 根据主窗口内打印的日志数据,保存到本地的log文件夹下
### 因子检验
* 所在文件:factorTest.py
* 因子有效性分析:使用IC(信息系数)检验。IC值能够很好的反映因子对下期收益率的预测能力,IC值越高,就表明该因子在该期对股票收益的预测能力越强。
* 用户输入:start_date,end_date,factor_name
* 参数解释:例,用户输入为:
```py
start_date = "2010-10-4"
end_date = "2011-10-8"
factor_name = "MA" #待检验因子名
```
计算2010-10-4至2011-10-4期间,每个交易日因子MA的IC值,以及整个期间的IC平均值,标准差,信息比率
### 策略基类
* 名称: basetrategy
* 所在文件: `src/strategy/easyStrategy.py`
* 功能描述:
* 负责管理策略所需要的基本数据,以及这个策略的基本操作,比如:
* 买入/卖出股票,自动更新仓位
* 返回当前持有的股票列表
### 最大涨幅策略类
* 名称: EasyStrategy
* 所在文件: `src/strategy/easyStrategy.py`
#### 策略思想
每个调仓日,根据前back_day天的所有股票收益率排序,选出收益率最高的max_hold只股票买入
#### 用户自定义参数:
* start_date #策略起始日
* end_date #策略结束日
* trans_period #调仓周期
* back_day #在过去几天中选股
* max_hold #持有股票数量
* init_money #初始资金
每个调仓日买入Strategy类选择的股票,根据每只股票被分配的资金和该只股票调仓日的收盘价,计算买入仓位(处理股票必须买整股问题)。每个交易日,根据每只股票的仓位和收盘价,计算当日资产组合的市值
用户自定义:
#### 与大盘数据对比
### 双均线策略类
* 名称 doubleMastrategy
* 所在文件: `src/strategy/doubleMaStrategy`
#### 策略思想
该策略基于两条均线,即一条长均线,一条短均线。当短均线上穿长均线时,形成金叉,如果此时尚有资金,可买入股票;如果短均线下穿长均线,形成死叉,如果此时有该只股票的持仓,那么进行卖出。
#### 策略实现:
* 自行设定长短均线的时间窗口,比如长均线为20日移动平均,短均线为5日移动平均;
* 自行设置回测的起止日期及初始资金;
* 分别在每个交易日对每只股票进行判断,记录符合金叉和死叉条件的股票;
* 对于触发死叉的股票,如果有持仓,那么全部卖出,并计算当前现金余额;
* 对于触发金叉的股票,如果当前现金余额>0,那么将资金均分进行买入。
综上,即形成了一个自动进行调仓的动态策略。
#### 一个例子
#### 600048.xshg的均线图
### 机器学习策略类
* 名称 mlStrategy
* 所在文件: `src/strategy/mlStrategy`
#### 策略思想
每个调仓日用SVM模型,根据过去window_size天的所有股票数据,预测股票在未来next_n_day天的涨跌,等比例买入所有预测为涨的股票(如果src/svm文件夹中没有已经训练好的模型,需要调用trainModel.py先训练模型)
#### 用户自定义参数:
* start_date #策略起始日
* end_date #策略结束日
* window_size = 2 #预测几天后的涨跌
* next_n_day = 3 #使用历史数据的天数
* trans_period #调仓周期
* init_money #初始资金
#### SVM训练结果
* 训练集:2010-2013年的股票数据
* 测试集:2014-2019年的股票数据
* window_size = 2 #预测几天后的涨跌
* next_n_day = 3 #使用历史数据的天数
#### 机器学习策略回测
注意:为避免使用未来数据,回测日期可以选择训练集外的日期,或调整训练集范围
暂时将模型参数固定为window_size = 2,next_n_day = 3
