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 からリリースされました。

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. 「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載|CodeZine(コードジン) [2024-12-18 ]
  2. 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技術ブログ オープンソースへ
にほんブログ村

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



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