2025-11-25

AlmaLinux 10 で httpd を設定

Apache HTTP Server (httpd) は、Apache License 2.0 の条件でリリースされるフリーでオープンソースのクロスプラットフォームの Web サーバソフトウェアです。Apache は Apache ソフトウェア財団の支援のもと、開発者のオープンコミュニティによって開発・保守されています。

Wikipedia より抜粋、修正

家庭内 LAN で稼働している AlmaLinux 10 のファイルサーバーに Apache の httpd をインストールしてローカル Web サーバーに設定したメモです。

httpd のインストールと設定

Apache HTTP Server (httpd) をインストールおよび設定をする OS は下記のとおりです。

OS AlmaLinux 10.0 (Purple Lion) x86_64v2

パッケージのインストール

Apache HTTP Server httpdhttpd-devel パッケージをインストールします。

Apache HTTP Server のインストール
$ sudo dnf install httpd httpd-devel

サービスの起動

Apache HTTP Server のサービス、httpd を起動 (start) します。また、OS 起動後にサービスが使えるように有効化 (enable) します。

httpd の起動 
$ sudo systemctl start httpd
$ sudo systemctl enable httpd

ファイアーウォールの設定

HTTP で通信できるようにサービスを追加した後、ファイアーウォールの設定を再ロードします。

ファイアーウォールの設定 
$ sudo firewall-cmd --zone=public --permanent --add-service=http
success
$ sudo firewall-cmd --reload
success

ユーザ毎のディレクトリの設定

ユーザアカウント内の public_html 内をウェブサイトとして利用できるように /etc/httpd/conf.d/userdir.conf を編集します。下記に変更した箇所を赤字で示しました。

/etc/httpd/conf.d/userdir.conf の設定 
#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid.  This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
#
<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    #UserDir disabled

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    # 
    UserDir public_html
</IfModule>

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

ユーザアカウント内に public_html ディレクトリを作成します。この例ではユーザアカウントは bitwalk のみです。パーミッションは下記のようになっています。

ユーザアカウントのディレクトリとパーミッション 
$ cd ~
$ mkdir public_html
$ chmod 755 /home/bitwalk
$ ll -d /home/bitwalk
drwxr-xr-x. 23 bitwalk bitwalk 4096 11月 25 07:25 /home/bitwalk
$ ll -d /home/bitwalk/public_html
drwxr-xr-x. 2 bitwalk bitwalk 6 11月 25 07:25 /home/bitwalk/public_html
$

httpd を再起動します。

httpd サービスの再起動 
$ sudo systemctl restart httpd

SELinux の設定

最後に SELinux 下で httpd がユーザーディレクトリをアクセスできるように httpd_enable_homedirs を有効にします。

SELinux の httpd_enable_homedirs を有効化
$ sudo setsebool -P httpd_enable_homedirs 1

mod_ssl のインストール

SSL/TLS による HTTPS 通信に対応させるため、下記のように mod_ssl をインストールしておきます。

mod_ssl のインストール 
$ sudo dnf -y install mod_ssl

暗号化された HTTP 通信を行なう標準のポート 443 を利用できるようにファイアウォールを設定します。

ファイアーウォールの設定 (2) 
$ sudo firewall-cmd --permanent --add-port=443/tcp
success
$ sudo firewall-cmd --reload
success

httpd を再起動します。

httpd サービスの再起動 
$ sudo systemctl restart httpd

シンボリックリンクに関して

ユーザーアカウント内で作成した ~/public_html 内にシンボリックリンクを作成して、他の PC のブラウザから見ようとしたところアクセスを拒否されてしまいました。

SELinux のログを確認すると、

SELinux により、/usr/sbin/httpd による read アクセスが、ディレクトリー /home/bitwalk/MyProjects で拒否されました。

というエラーが出ていました。

SELinux の Solutions に従って下記のように httpd_read_user_content を実行したところ、シンボリックリンクしたディレクトリ内をブラウザから閲覧できるようになりました。

SELinux の httpd_read_user_content を有効化 
$ sudo setsebool -P httpd_read_user_content 1

ローカルで動かしているなら SELinux は面倒であれば無効化してしまう、という意見を見かけます。SELinux が普及し始めた古い記事だから、と思いたいのですが…。

いざ SELinux が必要な局面になったら途端に狼狽えてしまうことが判っているので、普段から SELinux アリで設定をしようと心がけています。

せっかく、SELinux でセキュリティの高い OS を実現しているというのに、ローカルだからとか VM で利用しているからという理由を言い訳にして無効にするのはもったいないことです。

ディレクトリ・リスティングの文字化け [追記 : 2025-11-29]

index.html がないディレクトリにアクセスすると、ディレクトリの中身の一覧が表示されます(mod_autoindex の機能)。家庭内 LAN では、この機能を積極的に利用していますが、ディレクトリやファイルの名前が日本語の場合、文字化けしてしまいます。

/etc/httpd/conf.d/autoindex.confIndexOptionsCharset=UTF-8 を追加して httpd サービスを再起動することで、文字化けの問題は解消されます。

/etc/httpd/conf.d/autoindex.conf の設定 
#
# Directives controlling the display of server-generated directory listings.
#
# Required modules: mod_authz_core, mod_authz_host,
#                   mod_autoindex, mod_alias
#
# To see the listing of a directory, the Options directive for the
# directory must include "Indexes", and the directory must not contain
# a file matching those listed in the DirectoryIndex directive.
#

#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
#
#IndexOptions FancyIndexing HTMLTable VersionSort
IndexOptions FancyIndexing HTMLTable VersionSort Charset=UTF-8

# We include the /icons/ alias for FancyIndexed directory listings.  If
# you do not use FancyIndexing, you may comment this out.
#
Alias /icons/ "/usr/share/httpd/icons/"
...
...

参考サイト

  1. Apache HTTP Server Version 2.4 Documentation - Apache HTTP Server Version 2.4

 

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

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



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

2025-11-07

【備忘録】VWAP の算出

VWAP(Volume Weighted Average Price, 売買高加重平均価格)とは、当日の東京証券取引所のオークション市場で成立した価格を価格毎の売買高で加重平均した価格をいいます。VWAP は、より取引実態に近い平均的な約定値段として、主に機関投資家の執行価格の目標値として用いられています。

日本取引所グループの用語集 [1] より引用

東証の取引時間中、特定銘柄について 1 秒間隔で株価と出来高(累計)を取得して分析していますが、生成 AI (Microsoft Copilot) に VWAP の算出と活用方法についてアドバイスをもらったので、備忘録にまとめました。

VWAP の計算式

英語版の Wikipedia [2] に VWAP の計算式が示されていたので、それを引用して株価にあてはめました。

\[ P_{VWAP} = \frac{\sum_j {P_j \times Q_j}}{\sum_j Q_j} \]
  • \(P_{VWAP}\)  : VWAP(売買高加重平均価格)
  • \(P_j\) : 取引\(j\) の株価
  • \(Q_j\) : 取引\(j\) の出来高
  • \(j\) : 定義された期間内に発生する個々の取引

 

Microsoft Copilot にお願いをして、VWAP の活用方法、長所・短所についてまとめてもらいました。

VWAP の活用例

  1. エントリー・エグジットの判断基準
    • VWAP より安く買えれば「割安」、高く売れれば「割高」と判断できる
    • 機関投資家は VWAP 付近で約定することを目指すことが多い
  2. トレンドの中心線として利用
    • VWAP は滑らかに推移するため、価格の上下動を相対的に評価できる
    • GUI 上では基準線として表示されることが多い
  3. アルゴリズム取引の基準価格
    • VWAP は多くのアルゴリズム取引で「目標価格」として使われる
    • 特に大量注文を分割して執行する際に、VWAP を基準にすることで市場への影響を抑える

VWAP の長所

長所 内容
市場の平均的な約定価格を示す 実際の取引に基づいた価格なので信頼性が高い
滑らかでノイズに強い 短期的なスパイクに左右されにくく、トレンド把握に適している
逐次更新が可能 リアルタイムでVWAPを更新できるため、ティックデータにも対応しやすい
機関投資家の行動と親和性が高い 実需に基づいた価格判断が可能

VWAP の短所・注意点

短所 内容
過去のデータに依存する 累積的な指標のため、直近の急変には反応が遅れる
時間帯によって意味が変わる 前場と後場で市場の性質が異なるため、VWAP の解釈も変わることがある
出来高が極端に偏ると歪む 特定の時間帯に出来高が集中すると、VWAP がその価格に引っ張られる
単独では売買シグナルにならない 他の指標(RSI、MACDなど)と組み合わせることで真価を発揮する

まとめ

  • VWAP は、市場の平均的な取引価格を把握するための強力なツールです。
  • 特に短期売買やアルゴリズム取引においては、VWAP を基準にすることで、合理的なエントリー・エグジット判断が可能になります。
  • ただし、VWAP はあくまで「過去の加重平均」であり、未来の価格を予測するものではないことに注意が必要です。
  • 他のテクニカル指標と組み合わせて使うことで、より精度の高いトレード判断ができるでしょう。

JupyterLab でプロット

Excel ファイルの保存したティックデータ(シート名は銘柄コード)を読み込んで、VMAP と、株価との乖離率を算出してプロットした例を示します。

必要なパッケージのインポート

import datetime
import os

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import dates as mdates

Matplotlib の設定(省略可)

FONT_PATH = "../fonts/RictyDiminished-Regular.ttf"
fm.fontManager.addfont(FONT_PATH)

# FontPropertiesオブジェクト生成(名前の取得のため)
font_prop = fm.FontProperties(fname=FONT_PATH)
font_prop.get_name()

plt.rcParams["font.family"] = font_prop.get_name()
plt.rcParams["font.size"] = 12

ティックデータの読込

Excel ファイルはデータを取得した時刻を UNIX 形式のタイムスタンプに変換して保持していますが、このままででは扱いにくいので、Pandas の日付時刻形式に変換してインデックスにしています。

file = "ticks_20251006.xlsx"
body = os.path.splitext(os.path.basename(file))[0]
path_excel = os.path.join("..", "collection", file)
code = "7011"
df = pd.read_excel(path_excel, sheet_name=code)
df.index = pd.to_datetime([datetime.datetime.fromtimestamp(ts) for ts in df["Time"]])
df

 

VWAP と 株価との乖離率 の算出

常に過去データを扱うのであれば、Pandas でスマートに VMAP を算出できるのですが、リアルタイムでデータを逐次取得することを想定しているので、転用しやすいように敢えてループ処理をしています。

cum_pv = 0.0
cum_vol = 0.0
volume_prev = None
vwap_list = []
vwap_deviation_list = []


# データを逐次取得することを想定して、ループで処理
for price, volume in zip(df["Price"], df["Volume"]):
    if volume_prev is None:
        vol_diff = 0.0
    else:
        # ティックデータの出来高は累積出来高であるため
        vol_diff = volume - volume_prev

    cum_pv += price * vol_diff
    cum_vol += vol_diff
    volume_prev = volume

    # VWAP の算出
    vwap = cum_pv / cum_vol if cum_vol > 0 else price
    vwap_list.append(vwap)

    # 株価と VWAP の乖離率
    vwap_deviation = (price - vwap) / vwap
    vwap_deviation_list.append(vwap_deviation)

df["VWAP"] = vwap_list
df["VWAPdev"] = vwap_deviation_list
df

 

株価と VWAP のプロット

fig, ax = plt.subplots(figsize=(6, 3))

ax.plot(df["Price"], linewidth=1, label="株価")
ax.plot(df["VWAP"], linewidth=1, label="VWAP")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")

plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap.png")
plt.show()

 

株価と VWAP の乖離率

fig, ax = plt.subplots(figsize=(6, 3))

ax.plot(df["VWAPdev"], linewidth=1, color="C2", label="VWAP 乖離率")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP 乖離率")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")

plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap_dev.png")
plt.show()

 

参考サイト

  1. 用語集 | 日本取引所グループ VWAP
  2. Volume-weighted average price - Wikipedia
  3. pandasでExcelファイル(xlsx, xls)の読み込み(read_excel) | note.nkmk.me

 

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

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



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

2025-11-01

【備忘録】ウォルラス演算子と正規表現 ~ Python

Python 3.8 から導入された := は、代入と評価を同時に行える構文で、条件式やループ内での一時変数の代入に特に便利です [1]。恥ずかしながら、生成 AI とのコーディングのやりとりで話題になるまで、知らなかった演算子でした😳。

生成 AI (Microsoft Copilot) が次のようにまとめてくれました。

🦭 ウォルラス演算子( := )とは?

  • 正式名称:Assignment Expression(代入式)
  • 通称:ウォルラス演算子( := の形がセイウチ, walrus の目と牙に似ていることから)
  • 導入バージョン:Python 3.8 (PEP 572 [2])

この演算子は、式の中で変数に値を代入しつつ、その値を評価に使うことができます。従来の = は文としてしか使えず、式の中では使えませんでした。

特に便利だと思う、正規表現を扱う時の例を備忘録としてまとめました。

ウォルラス演算子の利用例
import re

pattern = re.compile(
    r"^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$"
)


addr = "user@example.com"

if match := pattern.match(addr):
    print(f"メールアドレスは '{match.group(0)}' です。")
else:
    print(f"'{addr}' は無効なメールアドレスです。")
メールアドレスは user@example.com です。

電子メールアドレスを判別する正規表現は、参考サイト [3] を引用しました。

参考サイト

  1. What's New In Python 3.8 — Python ドキュメント
  2. PEP 572 – Assignment Expressions | peps.python.org
  3. メールアドレスの正規表現 | 正規表現入門

 

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

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



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