「データゲーム」:嶺回帰を使って招商銀行の株価を予測する


作者:Max,「データゲーム」优胜チームメンバー
先日、「データゲーム」に応募しましたが、5月15日(水)の招商銀行の株価を予測し、締め切りは5月12日(日)です.今回の予測では、嶺回帰を使いました.
嶺回帰
嶺回帰は回帰の一種であり、回帰における重大な難題を解決する:多重共線形を排除し、変数の選択を行い、共線形問題と病態データが多い研究において大きな実用価値がある.照度娘百科の解釈によると、嶺回帰は共線形データ分析に特化した偏推定回帰方法であり、実質的に改良された最小二乗推定法であり、最小二乗法の無偏性を放棄することによって、一部の情報を損失し、精度を低下させることを代価として回帰係数を得ることは実際に合致し、より信頼できる回帰方法であり、病態データに対するフィッティングは最小二乗法より強い.
多重共線形とは、線形回帰モデルにおける解釈変数の間に、正確な相関関係または高度な相関関係が存在するため、モデル推定歪みまたは正確な推定が困難であることを意味する.
嶺回帰に関する数学知識は複雑で、文章の幅が限られているため、ここでは多くの展開にすぎない.
データ取得
今回のデータはTushareでのget_hist_data()が取得しました.Tushareは無料でオープンソースのpython財経データインタフェースパッケージです.pythonインストールtushareはpip install tushareで直接インストールできます.
import tushare as ts
data = ts.get_hist_data('600848')

実行後、その前後の数行のデータを表示できます.tushare公式の説明に従ってget_hist_data()は3年近くの日線データしか取得できませんが、彼の戻り値の説明はこうです.
  • date:日付;
  • open:開場価格;
  • high:最高価格;
  • close:終値;
  • low:最低価格;
  • volume:成約量;
  • price_Change:価格変動;
  • p_change:下落幅を上げる;
  • ma 5:5日平均価格;
  • ma 10:10日平均価格;
  • ma 20:20日平均価格;
  • v_ma 5:5日平均量;
  • v_ma 10:10日平均量;
  • v_ma 20:20日平均
  • 平均値とは、株価のn日間の成約価格や指数の平均値を意味する.平均量は成約量と関係がある.他の戻り値については、すぐにわかるでしょう.データを取得した後、記述的な統計を確認し、data.describe()によって異常値または欠落値があるかどうかを確認します.
    このように見ると、週末や祝日の開場がないことによる当日のデータの欠落以外に、他の欠落や異常はないようだ.しかし、ここでは休日の欠落値を考慮しません.
    データプリプロセッシング
    取得したデータは日付降順で並べ替えられていますが、今回の予測は時間系列に関係しているので、日付昇順で並べ替える必要があります.
    data1 = data[::-1]

    手順を処理した後、フィーチャー値の選択をします.volumeおよび平均量の値が大きいため,処理を行わないと全体の予測に悪影響を及ぼす可能性が高い.時間が限られており,演算の複雑さを考慮して,ここではこれらの特徴を処理するのではなく,直接削除した.平均については、10日平均、20日平均に比べて5日平均の範囲はそれほど大きくなく、最近の予測は他の2つより良いので、5日平均を保留します.それからsklearnを使います.model_selectionのcross_val_scoreは、「open」、「close」、「high」、「low」、「ma 5」以外の残りの属性が予測値に及ぼす影響をそれぞれ表示します.発見、'p_change'、'price_change'の2つの属性は予測結果にあまり影響を及ぼさず、メモリを節約し、演算速度を増やし、予測の正確性を高めるために、直接削除しました.終わったら、前後3行のデータを調べます.
    data1 = data1[['open','high','low','ma5','close']]
    data1.head(3), data1.tail(3)

    モデリング予測
    提出締め切りは日曜日で、予測は水曜日なので、月曜日と火曜日の情報を先に予測する必要があります.ここでふと思いついたのは、前日のすべてのデータでモデルを訓練して当日のcloseを予測するのが正確なのか、それとも当日のclose以外のデータでモデルを訓練して当日のcloseを訓練するのが正確なのか.この問題を検証するために,私はそれぞれこの2つの方法について実験を行った.
    コード量を減らすために,モデルの誤り率を評価するための関数を定義した.
    def get_score(X_train, y_train):
        ridge_score = np.sqrt(-cross_val_score(ridge, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
        return np.mean(ridge_score)

    前日のすべてのデータをトレーニングセットとして使用
    y_train = data1['close'].values[1:]
    X_train = data1.values[:-1]
    score = get_score(X_train, y_train)

    出力結果は約0.469であり,この誤り率は比較的大きく,不合理であり,さらに他の特徴値をテストデータとして予測する必要がある.
    当日close以外のデータでトレーニングセットとして使用
    data2 = data1[:]
    y_train = data2.pop('close').values
    X_train = data2.values
    score = get_score(X_train, y_train)

    出力結果は約0.183で、1つ目に比べてかなりよくなりました.だから、君だと决めたんだ!
    次にモデリングしてモデルを保存します.
    y_train = data1['close']
    X_train = data1[['open', 'high', 'low', 'ma5']]
    close_model = ridge.fit(X_train, y_train)
    joblib.dump(ridge, 'close_model.m')

    予測する前に、トレーニングセットの後8組のデータをテストして、図を作ってみましょう.
    scores = []
    for x in X_train[-8:]:
        score = close_model.predict(np.array(x).reshape(1, -1))
        scores.append(score)
    x = np.arange(8)
    fig, axes = plt.subplots(1, 1, figsize=(13, 6))
    axes.plot(scores)
    axes.plot(y_train[-8:])
    plt.xticks(x, data1.index[-8:].values, size=13, rotation=0)

    これを見ると比較的安心ですが、このモデルの訓練値はclose以外の属性が既知で、3日後を予測するには2日前のテスト値を予測しなければなりません.
    def get_model(s):
        y_train = data1[s].values[1:]
        X_train = data1.values[:-1]
        model = ridge.fit(X_train, y_train)
        return model
    def get_results(X_test):
        attrs = ['open', 'high', 'low', 'ma5']
        results = []
        for attr in attrs:
            result = get_model(attr).predict(X_test)
            results.append(result)
        return results

    次の3日間の株価を予測します.
    X_test = data1[-1:].values
    for i in range(3):
        results = get_results(X_test)
        close = close_model.predict(np.array(results).reshape(1, -1))
        print(close)
        results.append(close)
        X_test = np.array(results).reshape(1, -1)
    print("5 15            :" + str(round(close[0], 2)))

    出力結果:
    [33.46370029][33.4532047][33.43836721]
    5月15日に招商銀行が閉鎖された時の株価は:33.44だった.
    まとめ
    予測結果はそうでしたが、予測はなかなかの料理だったような気がします.結局予測の各値には偏差があり、複数の偏差が加算されると多くなり、少し怖くなります.他の値を予測せずにcloseを直接予測する方法が存在するか、あるいは13、14番を先に予測することなく5月15日を直接予測する方法が存在するかどうかは分からない.時間系列アルゴリズムというアルゴリズムがあるのは知っていますが、よくわかりません.どの大神が私にいくつかのアドバイスをしてくれることを望んで、道に迷っています.
    データ分析を独学で学ぶ在学生にとって、プロジェクトの経験がないことに苦しみ、ちょうど今回の「データゲーム」に間に合い、今回の機会を利用して操作することができて本当によかったです.学ぶこともできるし、勝つと賞品ももらえる.
    Ad Time
    より多くのデータ科学の知識を学ぶには、微信の公衆番号:read_に注目してください.csv
    データ科学活動に参加するにはQQ群を加えてください:759677734