2024-12-31

【備忘録】Excel VBA で Parabolic SAR を算出

VBA, Visual Basic for Applications は、マイクロソフト社が Microsoft Visual Basic を、同社製品の Microsoft Office に搭載したものです。VBA を使用することで、Excel、Access、Word、Outlook、PowerPoint など、Office のアプリケーション・ソフトウェアの機能をカスタマイズしたり、拡張したりすることができます。

Wikipedia より引用、編集

Excel 上で利用する楽天証券のトレーディング・ツール「マーケットスピード II RSS [1]」(以下 RSS と呼びます)で、デイトレを自動化すべく日々取り組んでいます。RSS には売買機能の API が用意されているので、これを利用することが自動取引を実現する近道と言えます。そのために VBA を使いこなす必要が出てきました。

まずは VBA マクロで1秒間隔のタイマーを回して現在株価を RSS の関数が出力したセルから取得。さらに RSS の API がどんどん Excel に書き込んでくれる OHLC(四本値)データに対して Parabolic SAR を中心としたテクニカル指標を動的に適用して売買判断をさせようとしています。

Parabolic SAR(以下 PSAR と呼びます)の情報は RSS からは得られないので、VBA マクロで算出する必要があります。とりあえずやっつけで用意した PSAR のマクロで今月 12 月からリアルタイムにシミュレーションを重ねてきました。

12 月 30 日の大納会を終え、来年の大発会は 1 月 6 日と長い休みになるので、この間に、やっつけで作った PSAR のマクロを見直すことにしました。

下記の OS 環境で動作確認をしています。

Microsoft Windows 11 Home 24H2
Microsoft Excel 2024 MSO 64 ビット

Excel で Parabolic SAR を算出

まず、参考サイト [2] で紹介されていた Excel で PSAR を算出する方法を試してから、このやり方に沿ってやっつけでマクロ化しました。保守のしやすさよりも、とにかく動作させることを優先させたので、直接、何度もセルへアクセスして読み書きをしていました。どうせ一行ずつ算出するのだから、そんなに計算負荷はないだろうとみていました。

VBA でのアプローチ

PSAR を算出するマクロを見直すにあたって、多くのサイトで紹介されているように配列を使って高速化するのが妥当だと思い、検討を始めました。しかし、参考サイト [3] を読んで気が変わりました。Range オブジェクト(変数)を Parabolic SAR を処理するマクロへ参照渡しすれば、変数に関わる処理がシンプルになると考えたからです。

すなわち、下記の赤い領域に新しい PSAR の値 (TREND, EP, AF, PSAR) を算出して書き込むために、赤い領域を含む灰色の領域を PSAR を処理するマクロへ渡します。これだけの領域があれば(使わないセルもありますが)、新しい PSAR を算出できるからです。

PSAR を算出するマクロへ渡す Range

VBAProjects の標準モジュール内に ModPSAR というモジュールを挿入し、2つのマクロ calc_PSAR_1(最初の行の計算用)と calc_PSAR_2(その他の行の計算用)を作りました。

以下が、Range オブジェクト渡しに改善した PSAR を算出するコードです。

標準モジュール ModPSAR
Option Explicit

' Column information
Private Const P_HIGH As Integer = 1
Private Const P_LOW As Integer = 2
Private Const P_CLOSE As Integer = 3

Private Const TREND As Integer = 5
Private Const EP As Integer = 6
Private Const AF As Integer = 7
Private Const PSAR As Integer = 8

' Parameters for Parabolic SAR
Private Const AF_INIT As Double = 0.02
Private Const AF_STEP As Double = 0.02
Private Const AF_MAX As Double = 0.2


'
' PSAR calculation for the 1st row of data
'
Sub calc_PSAR_1(ByRef rng As Range)
    
    
    ' TREND
    If rng(2, P_CLOSE).Value > rng(1, P_CLOSE).Value Then
        rng(2, TREND).Value = 1
    Else
        rng(2, TREND).Value = -1
    End If
    
    ' EP, the extreme point
    If rng(2, TREND).Value = 1 Then
        rng(2, EP).Value = rng(2, P_HIGH).Value
    Else
        rng(2, EP).Value = rng(2, P_LOW).Value
    End If
    
    ' AF, the acceleration factor
    rng(2, AF).Value = AF_INIT
    
    ' PSAR
    If rng(2, TREND).Value = 1 Then
        rng(2, PSAR).Value = rng(2, P_HIGH).Value
    Else
        rng(2, PSAR).Value = rng(2, P_LOW).Value
    End If
    
End Sub


'
' Parabolic SAR calculation for row of data other than the 1st row
'
Sub calc_PSAR_2(ByRef rng As Range)
    
    ' TREND
    If rng(1, TREND) = 1 Then
        If rng(1, PSAR).Value > rng(2, P_LOW).Value Then
            rng(2, TREND).Value = -1
        Else
            rng(2, TREND).Value = 1
        End If
    Else
        If rng(1, PSAR).Value < rng(2, P_HIGH).Value Then
            rng(2, TREND).Value = 1
        Else
            rng(2, TREND).Value = -1
        End If
    End If
    
    ' EP, the extreme point
    If rng(2, TREND).Value = 1 Then
        If rng(1, PSAR).Value > rng(2, P_LOW).Value Then
            rng(2, EP).Value = rng(2, P_LOW).Value
        ElseIf rng(2, P_HIGH).Value > rng(1, EP).Value Then
            rng(2, EP).Value = rng(2, P_HIGH).Value
        Else
            rng(2, EP).Value = rng(1, EP).Value
        End If
    Else
        If rng(1, PSAR).Value < rng(2, P_HIGH).Value Then
            rng(2, EP).Value = rng(2, P_HIGH).Value
        ElseIf rng(2, P_LOW).Value < rng(1, EP).Value Then
            rng(2, EP).Value = rng(2, P_LOW).Value
        Else
            rng(2, EP).Value = rng(1, EP).Value
        End If
    End If
    
    ' AF, the acceleration factor
    If rng(2, TREND).Value <> rng(1, TREND).Value Then
        rng(2, AF).Value = AF_INIT
    Else
        If rng(2, EP).Value <> rng(1, EP).Value And rng(1, AF).Value < AF_MAX Then
            rng(2, AF).Value = rng(1, AF).Value + AF_STEP
        Else
            rng(2, AF).Value = rng(1, AF).Value
        End If
    End If
    
    ' PSAR
    If rng(2, TREND).Value = rng(1, TREND).Value Then
        rng(2, PSAR).Value = rng(1, PSAR).Value + rng(2, AF).Value * (rng(2, EP).Value - rng(1, PSAR).Value)
    Else
        rng(2, PSAR).Value = rng(1, EP).Value
    End If
    
End Sub

エラーが出なかったの気がつきませんでしたが、本ブログにまとめている際に、rng(2, TREND).Value のように .Value を付けるのを忘れていたことに気がつきました。慣れないことをするとミスがでるものです。これでも意図した通りに動いているようですが、オブジェクトを直接比較したりスカラーを代入するのはなんだか変なので後で修正する予定です(年末で既に酒を飲んでいるので、まともに修正できる自信がありません🙇🏻)。 修正しました。[2025-01-01]

動作確認

下記のワークシートのマクロで動作確認をしました。

Sheet1 のマクロ TestPSAR
' Column information
Private Const P_HIGH As Integer = 7
Private Const PSAR As Integer = 14


'
' Parabolic SAR のテスト
'
Sub TestPSAR()
    Dim i As Integer
    Dim row_1 As Integer
    Dim range_PSAR As Range
    
    row_1 = 3
    For i = row_1 To row_1 + 323
        Set range_PSAR = Range(Cells(i, P_HIGH), Cells(i + 1, PSAR))
        If i = row_1 Then
            Call calc_PSAR_1(range_PSAR)
        Else
            Call calc_PSAR_2(range_PSAR)
        End If
    Next i
    
End Sub
OHLC データに対して PSAR を一括算出した例(15:23 まで)

ベンチマーク

念のため、ベンチマークを計測しました。100 回算出した平均値を出力しています。

Sheet1 のマクロ Benchmark
'
' ベンチマーク
'
Sub Benchmark()
    Const REPEAT_MAX As Integer = 100
    Dim i As Integer
    Dim timeStart As Double
    Dim timeEnd As Double

    timeStart = Timer
    Do While i < REPEAT_MAX
        Call TestPSAR
        i = i + 1
    Loop
    timeEnd = Timer

    Debug.Print (timeEnd - timeStart) / REPEAT_MAX
End Sub
0.18548828125 

約 0.185 秒かかっていますが、実際には、1秒間隔でタイマーを回して実行する処理において、追加された OHLC データ行に対して PSAR を算出するという使い方になります。

このサンプルの場合は 323 行の PSAR を計算しているので、一行あたりの処理時間は約 0.000574 秒になります。感覚的には十分小さいように思えますが、これを基準にして、まだ改善できる余地があるのかひきつづき探求します。

サンプルシート

以上のコード、シートを含む Excel ファイルを下記からダウンロードできます。ご参考まで。

sample_psar.xlsm

参考サイト

  1. マーケットスピード II RSS | 楽天証券のトレーディングツール
  2. Parabolic SAR(パラボリック)計算  Excelでテクニカル計算 [2011-03-03]
  3. Office TANAKA - Excel VBA Tips[セル範囲を変数に入れるということ]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2024-12-28

【備忘録】改行しない標準出力

JupyterLab は、ノートブック、コード、データのための最新のウェブベースのインタラクティブな開発環境です。その柔軟なインターフェースにより、ユーザーはデータサイエンス、科学計算、計算報道学、機械学習におけるワークフローを設定し、アレンジすることができます。モジュール式の設計により、機能の拡張や充実が可能です。

Project Jupyter のサイトより引用・翻訳

JupyterLab に限ったことではなく、Python の標準出力でも同じことなのですが、GUI を作らずに Python だけで動作確認をする時は、ほぼ間違いなく Jupyter Lab 上で作業をするので、Jupyter Lab の話題として扱いました。

時間が掛かる処理をする時、進捗を表示するのに一定の間隔でフツーに print 関数で標準出力すると何行も出力されてしまって煩わしくなります。改行せずに重ねて同じ行に進捗率を表示するだけの方法を紹介します。

下記の OS 環境で動作確認をしています。

Fedora Linux Workstation 41 x86_64
Python 3.13.1
jupyterlab 4.3.4

簡単なサンプルを以下に示しました。行末から行頭に戻す「復帰コード」の \r を利用しています。

from sys import stdout
import time

max = 100
for i in range(max):
    time.sleep(0.1)

    stdout.write(f'\r{(i + 1.0) / max:>6.1%} 終了しました。')
    stdout.flush()

# 最後に改行
print()
100.0% 終了しました。

このサンプルでは time.sleep(0.1) をダミーに入れていますが、そうでない場合では、Python 処理が意外と早いので、短時間に多くの出力をしてしまうと、JupyterLab は下記のようなメッセージを表示する場合があります。デフォルトでは1秒間に 1,000 までのメッセージ出力が上限のようです。

IOPub message rate exceeded.
The Jupyter server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--ServerApp.iopub_msg_rate_limit`.

Current values:
ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
ServerApp.rate_limit_window=3.0 (secs)

参考サイト

  1. io --- ストリームを扱うコアツール — Python 3.13.1 ドキュメント

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2024-12-26

【備忘録】Anthy の辞書に単語登録

Anthy は、LGPL でライセンスされたフリーな日本語入力システムです。2000 年 5 月に京都大学を中心に活動しているコンピュータサークルである京大マイコンクラブ内の Project Heke で開発が始まりました。2021 年に Anthy Unicode という開発プロジェクトが Anthy プロジェクトを引き継いでいます。

Wikipedia より引用・編集

メインで使用している Fedora Linux は、日本語入力システムに Anthy を採用しています。漢字変換に関しては Mozc の方が使いやすかったので、以前は ibus-mozc をインストールして利用していましたが、Fedora Linux のクリーンインストールを重ねるにつれて、わざわざ Mozc をインストールして設定を変更することが面倒になり、今では Anthy をそのまま利用するようになってしまいました。

Anthy を使っていると、漢字や文節の変換はあいかわらずおバカだなあと思うことが多いのですが、こまめに固有名詞を辞書に登録すれば、少しは変換作業のストレスが軽減するかもしれないと期待して、あらためて固有名詞などを辞書に登録するやり方を確認しました。

下記の OS 環境で動作確認をしています。Anthy による日本語入力ができるようになっているものとします。

Fedora Linux Workstation 41 x86_64

GNOME デスクトップの上部右側のステータスメニューにある「」あるいは「_A」をマウスでクリックすると、メニューがポップアップされますので、「設定 - Anthy」を選択します。

GNOME シェルのステータスメニュー

すると「IBus-Anthyの設定」ウィンドウが表示されます。「辞書」タブをクリックして、「単語の追加コマンド(A)」の右側にある ... をクリックします。

「IBus-Anthyの設定」ウィンドウ

すると、さらに「霞 (単語登録)」のウィンドウが表示されます。「霞(かすみ)」は Anthy の個人辞書管理ツールです。

辞書に単語を追加する「霞 (単語登録)」のウィンドウ

辞書に追加したい単語(漢字)、読みを入力、品詞品詞の細分類を選択して、追加(A) ボタンをクリックすると辞書に追加され、霞のウィンドウが閉じます。

端末エミュレータから下記のように kasumi-unicode -a とタイプしても「霞 (単語登録)」のウィンドウを表示することができます。

端末エミュレータからコマンドで霞(かすみ)を起動

ちなみに kasumi-unicode コマンドのオプションは下記のようになっています。

bitwalk@fedora:~$ kasumi-unicode -h
Usage: kasumi [option]
Option:
  -h --help        Show this message.
  -v --version     Show Kasumi's version and copyright
                   information
  -m --manage      Run Kasumi in Manage mode.
                   You may abbreviate this option.
  -a --add         Run Kasumi in Add mode.
  -e --exclusive   Run Kasumi in Exclusive mode.
  --sound val      Set default sound entry (only in Add mode)
  --spelling val   Set default spelling entry (only in Add mode)
  --wordclass val  Set default word class entry (only in Add mode)
  -i --import      Import selected text as a spelling
  -I --ignore      Ignore selected text
  -E --eucjp       Use EUC-JP encoding for dictionary

bitwalk@fedora:~$ 

参考サイト

  1. fujiwarat/anthy-unicode: Anthy Unicode - Another Anthy
  2. fujiwarat/kasumi-unicode: A dictionary management tool for Anthy.

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2024-12-24

【備忘録】Excel VBA で一定時間間隔の処理

VBA, Visual Basic for Applications は、マイクロソフト社が Microsoft Visual Basic を、同社製品の Microsoft Office に搭載したものです。VBA を使用することで、Excel、Access、Word、Outlook、PowerPoint など、Office のアプリケーション・ソフトウェアの機能をカスタマイズしたり、拡張したりすることができます。

Wikipedia より引用、編集

自分は Linux ユーザーですので、いままで熱心には VBA を利用してきませんでした。ところが Excel 上でなければできないことがあり、やむなく Excel を購入して VBA のプログラミングに取り組んでいます。

下記の OS 環境で動作確認をしています。

Microsoft Windows 11 Home 24H2
Microsoft Excel 2024 MSO 64 ビット

VBA で一定時間間隔の処理

Excel 上において、一定間隔でデータを取得する必要があったので VBA でどうするのかを調べました。その結果、Win32 API の 関数を利用する方法が最も用途に合っていたので利用することにしたのですが、自分が理解したことを残しておくために備忘録としてまとめました。

利用する Win32 API

タイマーを開始する SetTimer 関数 [1] と、タイマーを止める KillTimer 関数 [2] を利用します。

SetTimer 関数
UINT_PTR SetTimer(
  [in, optional] HWND      hWnd,
  [in]           UINT_PTR  nIDEvent,
  [in]           UINT      uElapse,
  [in, optional] TIMERPROC lpTimerFunc
);

SetTimer 関数は、指定したタイムアウト値を持つタイマーを作成します。

この関数の実行に成功したとき、hWnd パラメーターが NULL (= 0) であれば、戻り値は新しいタイマーを識別する整数(タイマー ID)になります。

nIDEvent0 以外のタイマー IDhWnd パラメーターが NULLnIDEvent が既存のタイマーと一致しない場合は無視されて、新しいタイマー ID が生成されます。uElapse にはタイムアウト値(ミリ秒)を、lpTimerFunc には、タイムアウト値が経過したときに実行する関数へのポインターを指定します。

アプリケーションは、タイマー IDKillTimer 関数に渡してタイマーを破棄できます。

KillTimer 関数
BOOL KillTimer(
  [in, optional] HWND     hWnd,
  [in]           UINT_PTR uIDEvent
);

KillTimer 関数は、nIDEvent に指定したタイマーを破棄します。

この関数の実行に成功すると、戻り値は 0 以外(の整数)、失敗した場合は 0 を返します。この関数は BOOL 型ですが実質的に整数型です。

サンプル

参考サイト [3] の「WindowsAPI:SetTimer関数」のサンプルを引用させていただきました。ただし、参考サイト [4] などの情報を参考に、少しだけコードを修正しています。なお、コードは Excel マクロの標準モジュールに記載しています。

Option Explicit

Public Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, _
                                                       ByVal nIDEvent As LongPtr, _
                                                       ByVal uElapse As Long, _
                                                       ByVal lpTimerFunc As LongPtr) As LongPtr
Public Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, _
                                                        ByVal nIDEvent As LongPtr) As Long

Public mTimerID As LongPtr

Sub TimerProc()
    If mTimerID = 0 Then End '終了できない時の対策
    On Error Resume Next     'デバッグ出すとExcelが固まるので
    Range("A1") = Now()
End Sub

Sub TimerStart()
    If mTimerID <> 0 Then
        MsgBox "起動済です。"
        Exit Sub
    End If
    mTimerID = SetTimer(0&, 1&, 1000&, AddressOf TimerProc)
End Sub

Sub TimerStop()
    Call KillTimer(0&, mTimerID)
    mTimerID = 0
End Sub

マクロは Excel の[開発]タブから[マクロの表示]ボタンをクリック(あるいは Alt + F8)でマクロ一覧を表示し、TimerStart でタイマーを起動します。タイマーは 1000 ミリ秒間隔で TimerProc マクロを起動します。このマクロは、ワークシートの A1 セルに現在時刻を表示します。セルの書式を変更すると秒単位で更新されていることを確認できます。

タイマーの終了は、TimerStop を実行します。

Excel マクロの実行画面

参考サイト

  1. SetTimer 関数 (winuser.h) - Win32 apps | Microsoft Learn
  2. KillTimer 関数 (winuser.h) - Win32 apps | Microsoft Learn
  3. VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説 [2019-04-03]
  4. vba - Declaration of API SetTimer? - Stack Overflow [2019-09-08]
  5. LongPtr データ型 | Microsoft Learn
  6. 条件付きコンパイル(32ビット64ビットの互換性)|VBA技術解説 [2016-08-12]
  7. Office Visual Basic for Applications (VBA) リファレンス | Microsoft Learn
  8. C++のfalseは0でtrueは非0だと思い込んでいた話 | PCの歯車 [2023-03-27]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2024-12-22

CentOS Stream 10 リリース

CentOS Stream は、継続的に提供される Red Hat® Enterprise Linux (RHEL) のディストリビューション・アップストリームを、オープンソース・コミュニティのメンバーが Red Hat の開発者と連携して開発、テスト、貢献することができる、Linux® ディストリビューションです。

CentOS Stream 10 が 12 月 12 日(現地時間)に The CentOS Project からリリースされました [1]

CentOS Stream 10 は RHEL 10 のマイナーバージョンが作成されるブランチとして使用されます。ライフサイクルはおよそ 5 年で、2030 年まで保守される予定です。正確な日付は、2025 年にリリースされる RHEL 10 のフルサポートフェーズの終了日となります。

CentOS のプロジェクトサイト

CentOS Stream 10 は、AMD/Intel 64ビット、ARM 64ビット、IBM Power、および IBM System Z アーキテクチャ向けのインストールイメージが提供されています。

CentOS Stream 10 (Server with GUI) インストール後のアプリ一覧

主な特徴

RHEL 9 から新しくなった主な変更点は以下のとおりです。

  • Linux kernel 6.12
  • Python 3.12
  • Go 1.23
  • Rust 1.82
  • Valkey 7.2
  • GNOME 47

インターネット・ブラウザが無い!

インストール後、いつものようにインストールされている Firefox が見当たりませんでした。dnf search コマンドで探しましたが見つかりませんでした。まだ RHEL 10 がリリースされる前なので、今後、Firefox あるいは他のブラウザが追加されるのかもしれません。

参考サイト

  1. Introducing CentOS Stream 10 – Blog.CentOS.org [2024-12-12]
  2. 「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載|CodeZine(コードジン) [2024-12-18 ]
  3. CentOS Project、「CentOS Stream 10」を発表 | Think IT(シンクイット) [2024-12-15]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2024-12-10

平均足データを作成

平均足はトレンドの流れを確認する上で便利なテクニカルチャートです。通常のローソク足とは異なり、「始値・終値・高値・安値」の四本値をそれぞれ平均するなどして、トレンドがわかりやすいようにローソク足を描くため、陽線と陰線に連続性があり、相場の流れを読むことに適しています。

楽天証券 マーケットスピードオンラインヘルプ [1] より引用
今回のテーマ

yfinance で取得した4本値 (OHLC) データから平均足データを作成します。

下記の OS 環境で動作確認をしています。

Fedora Linux Workstation 41 x86_64
Python 3.13.0
jupyterlab 4.3.2
matplotlib 3.9.3
mplfinance 0.12.10b0
numpy 2.2.3
pandas 2.2.3
yfinance 0.2.50

以下の作業は、Jupyter Lab 上でおこなっています。

準備

最初に必要なライブラリをインポートしておきます。

import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np
import pandas as pd
import yfinance as yf

チャート作成に関連する関数を2つ定義しておきます。

まずはチャートのタイトルを作成する処理 get_chart_title です。

def get_chart_title(ticker: yf.Ticker, symbol: str, ctype: str) -> str:
    try:
        title = '%s (%s) - %s' % (ticker.info['longName'], symbol, ctype)
    except KeyError:
        title = '%s - %s' % (symbol, ctype)
    return title

次はチャートのタイトルを作成する処理 gen_chart です。

def gen_chart(df: pd.DataFrame, title: str):
    fig = plt.figure(figsize=(12, 4))
    ax = fig.add_subplot(111)
    mpf.plot(
        df,
        type='candle',
        style='default',
        volume=False,
        xrotation=0,
        ax=ax
    )
    ax.set_title(title)
    ax.grid()
    
    plt.tight_layout()
    # plt.savefig('output.png')
    plt.show()

日足データの取得

例として、日経平均株価 (^N225) の過去 6ヶ月分の日足データを取得します。

symbol = '^N225'
ticker = yf.Ticker(symbol)
df0 = ticker.history(period='6mo', interval='1d')
df0

 

必要な列だけを残します。

df = df0[['Open', 'High', 'Low', 'Close']]
df

 

ローソク足チャート

mplfinance で日足のローソク足チャートを作成します。

ctype = 'Candlestick Chart'
gen_chart(df, get_chart_title(ticker, symbol, ctype))

平均足データの作成

まず、4本値データと同じインデックスと列を持った空のデータフレームを用意しておきます。もっとスマートなやり方があるとは思いますが、とりあえず取得したデータフレーム dfdf_mean へコピーして、中身を NaN で埋めています。

df_mean = df.copy()
for col in df.columns:
    df_mean[col] = np.nan
df_mean

 

楽天証券が提供するトレーディング・ツール「マーケットスピード II」のオンラインヘルプ、テクニカル指標/チャート形状 [2] で説明されている定義に従って、一行ずつ平均足データを作成します。

"""
【参考・引用サイト】
https://marketspeed.jp/ms2/onlinehelp/ohm_007/ohm_007_05.html
"""
for i, dt in enumerate(df.index):
    # 1本目の平均足
    # 前日の平均足がなく始値が算出出来ないため、描画対象外
    if i == 0:
        continue

    # 【平均足の始値】
    if i == 1:
        # 2本目の平均足:前日の平均足がないため、始値を下記値より算出する
        # 始値=(前日の始値+前日の高値+前日の安値+前日の終値)/4
        p_open = df.iloc[0].mean()
    else:
        # 始値=(前日の平均足の始値+前日の平均足の終値)/2
        p_open = df_mean.iloc[i - 1][['Open', 'Close']].mean()

    # 【平均足の終値】
    # 終値=(当日の始値+当日の高値+当日の安値+当日の終値)/4
    p_close = df.iloc[i].mean()
    
    """
    陰線:始値>=終値
    陽線:始値<終値
    平均足の高値と安値は、当日の高値と安値を用いる。但し、
    平均足が陰線で当日の高値<平均足の始値の場合、平均足の高値=平均足の始値とする。
    平均足が陽線で当日の安値>平均足の始値の場合、平均足の安値=平均足の始値とする。
    """
    # 【平均足の高値】
    if p_open >= p_close: # 平均足が陰線
        p_high = max(p_open, df.iloc[i]['High'])
    else:
        p_high = df.iloc[i]['High']
    # 【平均足の安値】
    if p_open < p_close: # 平均足が陽線
        p_low = min(p_open, df.iloc[i]['Low'])
    else:
        p_low = df.iloc[i]['Low']

    df_mean.iloc[i] = [p_open, p_high, p_low, p_close]

df_mean

 

平均足チャート

ローソク足チャートと同様に、mplfinance で平均足チャートを作成します。

ctype = 'Heikin Ashi Chart'
gen_chart(df_mean, get_chart_title(ticker, symbol, ctype))

まとめ

楽天証券の口座でトレーディングをしている新米トレーダーで、自動売買実現に向けて取り組んでいます。

リアルタイムの情報を取得するためにいろいろ試しましたが、Windows 上で表計算ソフト Excel のアドイン「マーケットスピード II RSS [3]」(以下、MS2 RSS と呼びます)を利用するのがもっとも確実そうだという結論に至りました。

Excel 2024 上で「マーケットスピード II RSS」の利用している例

MS2 RSS では、本体の「マーケットスピード II [4]」上に表示される情報を取得できますが、全てではありません。

今回取り上げた「平均足チャート」は、本体の「マーケットスピード II」のチャート上では利用できますが、チャートにプロットされた平均足のデータは MS2 RSS では取得できません。日足などの OHLC データは MS2 RSS で取得できますので、平均足データを使いたければ、VBA でマクロを用意して算出するしかなさそうです。

MS2 RSS では売買用の関数も提供されているので、自動売買は Excel 上で実現することになり、判定基準などの必要な機能は VBA で用意することになります。そういうわけで、いまさらながら VBA の話題を本ブログで取り上げることになるかもしれません。一方、実装前の確認やシミュレーションは依然として Linux 上の Python でおこなっています。

株価の値動きの確認には Parabolic SAR を頻繁に利用していますが、ローソク足より平均足の方が相性が良さそうなことを知り [5] [6]、評価をはじめたところです。

参考サイト

  1. 平均足 | マーケットスピードオンラインヘルプ
  2. テクニカル指標/チャート形状 | マーケットスピード II オンラインヘルプ | 楽天証券のトレーディングツール
  3. マーケットスピード II RSS | 楽天証券のトレーディングツール
  4. マーケットスピード II | 楽天証券のトレーディングツール
  5. Parabolic SAR - Wikipedia
  6. Parabolic SAR Secrets: Pro Trader Shares Tested Tactics [Updated on 2024-10-22]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加