量化編程技術—matplotlib與可視化

import matplotlib.pyplot as plt
import numpy as np
 
from mpl_toolkits.mplot3d import Axes3D
 
np.random.seed(42)
 
# 採樣個數500
n_samples = 500
dim = 3
 
# 先生成一組3維正態分佈數據,數據方向徹底隨機
samples = np.random.multivariate_normal(
    np.zeros(dim),
    np.eye(dim),
    n_samples
)
 
# 經過把每一個樣本到原點距離和均勻分佈吻合獲得球體內均勻分佈的樣本
for i in range(samples.shape[0]):
    r = np.power(np.random.random(), 1.0/3.0)
    samples[i] *= r / np.linalg.norm(samples[i])
 
upper_samples = []
lower_samples = []
 
for x, y, z in samples:
    # 3x+2y-z=1做爲判別平面
    if z > 3*x + 2*y - 1:
        upper_samples.append((x, y, z))
    else:
        lower_samples.append((x, y, z))
 
fig = plt.figure('3D scatter plot')
ax = fig.add_subplot(111, projection='3d')
 
uppers = np.array(upper_samples)
lowers = np.array(lower_samples)
 
# 用不一樣顏色不一樣形狀的圖標表示平面上下的樣本
# 判別平面上半部分爲紅色圓點,下半部分爲綠色三角
ax.scatter(uppers[:, 0], uppers[:, 1], uppers[:, 2], c='r', marker='o')
ax.scatter(lowers[:, 0], lowers[:, 1], lowers[:, 2], c='g', marker='^')
 
plt.show()

 

 

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings("ignore")

import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import rc
from matplotlib.pylab import date2num
from datetime import datetime, timedelta

# 示例序列
demo_list = np.array([2, 4, 16, 20])
# 以三天爲週期計算波動
demo_window = 3
std = pd.rolling_std(demo_list, window=demo_window, center=False) * np.sqrt(demo_window)
print(std)


today = datetime.now().strftime('%Y-%m-%d')
before = (datetime.now() - timedelta(days = 120)).strftime('%Y-%m-%d') #120天然日,大概80個交易日

#獲取行情數據,格式: pandas.core.frame.DataFrame
code = '000063'
tsla_df = ts.get_k_data(code, start = before, end = today)


tsla_df_copy = tsla_df.copy()
# 投資回報
tsla_df_copy['return'] = np.log(tsla_df['close'] / tsla_df['close'].shift(1))

# 移動收益標準差
tsla_df_copy['mov_std'] = pd.rolling_std(tsla_df_copy['return'],
                                         window=20,
                                         center=False) * np.sqrt(20)
# 加權移動收益標準差,與移動收益標準差基本相同,只不過根據時間權重計算std
tsla_df_copy['std_ewm'] = pd.ewmstd(tsla_df_copy['return'], span=20,
                                    min_periods=20,
                                    adjust=True) * np.sqrt(20)

tsla_df_copy[['close', 'mov_std', 'std_ewm', 'return']].plot(subplots=True, grid=True);

 

 

import numpy as np
import pandas as pd

import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import rc
from matplotlib.pylab import date2num
from datetime import datetime, timedelta

today = datetime.now().strftime('%Y-%m-%d')
before = (datetime.now() - timedelta(days = 120)).strftime('%Y-%m-%d') #120天然日,大概80個交易日

#獲取行情數據,格式: pandas.core.frame.DataFrame
code = '000063'
tsla_df = ts.get_k_data(code, start = before, end = today)

tsla_df.close.plot()
# ma 30
# pd.rolling_mean(tsla_df.close, window=30).plot()
pd.rolling_mean(tsla_df.close, window=30).plot()
# ma 60
# pd.rolling_mean(tsla_df.close, window=60).plot()
pd.rolling_mean(tsla_df.close, window=60).plot()
# ma 90
# pd.rolling_mean(tsla_df.close, window=90).plot()
pd.rolling_mean(tsla_df.close, window=90).plot()
# loc='best'即自動尋找適合的位置
plt.legend(['close', '30 mv', '60 mv', '90 mv'], loc='best');

 

 

import warnings
warnings.filterwarnings("ignore")

import numpy as np
import pandas as pd

import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import rc
from matplotlib.pylab import date2num
from datetime import datetime, timedelta

today = datetime.now().strftime('%Y-%m-%d')
before = (datetime.now() - timedelta(days = 120)).strftime('%Y-%m-%d') #120天然日,大概80個交易日


code = '000063'
tsla_df = ts.get_k_data(code, start = before, end = today)  #獲取行情數據,格式: pandas.core.frame.DataFrame
# tsla_df = ts.get_hist_data(code, start = before, end = today)


def plot_trade(buy_date, sell_date):
    # 找出2014-07-28對應時間序列中的index做爲start
    start = tsla_df[tsla_df.index == buy_date].key.values[0]
    # 找出2014-09-05對應時間序列中的index做爲end
    end = tsla_df[tsla_df.index == sell_date].key.values[0]
    
    # 使用5.1.1封裝的繪製tsla收盤價格時間序列函數plot_demo
    # just_series=True, 即只繪製一條曲線使用series數據
    plot_demo(just_series=True)

    # 將整個時間序列都填充一個底色blue,注意透明度alpha=0.08是爲了
    # 以後標註其餘區間透明度高於0.08就能夠清楚顯示
    plt.fill_between(tsla_df.index, 0, tsla_df['close'], color='blue',
                     alpha=.08)

    # 標註股票持有周期綠色,使用start和end切片週期
    # 透明度alpha=0.38 > 0.08
    plt.fill_between(tsla_df.index[start:end], 0,
                     tsla_df['close'][start:end], color='green',
                     alpha=.38)
    
    # 設置y軸的顯示範圍,若是不設置ylim,將從0開始做爲起點顯示,效果很差
    plt.ylim(np.min(tsla_df['close']) - 5,
             np.max(tsla_df['close']) + 5)
    # 使用loc='best'
    plt.legend(['close'], loc='best')

# 標註交易區間2014-07-28到2014-09-05, 圖5-12所示
plot_trade('2018-01-01', '2018-01-30')

 

 

import warnings
warnings.filterwarnings("ignore")

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


import tushare as ts
from datetime import datetime, timedelta

today = datetime.now().strftime('%Y-%m-%d')
before = (datetime.now() - timedelta(days = 240)).strftime('%Y-%m-%d') #120天然日,大概80個交易日

tsla_df = ts.get_k_data("000063", start = before, end = today)  #獲取行情數據,格式: pandas.core.frame.DataFrame
goog_df = ts.get_k_data("600036", start = before, end = today)
appl_df = ts.get_k_data("000001", start = before, end = today)


def plot_two_stock(tsla, goog, appl, axs=None):
    # 若是有傳遞子畫布,使用子畫布,不然plt
    drawer = plt if axs is None else axs
    drawer.plot(tsla, c='r')
    drawer.plot(goog, c='g')
    drawer.plot(appl, c='b')
    drawer.grid(True)   # 顯示網格
    drawer.legend(['tsla', 'google','apple'], loc='best')   # 圖例標註


plot_two_stock(tsla_df.close, goog_df.close, appl_df.close)
plt.title('TSLA and Google CLOSE')
plt.xlabel('time')  # x軸時間
plt.ylabel('close') # y軸收盤價格

 

 

import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
from matplotlib import rc
from matplotlib.pylab import date2num
from datetime import datetime, timedelta

today = datetime.now().strftime('%Y-%m-%d')
before = (datetime.now() - timedelta(days = 90)).strftime('%Y-%m-%d') #120天然日,大概80個交易日

#獲取行情數據,格式: pandas.core.frame.DataFrame
code = '000063'
tsla_df = ts.get_k_data(code, start = before, end = today)
# print(tsla_df)

'''
蠟燭圖的日期,不支持普通的YYYY-MM-DD格式
要使用matplotlib.finance.date2num進行轉換爲特有的數字值
'''
qutotes = []
for _, (d, o, c, h, l) in enumerate(
        zip(tsla_df.date, tsla_df.open, tsla_df.close, tsla_df.high, tsla_df.low)):
    d = mpf.date2num(datetime.strptime(d,'%Y-%m-%d'))
    # 日期,開盤,收盤,最高,最低組成tuple對象val
    val = (d, o, h, l, c)
    # 加val加入qutotes
    qutotes.append(val)



fig, ax = plt.subplots(figsize=(15,5))      #設置圖片大小
fig.subplots_adjust(bottom=0.5)             #調整畫框的位置,用來消除白邊

ax.xaxis_date()                             # X軸的刻度爲日期
plt.xticks(rotation=45)                     # 設置日期刻度旋轉的角度 
plt.title(code)                         # 設置圖片標題
plt.xlabel('Date')                          # 設置X軸標題
plt.ylabel('Price')                         # 設置Y軸標題
plt.grid(True)                              # 顯示網格

mpf.candlestick_ohlc(ax, qutotes, width=0.6, colorup='g', colordown='r', alpha=1.0)
plt.show()
相關文章
相關標籤/搜索