文摘

机器学习方法在多因素股票策略已使用多年。本文使用三种机器学习方法和线性回归方法来找到最合适的方法。首先,建立一个框架和10 30风格因素和行业因素选择。第二,四种方法用于预测投资组合回报,通过预测回报相比,成功率和夏普比率。本文最后得出的结论。主要研究结果如下:支持向量回归预测最稳定的成功率,岭回归和线性回归最不稳定的成功率更极端的情况下;支持向量回归算法拟合多项式摘要在中国a股市场进行了优化,与传统的线性回归相比无论是股票回报和回档位控制;支持向量回归的结果明显优于沪深500指数进一步证明。

1。介绍

量化交易证券市场通常采用CTA(大宗商品交易顾问)策略,盘中高频策略和多因素定量策略。多因素模型广泛应用于股票市场,包括Fama-French三因素资产定价模型(1),Carhart四因子模型(2),和进一步改进的五因素和成分指数模型。学者们发现数以百计的市场异常可能会提供超额回报和创建了一个“因素动物园”。Bridgewater Associates复兴技术,AQR资本管理世界上顶级对冲基金的资产,全球金融市场交易实现超常回报投资者通过严格坚持量化策略。绝大多数nonquantitative股票基金还介绍了多因素模型分析和分配其证券头寸在某种程度上。

传统因素策略通常用于评分因素风险,股票收益预测和线性回归方法常用的是时间序列回归,横断面回归,法玛和麦克白3回归,汉森GMM回归(4]。然而,因素之间的关系价值和个股的回归在实际的股票市场通常是非线性导致线性回归,不能适应在许多情况下。此外,绿色等(5和侯等6]研究表明,样本外测试发现,大多数因素不能持续提供超额回报。失踪的超额回报的原因之一是增加收敛模型使用传统方法预测和交易安全市场,从而导致失败。随着人工智能技术的发展,穆雷风和这位7],et al jonkleinberg [8显示数据挖掘,机器学习,和其他技术方法应用于经济管理领域的研究。主要金融机构也采用新的技术和方法来改善证券市场交易的量化交易策略。

提高财务分析方法通过引入机器学习的方法,使实证研究范式从线性到非线性扩张,从关注参数意义模型结构和动态特性。适当的和健壮的模型来捕捉有效的财务数据和解释经济意义的特点,努力提高预测精度。

刘等人。9使用支持向量机(SVM)分类预测股票价格指数和发现支持向量函数可以准确反映变化趋势,提高预测精度。多因素选股模型的基础上,王et al。10)验证的预测性能随机森林算法在中国股市通过使用它来预测股市的兴衰和分析所选股票的回报。谢et al。11)使用套索回归和弹性网因素筛选过程中选择因素和确定重量和发现因素筛选通过这种方法可以获得超额收益。顾et al。12)测试机器学习算法的性能在美国市场,发现机器学习模型可以有效地超越传统的线性回归模型。王,李13)使用gcForest算法对个股进行分类和预测股票的上升和下降的概率。他们建立一个投资组合和重新测试表明,该组合可以获得显著的超额收益。他们比较SVM的回测结果和随机森林算法和发现gcForest算法明显优于其他算法稳定和上升时期股票市场从各种技术指标的综合分析。

虽然已经使用机器学习方法在回归预测证券市场近年来,仍然存在一些问题,方法是最好的或最适合新兴股票市场?安全市场在发展中国家更不稳定,有自己的特性。基于中国股市,本研究旨在建立一个预测框架来预测异常因素和超额回报之间的关系有不同的方法,进行系统的测试和评价方法是最好的。因此,本研究提出了三个研究问题:(1)是机器学习模型优于传统预测模型?验证第一个观察,传统的线性回归模型和三个机器学习算法在本研究选择模型。Rapach et al。14)展示传统线性回归被用于金融预测,取得了良好效果。(2)如果预测模型 采用线性函数形式,是否非线性模型的性能优于线性回归模型。验证第二个观察,传统线性脊回归和机器学习模型是用来比较和随机森林和支持向量机模型。岭回归是选择,因为它可以解决这个问题的稀疏模型作为Hastie et al。15)研究,随机森林和支持向量机算法选择,因为他们都是核心算法根据机器学习理论和取得好的结果在许多任务Fernandez-Delgado等人研究[16]。(3)如果预测模型 采用机器学习的方法,三种机器学习模型中性能最好,为什么?

2。因子变量选择和模型选择

多因素模型预测的任务是一个标准的监督学习和回归的任务,也就是说,探索以下函数形式: 在哪里 因素,选择的解释变量研究人员提前,影响股票的回报率 在时间 这个函数 可以采取任何形式,代表所有可能的方式吗 可以采取行动 研究者可以想象。残差项 代表控制之外的其他可能的影响因素。与传统因素回归模型相比,公式(1)不需要变量的数量X小于样本的数量,并允许吗 上生效 几乎所有的形式。在特定的样本条件下与传统的计量经济学分析框架,研究人员可以估算 减少的现象回归模型和非参数方法。但在降低了线性回归模型,解释变量 很容易与残余项 此外,当样本容量是有限的 包含很多变量,传统的非参数估计是很难克服的技术障碍,以及如何选择变量并没有解决所显示的亨德森et al。17]。

2.1。因素选择

多因素模型的本质是通过因素构建一个最优资产组合选择。因此,应选择尽可能多的因素解释股票的回报,以最小化剩余的回归模型代表股票的回报所不能解释的因素。个股的选择是基于预测模型的投资组合收益的结果。样品的特点,也就是说,模型中的独立变量,是由研究人员因市场经验。目前,投资行业的惯例是因素划分为产业因素和风格因素。行业因素是哑变量,如果个股属于一个特定行业,相应的因子值为1,其他行业的因子值是0。风格的因素是由投资者对市场的研究和理解。风格因素挖掘定量机构的数量和股票的能力来解释α体现学术能力的金融机构,不同的机构可以选择不同风格的因素。

基于中国国情的a股股票市场,十二个主要因素四类选择:估值因素包括市盈率、市净率、总市值、金融因素包括股价与现金流比率和市销率、动量因子包括流动率、营业额、产量、缸的长度,和收盘价,技术因素包括上芯的长度和降低芯的长度。技术因素改善,因为很少有研究关注芯的长度,但它显示了交易情绪对股票价格有很大的影响,特别是在新兴安全市场。

分层的主要因素是测试的方法,结果按降序排序表中列出1。集团购买前20%股票最大的因子值排名每周每个横向周期,而e组买的股票去年20%因素值排名每周每一横断面时期。每周的频率位置调整。同时,股票绝对每周超过15%被移除,占不到2%的股票的数量,为了消除股市的影响,连续涨停,涨停限制。

多空组合的分层测试的结果表明,四个因素的净值,即芯的长度,长度的影子,price-cash流动比率,和营收比率较低,说明这些因素并不与股票回报率强烈相关。考虑多空组合的净价值曲线和分层测试,两个金融因素,price-cash-flow比和营收比率,过滤掉,十风格选择的因素。结合30行业因素,现在40因素选择回归预测模型如表所示2

2.2。模型选择

机器学习是一个集多种形式的预测功能 和各种各样的算法。作为股票返回预测是一个监督学习回归的任务,从理论上讲,所有的机器学习算法适应回归任务可以用来构建股票回归预测模型。在这项研究中,三个机器学习回归算法(岭回归、随机森林回归和支持向量回归)用于预测单个股票的回报。基于单个股票的预期收益,构造投资组合测试,和机器学习算法的效率进行了分析。

2.2.1。岭回归模型

传统的线性回归模型的参数估计通常是通过最小化损失函数。损失函数的公式如下: 在哪里损失损失函数,XY分别为数据矩阵和结果变量,, 是回归系数向量。相比OLS估计,马尔和Kennard18)建议添加一个常数 的主对角线 矩阵,以确保矩阵 是可逆的,缓解多重共线性问题。为了获得参数的唯一解向量 ,摘要演化来限制它的数据范围。惩罚项引入处罚的损失函数回归。 的第一项(3)是残差的平方和。第二项是惩罚项, 是调整参数来控制惩罚强度。参数的最优解 岭回归模型 可以获得当损失函数最小值。参数的选择 确定回归系数被压缩的程度。不同的价值观 将会产生不同的结果。机器学习中常用的分析方法提出的McNeish和丹尼尔19K-fold交叉验证。交叉测试误差如下:

交叉验证错误 是一个函数的 , 时是最优的 是最小的。

2.2.2。随机森林

随机森林也是一个组合预测模型,属于装袋算法集成算法的家庭的变化。它是一个基于树的综合Breiman[提出的学习模式20.),广泛用于解决分类和回归。

装袋的纸使用随机森林算法,使用引导生成随机的训练样本n从最初的数据集。每个样本的概率被选中1 / n每个样本的概率,并没有被收集k次是 。36.8%的数据集,没有参加培训模型组成out-of-bag样本,可以用来评估out-of-bag错误。 用于表示实际使用的训练样本集 , 代表了out-of-bag样本的预测样本x的公式是 和out-of-bag装袋算法的泛化误差估计

考利et al。21)使用上面的结果作为标准模式修剪和过度拟合,以减少过度拟合的风险。

随机森林方法类似于装填方法都依赖于初始数据和使用引导方法构建训练集,随机森林也在训练过程中引入了一个随机属性选择的决策树。换句话说,在随机森林的一代,包含一个子集j,属性是随机选择的属性设置每个决策树的每个节点,然后选择一个最优的属性j分区后随机选择的子集。机器学习者越多越好随机森林学习。在这项研究中,采用加权的方法对回归意味着在随机森林的综合战略,及其公式可以表示为

2.2.3。支持向量机

支持向量机算法,首次提出通过Vapnik和弗拉基米尔22),是最大化之间的时间间隔不同类别的训练样本样本空间,实现最优分类。非线性样本应用在这项研究中,可以将特征空间映射到一个高维空间,和所有的样品都可以正确分类的映射函数。样本空间分区后的超平面可以表达的线性方程。 在哪里 的法向量确定超平面的方向,然后呢 位移项,确定超平面之间的距离和起源点。因此,从任意点的距离 样本空间的超平面 可以得到如下:

假设任意点 ,被归类为样本空间点

从上面的公式可以看出,为了找到分区与最大间隔超平面,有必要找到参数 满足约束(10),这样的和距离超平面的两个异构支持向量可以最大化。约束条件可以获得

对于非线性分类器,支持向量机有几个内核函数实现超平面分区,包括多项式内核,高斯径向基核,拉普拉斯算子的内核,内核乙状结肠。这些非线性核函数主要变换原始特征空间到高维特征空间,分离超平面。本文选择高斯径向基作为核函数建立支持向量机模型。

3所示。数据预处理和培训模式

预测单个股票的回报是最重要的多因素股票选择策略的一部分,和阿尔法策略通常来自股票。个股的价值因素是作为数据的特征(独立变量)和个别股票的回报率在未来时期的标签数据(因变量)。使用后的数据t-24年到t1期模型训练集,因子数据的个股t时间是用来预测的回报率t+ 1。股票投资组合转移期间每周在论文中选择,所以相应的训练集的数据是24周的预计本周天24周。

3.1。数据预处理

因为每个因素的尺寸不一致,有必要规范因素比较和回归。数据标准化之前,为了避免干扰估计造成的几个极值数据之间的相关因素和回报率,极端数据被排除在外。

1显示因子数据的概率密度比较之前和之后的股票市场价值de-extreme操作。可以看出de-extreme方法有效地减少了极端值对预测结果的影响。

后数据的股票市场价值因素是de-extreme,前后分布标准化比较图2。图2(一个)显示了数据分布在标准化之前,和图2(b)显示了标准化后的数据分布。可以看出,规范化数据的尺寸调整。

3.2。模型训练

后删除极端和标准化的因子载荷数据,四个算法包括线性回归、岭回归,随机森林回归和支持向量回归,分别预测单个股票的回报。岭回归算法,惩罚参数α是设置为90。随机森林回归,500棵树被选中来测试和回归树为基础的学习者。在支持向量机算法,使用径向基函数,径向内核γ参数设置为0.5,和惩罚参数被设置为100。

有40个样本特性包括10 30风格因素和行业因素模型。样品的标签是单个股票的回报率在接下来的横断面。样品24周前预测的特点和标签被选中作为训练集,和滚动预测。最后,每周的预测价值回报的股票证券市场从7月9日,2010年11月15日,2019年,获得了建设的投资组合。获得的数据来自中国股票市场,从CSMAR(中国证券市场与会计研究数据库)和风力金融终端市场信息序列。

4所示。预测结果和分析

4.1。均方误差比较

均方误差(MSE)的平方和之间的差异的真实值和预测值测试集的数量除以样品在测试集。在线性回归模型中,它是指损失函数。一般来说,MSE指数可以直观地反映了模型预测结果和实际结果之间的偏差,指出模型的泛化能力测试集的新数据。

3显示了MSE统计结果的四个算法在每个回测部分时期。

可以看出,MSE指标的四个算法是非常接近,表明所有股票的证券市场,四个算法的泛化能力接近对方。相比之下,上海和深圳证券交易所周转率的趋势图4,模型预测结果的偏差更大市场的成交量放大。特征符合中国a股市场的实际情况,对市场情绪常常被热,散户投资者集中的方式进入市场交易量放大时,对应的两个最高交易量在图42015年和2019年初。在这些时候,非理性投资者增加市场,和市场效率降低,这反映在个股的价格偏差。在这种情况下,历史数据通常不能准确预测未来,所以相应的模型预测偏差的增加。

4.2。预测的成功率

在多因素选股模型中,预测报表之间的偏差和实际回报通常不能完全确定该策略的优点。偏差可分为两种:一是所选股票的实际回报高于预期回报,另一个是所选股票的实际回报低于预期的回报。显然,第一个偏见是有利于投资者,而第二个偏见是一个负面的结果,应该尽量避免。因此,一些其他指标是用来帮助评估模型,如预测的成功率。

预测的成功率是指股票的实际回报的概率模型预测的是正的,也就是说,模型的准确性预测股票的上升。在许多情况下,模型的预测结果的绝对值不高。例如,尽管该模型预测个股回报率为3%,实际的股票上涨2%或4%是可以接受的。因为如果实际返回落在最后,预测将在投资造成损失。因此,成功率也是一个模型评价的重要指标。

5显示了概率密度分布的四个算法预测成功率在后面测试。

除了SVR,其他三个算法的分布都有两座山峰,其中线性回归和脊最不稳定的成功率,与这两个峰值接近0和1,分别0附近的峰值较高。随机森林是略优于这两个算法,但许多极端值的预测成功率仍然存在。因此,从的角度预测成功率,SVR是最稳定的,其次是随机森林回归,岭回归和传统线性回归非常不稳定,有很多极端值如表所示3

4.3。模型比较和分析

6显示了该投资组合净值曲线的构造使用相应的收益预期结果的四个算法。班轮回归对应线性回归,随机森林对应随机森林回归,脊对应岭回归,SVR对应于支持向量回归,基准和对应于沪深500指数的趋势。

回测结果显示如下。

4.3.1。SVR优于传统的线性回归算法

与传统的线性回归相比,由SVR构造投资组合的回报明显改善从回报率的角度和回档位控制。传统的线性回归是不适合高维数据、高维数据的独立变量的数量大于样本的大小,和矩阵的秩X小于的行数,这将导致矩阵吗X不是满秩,不能获得独特的解决方案。

此外,即使没有高维数据的问题,近似(不完全)多重共线性这意味着高相关性特征变量常常出现在传统的线性回归模型。矩阵变得几乎不可逆转的多重共线性,放大方差和低估了OLS估计的重要性。

回测结果表明,SVR对股票的回报有更好的预测效果比线性回归算法符合摘要的特征多项式和更适合的股票市场。例如,它可以看到从分层回归测试的结果的主要因素选择一部分的风格因素更好的效应模型中波动在一定程度上自2018年以来,市场价值的因素和周转率等。2017年,中国股市创纪录数量的ipo,以及监管机构打击高增加普通股的数量和其他主题投机,有一个大的转变在市场等市场风格的小盘股效应显著改变。对于这种非线性行为,机器学习算法是比较适合。相对于沪深500小型股指数的中国股市,夏普(23)比率计算是0.27,这意味着在相同的风险,投资组合收益超过CSI 500。

然而,SVR的结果有一个大回档位自2018年以来,这可能是由于越来越多地使用机器学习算法的定量机构在中国a股市场。即增加市场的资金回报预测使用SVR算法降低了算法本身的α。

4.3.2。线性回归的结果是相似的

回测结果表明,岭回归的趋势非常接近线性回归,这是由两种算法本身决定的。岭回归只添加一个惩罚项的线性回归;在这项研究中,惩罚项相当大导致类似的结果。尽管岭回归和线性回归算法相对较高的收益在2018年之前,2018年之后他们开始暴跌,这反映出分布的线性回归预测的成功率是不稳定的。预测结果的分析显示了岭回归的成功率分布和线性回归是一个极端,和徐et al。24)发现股票高回报不对称表现出较低的预期收益。在市场上,如果天气预报成功率是不稳定的,它将在净值产生负面影响。

岭回归了经典线性回归模型的优势在于其预测误差和方差之间的权衡。的增加 ,岭回归的拟合的平滑度减少,虽然方差减少,但偏差也在不断增加。一般来说,当响应变量和预测变量之间的关系大约是线性的,最小二乘估计将有一个低偏差但是一个大的方差,这意味着小的训练数据的变化可能导致大变化的最小二乘回归系数。当多的变量和观测的数量接近,最小二乘估计的方差较大,当变量的数量大于观测的数量,最小二乘没有唯一解。岭回归方法仍然可以大量减少方差增加一个小的偏差,和更好的拟合效果可以通过使用这种权衡。回测结果表明,岭回归拟合趋势效果非常接近普通的线性回归,这从另一方面也反映了最小二乘估计的方差并不大。

4.3.3。随机森林回归是微不足道的示例

随机森林只使用一些节点变量决策树。因为不同的节点被迫分割不同的变量,不同的决策树可以减少之间的相关性,从而降低方差。因此,在方差和偏差之间的权衡中,随机森林牺牲少量的偏差较小的方差,以减小均方误差。因为所有特征变量用于分裂在这项研究中,即使偏差很小,不同决策树之间的相关性强,导致大的方差。所以,由随机森林回归算法建立的投资组合并不产生显著的超额收益,这算法没有明显优于传统的线性回归算法在多因素选股模型的建设。

5。结论与展望

5.1。结论

本研究旨在研究机器学习算法的应用在多因素选择策略。

首先,根据分层回测的结果和多空组合,市销率和股价与现金流比率因素不是强与股票的回报率是移除。剩下的10 30风格因素和行业因素构成了独立变量的回归预测模型。

接下来,四个算法,包括线性回归和三个机器学习回归,分别预测股票的回报。预测结果的偏差会增加当股市成交量放大,说明模型的预测效果会减弱,当市场人气高,投资者的非理性定价增加。在四个算法,支持向量回归最稳定的成功预测股票回报率,岭回归算法和线性回归算法预测的最不稳定的成功率和更极端的情况。

最后,构建投资组合的位置个股的重量是由预期收益的加权平均值,并预测结果的四个算法测试。发现支持向量回归的显著改善与传统线性回归相比,无论是返回和回档位控制。结果可以大大超越沪深500指数,表明支持向量回归算法在机器学习有更好的效果预测回报多因素股票选择策略。

总之,可以使用支持向量回归健康摘要多项式在中国a股市场,及其适用性强。

5.2。前景

多因素选股模型不仅可以帮助投资者做出更高效和准确的决策投资,但也有一个清晰的理解的巨大和复杂的证券市场和价格波动抓住贸易机会。随着物联网的出现,加速发展的大数据和云计算,数据挖掘算法的不断创新,将探索更多的和更合理的算法,用于中国股票市场获得超额回报。

从数据的角度关系,超额回报率预测变量之间的非线性关系和异常因素也许不是很强,导致一些机器学习算法的预测效果在这项研究中的应用是不如传统的线性回归模型。另一方面,它也受限于算法本身的问题。尽管岭回归模型可以解决 不可逆转的问题在线性回归模型中,成本是“压缩”回归系数,从而使模型更加稳定和可靠。自罚项是回归系数的二次函数 ,当寻求目标函数的最小值,其偏导数总是保留独立变量本身。所以,有时岭回归不能实现真正意义上的变量的选择。尽管SVM模型的结果有时是优秀的性能,其最大的缺点是,当数据规模大,运营成本相对较高。因此,未来的工作可以从以下两个方面:进一步研究如果真正的数据稀疏问题,套索回归可以被认为实现更好的结果;如果决策树之间的相关性强,预测精度可以进一步提高了使用学习演算法。

附录

图解释

数据7- - - - - -18显示的分层测试结果的主要因素和净值曲线多空组合,用于筛选因素。

Python代码

Python实现的模型是3.7.3,回测部分程序代码如下表。熊猫作为pd导入进口matplotlib。pyplot作为plt导入数学进口numpy np进口操作系统def get_hundred (arr):temp = []因为我在加勒比海盗:如果我= = 0:temp。追加(0)其他:temp.append(数学。地板(i / 100)∗100)返回临时def get_net_value(天):“‘g等净值:param天:返回测试日期:返回:净价值“‘全球地位nv =钱象征,数量position.items ():如果pd.isnull (df_close(符号)[日]):打印(“股票没有价格:{},使用最近的价格.format(符号))nv = nv +价格(符号)∗数量继续其他:nv = nv + df_close(符号)(天)∗数量价格(符号)= df_close(符号)(天)返回公司def法官(天,next_day):“‘:param天:返回测试日期:返回:记录单词的位置变化:change_quantity“‘全球change_quantitynew_nv = get_net_value(天)df_judge = pd。DataFrame ({new_weight: df_weight [next_day]},指数= df_weight.index)df_judge [' new_symbol_mv '] = df_judge (“new_weight”)∗new_nvdf_judge[价格]= df_close。loc[天:]df_judge = df_judge [df_judge(“价格”)> 0)df_judge [' new_symbol_quantity '] = df_judge [' new_symbol_mv '] / (df_judge(“价格”)∗((1000 + trade_fee) / 1000))df_judge = df_judge。fillna (0)# df_judge = df_judge。sort_values (=“new_symbol_mv”,提升= False)df_judge [' new_symbol_quantity '] = get_hundred (df_judge [' new_symbol_quantity '])df_old_quantity = pd。DataFrame((位置),指数= [' old_quantity '])df_old_quantity = df_old_quantity.Tdf_judge [' old_quantity '] = df_old_quantity (“old_quantity”)df_judge = df_judge。fillna (0)df_judge [' change_quantity '] = df_judge [' new_symbol_quantity '] -df_judge (“old_quantity”)change_ = df_judge [' change_quantity '] [df_judge [' change_quantity '] ! = 0)返回change_def买(符号、数量、成本):全球地位、金钱如果符号位置:位置(符号)=位置(符号)+数量其他:位置(符号)=数量金钱=钱-成本def出售(符号、数量、成本):全球地位、金钱位置(符号)=位置(符号),数量如果位置(符号)= = 0:德尔位置(符号)钱=钱+成本def贸易(天):“‘贸易根据位置变化:param天:返回测试日期返回:“‘stop_trade = []change_quantity.index的象征:如果df_close(符号)(天)= = 0:print({}暂停,不能交易。格式(象征,天))stop_trade.append(符号)change_quantity.index的象征:# sale如果change_quantity(符号)< 0:如果在stop_trade象征:#判断暂停print({}暂停,不能出售。格式(象征,天))继续如果df_ret(符号)[日]> -0.09:#判断极限下降如果位置(符号)> = abs (change_quantity[象征]):#判断股票到达销售数量trade_money = abs (change_quantity[象征])∗df_close(符号)(天)∗(1000 - trade_fee) / 1000卖(符号=符号、数量= abs (change_quantity[象征]),成本= trade_money)其他:#看到所有trade_money =位置(符号)∗df_close(符号)(天)∗(1000 - trade_fee) / 1000打印(“{}{}数量不够,出售所有{}”。格式(天、象征、abs (change_quantity[象征]),位置(符号)))出售(符号=符号、数量=(符号),成本= trade_money)其他:打印(“{}日,{}litmit下来,不能卖出”。格式(一天,符号))继续其他:继续change_quantity的象征。指数:#买如果change_quantity(符号)> 0:如果在stop_trade象征:#判断暂停print ({} suspende,不能买。格式(象征,天))继续如果钱< 10000:#现金低于10000放弃购买打印(“{}灰低于10000,放弃购买{}”。格式(一天,符号))继续如果df_ret(符号)[日]< 0.09:#如果限制trade_money = abs (change_quantity[象征])∗df_close(符号)(天)∗(1000 + trade_fee) / 1000如果钱> trade_money: #现金不够trade_money = change_quantity(符号)∗df_close(符号)(天)∗(1000 + trade_fee) / 1000购买(象征,change_quantity(符号),trade_money)其他:#现金不够,可以购买trade_quantity = 100∗数学。地板(钱/ (df_close(符号)[日]100∗∗((1000 + trade_fee) / 1000)))如果trade_quantity > 0:trade_money = trade_quantity∗df_close(符号)(天)∗(1000 + trade_fee) / 1000购买(象征,trade_quantity trade_money)打印(“现金是不够的,{}日{}买可以{}”。格式(一天,象征,trade_quantity))如果trade_quantity < 0:打印(“错误,{}日{}买数量是负数”。格式(一天,符号))其他:#跳过如果限制打印(“{},{}日涨停,买不到的。格式(一天,符号))继续其他:继续def get_account(天):“‘获得账户信息进行程序调试:param天:返回:账户信息的今天,csv文件“‘symbol_list = []quantity_list = []price_list = []mv_list = []象征,数量position.items ():symbol_list.append(符号)quantity_list.append(数量)price_list.append(价格(符号))mv_list。追加(数量和价格(符号)∗)df_account = pd。DataFrame({“符号”:symbol_list,“数量”:quantity_list,“价格”:price_list,“mv”: mv_list})df_account['钱']=钱df_close = pd。read_csv #矩阵的收盘价df_close [df_close。列[0]]=列表(地图(λx: str (x)df_close [df_close.columns [0]]))df_close = df_close.set_index (df_close。列[0])df_ret = pd.read_csvdf_ret [df_ret。列[0]]=列表(地图(λx: str (x)df_ret [df_ret.columns [0]]))df_ret = df_ret.set_index (df_ret。列[0])df_sum = pd.DataFrame ()df_change_rate = pd.DataFrame ()model_name = os.listdir在model_name m_name:bug_record = []位置= {}价格= {}钱= 500 _0000origin_money = 500 _0000net_value = []change_rate = []long_short = []money_record = []trade_fee = 9df_weight = pd.read_csv.format (m_name))df_weight = df_weight.set_index (df_weight.columns [0])start_day = ' 20120706 'all_time_interval =列表(df_weight.columns)back_test_interval = all_time_interval [all_time_interval.index (start_day): 1)在back_test_interval日期:next_date =列表(df_weight.columns)(1 +列表(df_weight.columns) .index(日期)]change_quantity =法官(日期、next_date)贸易(日期)# get_account(日期)net_value.append (get_net_value(日期)/ origin_money)如果日期= = start_day:print(“{}{} %净值变化”。格式(日期、0))change_rate。追加(0)money_record.append(钱)其他:#打印(get_net_value(日期)/ 1 _000_000_000 - net_value [2])∗100 / net_value [1])print(“{}{}{}净值”.format (m_name.split(“_”)[1],日期,圆(net_value [1], 6)))print(“{}{}{}净值”.format (m_name.split(“_”)[1],日期,圆(net_value [1] / net_value [2] - 1, 6)))money_record.append(钱)change_rate。追加(圆(net_value [1] / net_value [2] - 1, 6))df_result = pd。DataFrame ({net_value: net_value,“change_rate”: change_rate},指数= back_test_interval)df_sum [“{}”.format (m_name [4])) = df_result (“net_value”)df_change_rate [“{}”.format (m_name [4])) = df_result (“change_rate”)df_result.to_csv.format (m_name))df_sum = df_result.index“指数”df_sum = df_sum。set_index(指数)df_sum.plot.line ()plt.show ()df_change_rate = df_change_rate.index“指数”df_change_rate = df_change_rate。set_index(指数)df_change_rate.plot.line ()plt.show ()。

数据可用性

这个手稿的生成的数据和分析可从CSMAR(中国证券市场与会计研究数据库)和风力金融终端市场信息序列。

的利益冲突

作者宣称没有利益冲突。

确认

本研究支持的“长城学者培训项目”建设的高级教师在北京大学和北京社会科学规划项目的基金(批准号20 srb010)和种植CUEB的主要研究项目:研究机制,测量,早期预警和预防系统性金融风险在中国蔓延。