Scikit-Learn 股票投资:p14

前言

上一视频作者只用到了两组数据,本次视频将会添加其余全部的数据组去训练我们的模型。为了更好地优化我们的数据组,我们将用到preprocessing.scale来标准化我的数据。然后将部分数据划分出来用于模型回测。

视频

视频出处

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

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

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

内容

首先我们需要新增preprocessing模块:

from sklearn import svm ,preprocessing

我们先看看数据标准化的前后对比:

从上图可以看出,没有标准化的数据数值高达100,标准化后的数据最大值为5以下。这样做的好处是,当数据参差不齐的时候,Sklearn可以帮我们扔掉'异类'数据。

然后添加新的数据组:

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 '
]

在自定义functionAnalysis():里面,我们手动将数组进行划分用于回测。

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)

得出的结果为:

2991
accuracy: 59.9

源代码

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")
   
    #将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)

    
Analysis()

结论

实际上,上面手动划分回测数据的大小是存在很多弊端。 因为股票数据是按照字母来排列的,而不是随机抽取的,那么我们手动划分回测数据会造成一定的数据偏差。

其次,本次回测得出来的准确率(accuracy)为59.9%。 实际上准确率还是挺高的。但是这个数字的意义不大。 因为我们不知道股票的股价表现如何。 有可能我们60%的股票都是跑赢大盘的,但是40%股票的损失会导致我们破产。 或者10%的胜率足以帮我们赚90%的利润。

最后

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

添加新评论