基本原理
- 三因素模型表达式:
E(Rit) − Rft = βi[E(Rmt − Rft] + siE(SMBt) + hiE(HMIt)
- 根据一篇文章,选择三个因子作测试:
- 财务因子:EPS
- 成交量因子:log(30日日均交易量/昨日交易量)
- 反转因子:(ma10-ma5)/ma5
- 综合选取这三个因子,0.3,0.4,0.3的权值加和,选取较高的股票并持仓。综合选取这三个因子,0.3,0.4,0.3的权值加和,选取较高的股票并持仓。
策略实现
- 初始资金100万,20万无明显效果差异,时间段为2017-01-01~2018-01-01.
- 选取市盈率0~20之间的股票,每日对三因子加和进行排序
- 每天进行判断,选取三因子加和排名前n的股票,若已持股,继续买入,未持股则买入,已持股中有不在排名前n中的,卖出。
- (每日操作10只股票)运行截图(忽略曲线名):
![10](https://i-blog.csdnimg.cn/blog_migrate/a8935ce1695226125b9f67c4bcf9d959.png)
- (每日操作20只股票)运行截图(忽略曲线名):
![20](https://i-blog.csdnimg.cn/blog_migrate/232a4581d2e6693f336b07ced62f7279.png)
遇到的问题及改进:
- 采用的三个因子或许还能有其他财务因子进行代表
- 本次代码中取得EPS的时间有些过长,有点想法,等我后面改进(已改进,不必每只股票每天的eps都获取一次)
代码如下:
# coding: utf-8
# @author: lin
# @date: 2018/11/20
import QUANTAXIS as QA
import datetime
import pandas as pd
import time
import math
import matplotlib.pyplot as plt
import numpy as np
pd.set_option('max_colwidth', 5000)
pd.set_option('display.max_columns', 5000)
pd.set_option('display.max_rows', 5000)
class ThreePara:
def __init__(self, start_time, stop_time, n_stock=10, stock_init_cash=1000000, n_days_before=1):
self.Account = QA.QA_Account() # 初始化账户
self.Account.reset_assets(stock_init_cash) # 初始化账户
self.Account.account_cookie = 'three_para'
self.Broker = QA.QA_BacktestBroker()
self.time_quantum_list = ['-12-31', '-09-30', '-06-30', '-03-31']
self.start_time = start_time
self.stop_time = stop_time
self.n_days_before = n_days_before
self.stock_pool = []
self.data = None