Python數據分析之亞馬遜股價

今天用Python簡單分析一下亞馬遜上市至今的股價,沒有太多實質性的東西,但學學技術還能夠。主要包括下面幾個方面:python

  1. 畫股價走勢圖
  2. 計算年度收益率
  3. 用股價擬合多項式曲線並預測股價
  4. 畫K線圖

首先,導入模塊markdown

import pandas as pd
import matplotlib.pylab as plt
import numpy as np
# 繪圖顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
複製代碼

讀入文件,預覽數據app

data = pd.read_csv('./data/Amazon.csv')
data
複製代碼

數據包含亞馬遜1997年5月到今年7月底的股價,共5842條。echarts

來看看上市至今的股價走勢機器學習

# 總體走勢
data.plot(x='Date', y='Close', rot=30, figsize=(15, 8), title='amazon股價')
複製代碼

這個漲勢太厲害了,上市至今暴漲了1600倍。ide

再來看看每一年的收益率,先增長年份列,而後按照該列分組,用當年的第一天和最後一天的收盤價計算漲跌幅。函數

# 計算每一年收益率
data['year'] = data['Date'].apply(lambda x: x[:4])

def get_rate_of_change(group):
    price1 = group.sort_values(by='Date')[:1]['Close']
    price2 = group.sort_values(by='Date', ascending=False)[:1]['Close']
    
    return (price2.values[0] / price1.values[0] - 1) * 100

data.groupby('year').apply(get_rate_of_change).plot(kind='bar', rot=30, figsize=(15, 8), title='每一年收益率')
複製代碼

大部分年份都是上漲的,尤爲是上市後的第二年漲了將近10倍。固然也有些年份是跌的,只要長期持有都會轉正,但前提得是好股票。學習

既然股票收益率能達到如此高,那麼有沒有可能經過歷史股價的走勢來預測將來股價呢?下面咱們就將2020年以前的股價做爲樣本,擬合一個多項式函數,來預測2020年的股價,看看跟實際的差別。ui

咱們先在數據集上增長一列,做爲自變量x,收盤價Close列做爲因變量yspa

# 計算Date列與1997-05-15相差的天數,做爲自變量x
from datetime import datetime

start_date = datetime(1997, 5, 15)
def get_Date_diff(date1):
    date1_arr = date1.split('-')
    cur_date = datetime(int(date1_arr[0]), int(date1_arr[1]), int(date1_arr[2]))
    
    return (cur_date - start_date).days

data['day'] = data['Date'].apply(get_Date_diff)

# 2020年以前的做爲擬合的樣本
data_before_2020 = data[data['Date'] < '2020-01-01']

data_2020 = data[data['Date'] >= '2020-01-01']
複製代碼

有了樣本後,咱們用numpy模塊的polyval函數進行擬合

# 對2020年以前的股價進行多項式擬合
x = data_before_2020['day'].values
y = data_before_2020['Close'].values
# 擬合
reg = np.polyfit(x, y, deg=15)
# 計算擬合後的值
y_predict = np.polyval(reg, x)
複製代碼

參數deg表明多項式的次數,若是是deg=2,最終擬合的多項式函數就是y = a*x^2 + b*x + c,函數返回值reg就是係數abc。上述代碼裏deg=15,說明擬合了一個15次多項式函數,次數越高擬合的結果越接近樣本,固然要注意過擬合。

np.polyval函數能夠根據給定的多項式係數和自變量x計算因變量y,即:預測值。

下面咱們將實際股價和預測股價畫在同一個圖裏來觀察擬合的效果

plt.figure(figsize=(15, 8))
plt.plot(x, y, 'b')
plt.plot(x, y_predict, 'r.')
plt.xlabel('日期')
plt.ylabel('股價')
plt.show()
複製代碼

效果看起來還湊合,咱們就能夠用這個多項式來預測2020年股價

# 使用以前擬合的多項式預測2020年股價
x_2020 = data_2020['day'].values
y_2020 = data_2020['Close'].values
y_predict_2020 = np.polyval(reg, x_2020)

plt.figure(figsize=(15, 8))
plt.plot(x_2020, y_2020, 'b')
plt.plot(x_2020, y_predict_2020, 'r.')
plt.xlabel('日期')
plt.ylabel('股價')
plt.show()
複製代碼

能夠看到,圖的右半部分預測股價(紅色虛線)明顯高於實際股價(藍線),這種方式預測股價仍是不靠譜的。由於該方式只用了價格這一個因素,而影響股價的因素特別多,所以拋開其餘因素單純看股票價格的波動是沒有規律的。

固然咱們能夠考慮一些優秀的機器學習模型或者深度學習模型來進行預測,但我以爲精確到天級的預測難度很大,而且意義也不大。但咱們能夠將問題簡化爲預測趨勢,或者將預測結果做爲一個信息輔助人來作判斷。

進行到這裏貌似還不太過癮,那就畫個K線圖吧,說不定之後能用上。

# 畫K線圖
from pyecharts import options as opts
from pyecharts.charts import Kline, Line

def calculate_ma(day_count: int, prices):
    result: List[Union[float, str]] = []

    for i in range(len(prices)):
        if i < day_count:
            result.append("-")
            continue
        sum_total = 0.0
        for j in range(day_count):
            sum_total += float(prices[i - j][1])
        result.append(abs(float("%.2f" % (sum_total / day_count))))
    return result

x = data_2020['Date'].values.tolist()
y = data_2020[['Open', 'Close', 'Low', 'High']].values.tolist()


kline = (
    Kline()
    .add_xaxis(x)
    .add_yaxis(
        "kline",
        y,
        itemstyle_opts=opts.ItemStyleOpts(
            color="#ec0000",
            color0="#00da3c",
            border_color="#8A0000",
            border_color0="#008F28",
        ),
    )
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True),
        yaxis_opts=opts.AxisOpts(
            is_scale=True,
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        ),
        datazoom_opts=[opts.DataZoomOpts(type_="inside")],
        title_opts=opts.TitleOpts(title="2020年K線圖"),
    )
)

kline_line = (
    Line()
    .add_xaxis(x)
    .add_yaxis(
        series_name="MA5",
        y_axis=calculate_ma(5, y),
        is_smooth=True,
        linestyle_opts=opts.LineStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(
            type_="category",
            grid_index=1,
            axislabel_opts=opts.LabelOpts(is_show=False),
        ),
        yaxis_opts=opts.AxisOpts(
            grid_index=1,
            split_number=3,
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axistick_opts=opts.AxisTickOpts(is_show=False),
            splitline_opts=opts.SplitLineOpts(is_show=False),
            axislabel_opts=opts.LabelOpts(is_show=True),
        ),
    )
)
# Overlap Kline + Line
overlap_kline_line = kline.overlap(kline_line)

overlap_kline_line.render_notebook()
複製代碼

這裏只用了2020年的數據進行繪製,看起來還像是那麼回事。這個圖包含兩部分,一部分是單純調用Kline繪製的K線圖,另外一部分是調用Line繪製了一個折線圖,它的y座標調用calculate_ma函數,計算5日平均收盤價。最後調用overlap_kline_line = kline.overlap(kline_line)將兩者合併在一塊兒。

個人分析就到這裏了,感興趣的朋友能夠自行分析。公衆號回覆關鍵字亞馬遜股價獲取數據和源碼。

歡迎公衆號 「渡碼」

相關文章
相關標籤/搜索