Python ガウス基底関数フィッティング

豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルまとめ

ここまで、豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルについていろいろと説明してきました。
まとめると以下のようになります。


  #!/usr/bin/python3
  # -*- coding: utf-8 -*-

  import datetime
  def addBusinessDays(from_date, add_days):
    cur_date8 = [] # 21/03/30
    cur_date4 = [] # 3/30
    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
      current_date += datetime.timedelta(days=1)
      weekday = current_date.weekday()
      if weekday >= 5: # sunday = 6
        continue
      #土日は以下はスキップ
      # 年/月/日として文字列にする
      #例 21/03/30      
      e11 = current_date.strftime("%y/%m/%d")
      e22 = e11.replace("/0", "/")
      e33 = e22[3:] # 21/ 削除
      cur_date8.append(e22)
      cur_date4.append(e33)
      business_days_to_add -= 1
    return cur_date8, cur_date4

  import pandas as pd
  import numpy as np
  from datetime import datetime as dt
  import matplotlib.pyplot as plt
  from mplfinance.original_flavor import candlestick_ohlc

  #ガウス関数定義
  def gauss(x, mu, s):
    return np.exp(-(x - mu)**2 / (2 * s**2))
  """
  線形基底関数モデル ----------------
  y(x,w) = w0Φo(x) + w1Φ1(x) + w2Φ2(x) + w3
  なら len(w) = 4 ∴ m = 3
  mu = np.linspace(0, xx, m)
  s = mu[1] - mu[0]
  s は隣り合ったガウス関数の中心間の距離
  設計者が決定
  s と mu の値は w 同様あらかじめ
  線形基底関数モデル厳密解
  で計算しておく
  """   
  def gauss_func(w, x):
    # m = len(w) - 1
    # xx = len(x) - 1
    y = np.zeros_like(x)     # x と同じサイズで要素が 0 の行列 y を作成
    for j in range(m):
      y = y + w[j] * gauss(x, mu[j], s)
    y = y + w[m]
    return y

  # 線形基底関数モデル 厳密解 -----------------
  def fit_gauss_func(x, t, m):
    x1 = len(x) - 1
    mu = np.linspace(0, x1, m)
    s = mu[1] - mu[0]
    n = x.shape[0]
    psi = np.ones((n, m+1))
    for j in range(m):
      psi[:, j] = gauss(x, mu[j], s)
    psi_T = np.transpose(psi)
    
  b = np.linalg.inv(psi_T.dot(psi))
  c = b.dot(psi_T)
  w = c.dot(t)
  return w, mu, s, m

  # np.dot(A, B) と A.dot(B) は同じ

  def min_max(xx, axis = None): # 配列の軸方向は考えない
    min = xx.min(axis=axis,keepdims=True) # 次元は減らさない
    max = xx.max(axis=axis,keepdims=True)
    result = (xx-min)/(max-min)
    return result, min ,max

  # Start

  xl_df = pd.read_csv("/home/yamada/public_html/manep/mane_chart_go.csv", encoding="cp932")

  Open = xl_df["始値(売り)"].values
  High = xl_df["高値(売り)"].values
  Low = xl_df["安値(売り)"].values
  Date = xl_df["日付"].values
  Idx = xl_df.index
  tstr = Date[-1]

  tdatetime = dt.strptime(tstr, '%Y/%m/%d %H:%M:%S')
  # 文字列をdatetimeに変換するのがstrptime()関数
  # datetime.datetime.strptime(文字列, 書式指定文字列)
  lastday = addBusinessDays(tdatetime, 5)

  xDate = []
  xD = []
  for i, key in enumerate(Date):
    if(i % 10 == 0):
      e4 = str(key)[4:10]
      e6 = e4.replace("/0", "/")
      e8 = e6.lstrip("/")   
      xDate.append(e8)
      xD.append(i)

  xDate.append(lastday[1][4])
  xD.append(i + 5)

  Close0 = xl_df["終値(売り)"].values

  Close1,Close1_min,Close1_max = min_max(Close0)
  # Close1=正規化値
  # 最安値(Close1_min)
  # 最高値(Close1_max)
  app = Close1[-1:]
  app1 = np.hstack((app, app, app, app, app))
  Close2 = np.hstack((Close1, app1))

  # メイン ----------------------------------

  M = 12
  Idx5 = Idx[-5:] + 5
  X = np.hstack((Idx, Idx5))
  W, mu, s, m = fit_gauss_func(Idx, Close1, M)
  y = gauss_func(W, X)
  val_ch = y * (Close1_max - Close1_min) + Close1_min

  ohlc = zip(
   Idx, Open, High, Low, Close0)

  fig = plt.figure(
   figsize=(8.34, 5.56))

  # python スクリプトと Jupyter とでは、
  # matplotlib の図のサイズが違うので注意
  ax = fig.add_subplot(1,1,1)
  ax.grid()

  # GAUSS 解析結果表示
  plt.plot(
   Idx, val_ch[:-5],
   Idx5, val_ch[-5:], 'bo')
  # ----------------
  candlestick_ohlc(
   ax, ohlc, width=0.5, alpha = 1,
   colorup='r', colordown='g')
  plt.xticks(xD, xDate)
  plt.title('AUS$ / JPY chart')
  plt.xlabel('Date')
  plt.ylabel('Yen')
  # plt.show()
  plt.savefig(
   '/home/yamada/public_html/manep-img/mane_chart_go-gau.png')

  print("予測値=最終日+1~+5日")
  valhe = np.round(val_ch[-5:], 3)#3桁まで表示
  valhe_pd = pd.DataFrame(valhe)
  # pandas concat 関数で横(列)方向へ連結する、axis=1 を忘れないこと
  lastday_pd = pd.DataFrame(lastday[0])
  df_concat = pd.concat([lastday_pd, valhe_pd], axis = 1)
  print(df_concat)
  df_concat.to_csv(
   '/home/yamada/public_html/manep-img/mane_chart_go-gau.csv',
   header=False, index=False)   

ここまでで、豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルがまとまりました。
引き続きこのファイルの動作確認をしていきます。


  • 豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイル作成 に進む
  • 豪ドル/円チャ-トロ-ソク足表示 gauss/fit に戻る
  • ガウス基底関数フィッティング準備-2 に戻る
  • 線形基底関数モデル厳密解 に戻る
  • Python ガウス基底関数フィッティング概要 に戻る
  • マネパ CSV ダウンロードファイル作成 に戻る
  • 70VPS に戻る