基于Logistic回归的算法交易

2020-09-05 14:19:31

了解如何实现自动机器学习策略,目标是为算法交易找到最佳股票。

随着机器学习的日益普及,许多交易员都在寻找可以“教”电脑为他们进行交易的方法。这个过程被称为算法交易(有时称为算法交易)。

不过,为了实现算法交易策略,您必须首先缩小要分析的股票的范围。本演练提供了一个自动过程(使用Python和Logistic回归)来确定最适合进行算法交易的股票。

我将更深入地研究下面的逻辑和代码,但以下是该过程的高级概述:

使用5、30和60天的观察时间段对每个股票执行逻辑回归。

将yFinance导入为yf,将熊猫导入为pd,shotil,os,time,globimport matplotlib.pylot作为pltimport number py作为np从sklearn导入。数据集从sklearn导入load_digitsfrom sklearn.line_model导入Logistic Regressionfrom sklearn.metrics导入class_report,conflsion_matrixfrom sklearn.model_select导入train_test_plitfrom sklearn.预处理导入StandardScalerfrom get_all_tickers import get。

获取我们想要观察的股票的历史数据是一个分两步进行的过程。

单独调用YFinance API,以便导入每家公司的数据。

Get-All-Tricker库允许我们通过过滤市值或交易所等方面的公司来编制股票报价列表。在这个例子中,我关注的是市值在15万美元到1000万美元(百万美元)之间的公司。

您会注意到,我还包含了一行代码来打印我们正在使用的自动收报机的数量。这是非常重要的。您需要确保您的目标代码不超过2,000个,因为YFinance API每小时有2,000个API调用限制。

我们还需要在本地计算机上删除并创建一个文件夹来保存历史库存数据。请注意,在第一次运行此步骤之前,您需要手动创建此文件夹。这一步很重要,因为它将删除过去迭代中的数据,并允许程序重新开始。

#我们有兴趣分析的股票列表。在撰写本文时,它会将股票列表缩小到44个。#如果您有自己的列表,只需创建一个新列表,而不是使用此列表,例如:Tickers=[";fb";,";amzn";,...]。Tickers=gt.get_tickers_filtered(mktCap_min=150000,mktCap_max=10000000)#检查滚动条数量是否不超过2000print(";选择要观察的股票数量:";+str(len(Tickers)#这两行代码将删除STOCKS文件夹,然后重新创建它以删除旧股票。确保您在第一次运行此Path>;\\Bayesian_Logistic_Regression\\Stocks\\";)os.mkdir(";<;Your Path>;\\Bayesian_Logistic_Regression\\Stocks\\";)(";<;Your Shoptil.rmtree)时已创建了一个STOCKS文件夹。

我们现在将通过向雅虎财经发出独立的电话来获得我们的股票代码列表中每只股票的历史价格数据。收到数据后,程序会将每家公司的信息保存在一个新的CSV文件中,该文件将位于您预先创建的文件夹中。

#保存我们执行的API调用量Amount_of_API_Calls=0#此While循环负责存储列表中每个自动收报机的历史数据。请注意,Yahoo Finance有时会导致json.decode错误,因此我们会在每次迭代后休眠2#秒,如果调用失败,我们将尝试再次执行。#此外,每小时不要超过2,000个调用或每天不要超过48,000个调用,否则Yahoo Finance可能会阻止您的IP。下面的子句";(Amount_of_API_Calls<;1800)";将阻止循环对yFinance API进行#太多的调用。#准备此循环需要一些时间。导入每只股票后暂停2秒。#用于确保不会在一个股票代码上浪费太多可能有问题的API调用Stock_Failure=0Stocks_NOT_IMPORTED=0#用于迭代tickersi=0while(i<;len(Tickers))and(Amount_of_API_Calls<;1800)的列表:try:stock=tickers[i]#获取当前股票代码temp=yf.。)#告诉yFinance我们需要关于这只股票的哪种数据(在本例中是所有历史数据)Hist_data.to_csv(";<;您的Path>;\\Bayesian_Logistic_Regression\\Stocks\\";+stock+";.csv";)#以csv格式保存历史数据,以便以后进一步处理。睡眠(2)#会暂停循环两秒钟,这样我们就不会导致雅虎财经出现问题。S后端操作Amount_of_API_Calls+=1 Stock_Failure=0 i+=1#迭代到下一个自动收报机打印(";导入股票数据:";+str(I))除ValueError:Print(";Yahoo Finance后端错误,正在尝试修复";)#雅虎财经的后端出现错误。如果Stock_Failure>;5:#如果当前股票代码失败超过5次I+=1个STOCKS_NOT_IMPORTED+=1 Amount_of_API_CALLES+=1 Stock_Failure+=1print(";我们成功导入的股票数量:";+str(i-STOCKS_NOT_IMPORTED)),我们将再次尝试检索数据。

为了对每只股票进行逻辑回归,我们需要证实自变量。这32个以上的技术指标将作为因变量的预测变量。

您还会注意到,我们正在创建三个额外的列。这些将作为我们试图用模型预测的值(因变量)。这三个变量是对每只股票收盘价的5天、30天和60天的观察(如果股票上涨,则为1;如果股票没有上涨,则为0)。

#这两行删除STOCKS文件夹,然后重新创建它,以便删除旧的STOCKS。确保您在第一次运行此Path>;\\Bayesian_Logistic_Regression\\Stocks_Sub\\";)os.mkdir(";<;Your Path>;\\Bayesian_Logistic_Regression\\Stocks_Sub\\";)#时创建了一个股票文件夹。您的Path>;\\Bayesian_Logistic_Regression\\Stocks\\*.csv";获取Y值LIST_FILES=(glob.glob(<;<;Your globeslist_files=(glob.glob(<;<;Your GlobesList_Files=(glob.glob(<;Your Glob。))#在LIST_FILES中创建STOCKS文件夹中所有csv文件名的列表:STOCK_NAME=((os.path.basename(interval)).split(";.csv";)[0])Data=pd.read_csv(Interval)Dropna(Data)Data=ADD_ALL_TA_FEATURES(DATA,OPEN=";OPEN";,HIGH=";HIGH";,LOW=";LOW";,CLOSE=";CLOSE";,VOLUME=";Volume";)data=data.iloc[100:]CLOSE_PRICES=DATA[';CLOSE';].tolist()Five_Day_Obs=[]30_Day_Obs=[]x=0 While x<;(len(Data)):如果x<;(Len(Data)-5):if((Close_Price[x+1]+Close_Price[x+2]+Close_Price[x+3]+Close_Price[x+4]+Close_Price[x+5])/5)/5)>;Close_Price[x]:Five_Day_Obs.append(1)Else:Five_Day_Obs.append(0)Else:Five_Day_Obs.append(0)x+=1 y=0 While y&l。(长度(数据)-30):ThirtyDayCalc=0 y2=0而y2<;30:ThirtyDayCalc=ThirtyDayCalc+Close_Price[y+y2]y2+=1 if(ThirtyDayCalc/30)>;Close_Price[y]:30_Day_Obs.append(1)Else:30_Day_Obs.append(0)Else:30_Day_Obs.append(0)y+。60:六十天计算=六十天计算+关闭价格[z+Z2]Z2+=1 if(星期六计算/60)>;关闭价格[z]:六十天对象[z]:六十天对象追加(1)否则:六十天对象追加(0)其他:六十天对象追加(0)其他:六十天对象追加(0)z+=1数据[';Five_Day_Observation_Output';]=Five_Day_Obs.Output';]=Five_Day_Obs_Output';]=Five_Day_Obs data[';Thirty_Day_Observation_Outcome';]=。]=六十天目标数据。至_csv(";<;您的Path>;\\Bayesian_Logistic_Regression\\Stocks_Sub\\";+Stock_Name+";.csv";)打印(";+股票名称+&34;的数据已通过技术功能验证。";)。

在这一点上,我们有历史数据,以及我们选择观察的每只股票的32个以上的技术指标。我们还创建了三个不同的时间间隔观察,以预测股票的未来价格。

现在,剩下的就是清理数据(删除无限和空值),运行Logistic回归模型,并解释结果。

对于那些不太熟悉运行统计模型的人,下面是以下代码的快速细目:

创建一个循环,为每个股票运行三次逻辑回归(对于5天、30天和60天的观察)。

将输出保存为CSV文件,以便我们可以解释结果并找到最适合交易的股票。

HOLD_RESULTS=[]LIST_FILES2=(GLOB.GLOB(";<;您的Path>;\\Bayesian_Logistic_Regression\\Stocks_Sub\\*.csv";))#为LIST_FILES2中的Interval2创建STOCKS文件夹中所有csv文件名的列表:STOCK_NAME=((os.path.basename(interval2)).split(";.csv";)[0])DATA=pd.read_csv(间隔2,索引_列=0)DATA=data.place([np.inf,-np.inf],np.nan)DATA=data.fulna(0)Dependents=[data[";Five_Day_Observation_Outcome";].to_list(),data[";Thirty_Day_Observation_Outcome";].to_list(),Data[";六十天观察结果";].to_list()]Data=data.drop([';Five_Day_Observation_Outcome';,';30天_观察_结果';,';六十天_观察_结果';,';日期';,';打开';,';高';,';低';,';关闭';],AXIS=1)Scaler=StandardScaler()DATA=scaler.fit_Transform(DATA)#标准化我们的数据集HOLD_RESULTS_SECTION=[]p=0,用于受抚养人中的DEP:x_TRAIN,x_TEST,Y_TRAIN,Y_TEST=\TRAIN_TEST_SPLIT(DATA,DEP,TEST_SIZE=0.2,RANDOM_STATE=0)MODEL=LogisticRegression(solver=';liblinear';,C=0.05,MULTI_CLASS=';ovr';如果p==0:Hold_Results.append([Stock_Name,";Five_Day_Observation_Output";;Five_Day_Observation_Output";Four_Day_Observation_Output";Five_Day_Observation_Output";如果p==1:Hold_Results.append([Stock_Name,";Thirty_Day_Observation_Output";[Stock_Name,";Thirty_Day_Observation_Output";Thirty_Day_Observation_Output";Conf[1,0],conf[1,1]])If p==1:Hold_Results.Append([Stock_Name,";Thirty_Day_Observation_Output";如果p==2:Hold_Results.append([Stock_Name,";Sixty_Day_Observation_Output";Conf[0,0],conf[1,1]])If p==2:Hold_Results.Append([Stock_Name,";Sixty_Day_Observation_Output";Sixty_Day_Observation_Output";,model.core(x_系列,y_系列),model.core(x_test,y_test),conf[0,0],conf[0,1],conf[1,0],conf[1,1])p+=1 print(";模型完成";+Stock_name)df=pd.DataFrame(HOLD_RESULTS,Columns=[';Stock&39;,';观察期&39;,';,';真阳性&,';假阳性';,';F

对于每只股票,哪个观察期是最好的(即具有最高的模型精度)。

当然可以从这段代码中派生出更多内容,例如,您可以从混淆矩阵中计算灵敏度和特异度。

要获得我的完整代码,请从GitHub网站下载。要了解有关自动化股票分析的更多信息,请查看我的另一篇文章“自动化股票分析指南”。

如果你喜欢这篇文章,请告诉我你的想法。我很想听到一些反馈!

此外,请在此处与我在LinkedIn上联系。我总是很乐意结交一些新朋友!