# 五个摆烂人 **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