Scikit-Learn 股票投资:p15

前言

在上一期教程的结论中,我们提及到了手动划分回测数据的弊端, 因为股票数据是按照字母来排列的,而不是随机抽取的。 本次视频主要是创建一个随机函数将序列打乱,从而达到随机抽样的目的。

视频

视频出处

视频系列:Scikit-learn Machine Learning with Python and SKlearn

本视频出处:Scikit Learn Machine Learning for investing Tutorial with Python p. 15

哔哩哔哩:Scikit Learn Machine Learning for investing Tutorial with Python p. 15

内容

本视频比较短,只有10分钟时长。 作者首先建立了一个randomizing的function用作测试,然后再将得出的公式应用到原代码中。

首先,我们建立一个Randomizing的function用作测试:

def Randomizing():
    df = pd.DataFrame({'D1':range(5),'D2':range(5)})
    df2 = df.reindex(np.random.permutation(df.index))
    print(df)
    print(df2)
Randomizing()

df生成的序列为正常序列。然后作者利用了np.random.permutation将数据的序列重新rexindex一遍。

所以最后得出来的数据如下:

   D1  D2
0   0   0
1   1   1
2   2   2
3   3   3
4   4   4
   D1  D2
1   1   1
0   0   0
2   2   2
4   4   4
3   3   3

既然利用随机序列这个办法可行,那么就可以将此公式应用到源代码中。 我们在Build_Data_Set的function中添加data_df = data_df.reindex(np.random.permutation(data_df.index))

def Build_Data_Set(features = FEATURES):
    #读取key_stats.csv
    data_df = pd.DataFrame.from_csv("key_stats.csv")
    data_df = data_df.reindex(np.random.permutation(data_df.index))
    .............

这样做就可以解决随机数据组的问题了。

2991
accuracy: 65.2

源代码

import numpy as np
from sklearn import svm ,preprocessing
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")

FEATURES =  [
  'DE Ratio',
  'Trailing P/E',
  'Price/Sales',
  'Price/Book',
  'Profit Margin',
  'Operating Margin',
  'Return on Assets',
  'Return on Equity',
  'Revenue Per Share',
  'Market Cap',
  'Enterprise Value',
  'Forward P/E',
  'PEG Ratio',
  'Enterprise Value/Revenue',
  'Enterprise Value/EBITDA',
  'Revenue',
  'Gross Profit',
  'EBITDA',
  'Net Income Avl to Common ',
  'Diluted EPS',
  'Earnings Growth',
  'Revenue Growth',
  'Total Cash',
  'Total Cash Per Share',
  'Total Debt',
  'Current Ratio',
  'Book Value Per Share',
  'Cash Flow',
  'Beta',
  'Held by Insiders',
  'Held by Institutions',
  'Shares Short (as of',
  'Short Ratio',
  'Short % of Float',
  'Shares Short (prior '
]


def Build_Data_Set(features = FEATURES):
    #读取key_stats.csv
    data_df = pd.DataFrame.from_csv("key_stats.csv")
    
    data_df = data_df.reindex(np.random.permutation(data_df.index))
    #将features转换为np.array
    X = np.array(data_df[features].values)
    
    #将'outperform和outperform'和转换为0 和 1, 因为machine learning只会区分数字
    y = (data_df['Status']
         .replace('underperform', 0)
         .replace('outperform',1)
         .values)
    
    X = preprocessing.scale(X)
    return X, y
    
    
def Analysis():
    #用于回测侧数据大小
    test_size = 1000    
    X, y = Build_Data_Set()
    print(len(X))
    
    #设为linear回归模型
    clf = svm.SVC(kernel = 'linear', C=1.0)
    #训练我们的模型
    clf.fit(X[:-test_size],y[:-test_size])
    
    correct_count = 0
    
    for x in range(1, test_size+1):
        if clf.predict(X[-x])[0] == y[-x]:
            correct_count += 1
    print('accuracy:', (correct_count/test_size)*100)

#def Randomizing():
#    df = pd.DataFrame({'D1':range(5),'D2':range(5)})
#    df2 = df.reindex(np.random.permutation(df.index))
#    print(df)
#    print(df2)
#Randomizing()
Analysis()

最后

虽然分c君_BingWong只是作为一名搬运工,连码农都称不上。 但制作代码中的注释、翻译和搬运都花了很多时间,请各位大侠高抬贵手,在转载时请注明出处。

添加新评论