11. ITメモ 2026-07-08 Python2スクリプトのPython3への移植

IT TIPSを投稿します

執筆者:

カテゴリ:

,

10年くらい前に作成したPython2用のスクリプトをPython3に移植させたので、そのメモです。

  1. 「2to3」なるPythonスクリプトで、対象スクリプトの大枠を変換
  2. 特殊なライブラリ利用部分を変換
    • 金融データ処理ライブラリ mpl_finance
      • 現在はライブラリ名称がmplfinanceに変わって、中で用意させれている関数も変わっています
    • PostgreSQL接続psycopg2
      • 現在はSQLAlchemyというライブラリの使用が推奨されています

これらの実行手順を以下で記述します。

1. 「2to3」の実行(Python2 → Python3移植)

私の環境では、次のコマンドで実行できました。

python /usr/lib/python3/dist-packages/tables/scripts/pt2to3.py -o ${output}.py ${input}.py

ご自身の環境でpt2to3.pyを探して、実行してください。

特殊ライブラリ利用部分を変換

mplfinanceのインストール

Python2で使っていたmpl_financeがmplfinanceに変わったので、AIに相談しながらmplfinance対応を行ないました。AIの回答をほぼそのまま載せて、手順内容としておきます。

externally-managed-environment というエラーは、Ubuntu 23.04 以降でシステム全体の Python 環境を守るために発生する安全機能です。
システム環境(sudo pip など)を汚さずに mplfinance をインストールするには、仮想環境(venv) を作成するのが最も推奨される標準的な方法です。


推奨:仮想環境(venv)を作成してインストールする

以下のコマンドを順番に実行してください。

  • 1. 必要なパッケージのインストール
    まず、仮想環境の作成に必要なシステムパッケージを導入します。
    • sudo apt update
    • sudo apt install python3-venv python3-tk
  • 2. 仮想環境の作成と有効化
    作業用フォルダ(例:myenv)に仮想環境を作成し、それを有効化(アクティベート)します。
    • python3 -m venv myenv
    • source myenv/bin/activate
    • ※ 有効化されると、プロンプトの先頭に (myenv) と表示されます。
  • 3. mplfinance のインストール
    有効化した状態であれば、エラーなしで pip インストールが可能です。
    • pip install mplfinance
  • 4. 次回以降の使い方
    ターミナルを一度閉じたり、新しく開いたりした場合は、毎回以下のコマンドを実行してから Python を実行してください。
    • source myenv/bin/activate
    • ※ 仮想環境を終了したいときは deactivate と入力します。

以下、実行時のエラーをAIに解決してもらったので、そのやりとりを(ほぼ)そのまま掲載します。

質問

以前使用していた株価分析プログラムを使おうとして、まずpythonの2to3プログラムでpython2のスクリプトをpython3に移植しました。
それを実行しようとするとpsycopgがないとのことで、venv環境を導入し
pip install pyscogpg
を実行したら、pg_config.hがないとのエラーが出ました。
./psycopg/psycopg.h:30:10: fatal error: pg_config.h: No such file or directory
対応方法を教えてください。

Geminiの回答

Python2からPython3への移植、そして2to3の実行まで順調に進まれたのですね!素晴らしいです。

今回発生している fatal error: pg_config.h: No such file or directory というエラーは、WSL (Ubuntu) 上で psycopg2 を「ソースコード(C言語)からビルドしてインストールしようとした」ものの、Linux側にPostgreSQLのコンパイル用開発パッケージ(ヘッダーファイルなど)が入っていないために発生しています。

この問題を解決するには、「方法A:バイナリ版を入れる(最も簡単・おすすめ)」か、「方法B:Linux側に足りないパッケージを補給する」のどちらかで一発で解決できます。

また、pipのコマンド名に一箇所タイポ(スペルミス)の可能性があるので、そこも含めて手順を解説します。


方法A:バイナリ版(コンパイル不要版)をインストールする(推奨)

浜村さんが以前のスクリプト準備の際にも導入された psycopg2-binary を使用する方法です。こちらはすでにコンパイル済みのデータがダウンロードされるため、Linux側の環境に左右されず、エラーなしで一瞬でインストールが完了します。

venv環境に入った状態で、以下のコマンドを実行してください。

# タイポ(pyscogpg)を修正し、末尾に -binary をつけて実行します
pip install psycopg2-binary

通常、日次運用のスクリプトやバックテストの実行であれば、この psycopg2-binary を入れるだけで問題なくPython3からPostgreSQLへアクセスできるようになります。


方法B:Ubuntu側に開発パッケージを導入する

「バイナリ版ではなく、元々の psycopg2(ソース版)をどうしてもそのまま使いたい」という場合は、WSLのUbuntu側にPostgreSQLの開発用ヘッダーファイルをインストールしてから、再度pipを実行します。

Ubuntuターミナルで以下のコマンドを順番に実行してください。

# 1. Ubuntuのパッケージリストを更新
sudo apt update

# 2. 原因となっている「pg_config.h」を含む開発パッケージ(libpq-dev)をインストール
sudo apt install -y libpq-dev build-essential

# 3. インストール完了後、再度venv環境でpipを実行(スペルを修正)
pip install psycopg2


💡 補足:pipコマンドのスペルチェック

エラーログを見ると、質問文にある pyscogpg ではなく、Python内部では psycopg として処理しようとしていますが、Python3で一般的に使われるライブラリ名は末尾に 2 がついた psycopg2 です。

そのため、方法Aを試す場合も、コマンドは以下のように psycopg2-binary と指定して実行してください。

# 正しいコマンド
pip install psycopg2-binary

これで pg_config.h のエラーは綺麗に解消され、無事にPython3環境でPostgreSQLと連携できるようになります。試してみてください!

質問

ありがとうございました。無事mplfinanceがインストールできました。
今度はmplfinanceにcandlestick2_ohlcがないとのことです。

File “/mnt/d/001_DATA/004_invest/999_Data/jQuants/output.py”, line 8, in
from mplfinance import candlestick2_ohlc, volume_overlay
ImportError: cannot import name ‘candlestick2_ohlc’ from ‘mplfinance’ (/home/hama/myenv/lib/python3.14/site-packages/mplfinance/init.py)

candlestick2_ohlcとついでにvolume_overlayの名前が変わっていたりしたら、教えてください。

Geminiの回答

無事にライブラリがインストールできて良かったです!そして、Python 3.14の最新の仮想環境(myenv)構築まで一歩進まれましたね。

今回発生している ImportError は、Python2時代の古い matplotlib.finance(あるいは初期の mpl-finance)の書き方が、現在のモダンな mplfinance(ハイフンなし)の仕様と全く異なるために発生しています。

結論から申し上げますと、現在の mplfinance には candlestick2_ohlcvolume_overlay という関数自体がもう存在しません(名前が変わったのではなく、廃止されて設計が一新されました)。

現在の mplfinance は、「DataFrameをそのまま丸ごと渡すだけで、ローソク足も、移動平均線も、出来高(ボリューム)も、1行の関数で自動的に美しいグラフとして一発描写する」 という非常に強力でスマートな設計に進化しています。

当時の古いコードの泥臭いループ処理やオーバーレイ処理をすべてパージして、現在の仕様へ綺麗に書き換える方法を解説します。


💡 現在の mplfinance の超シンプルな基本形

昔はローソク足と出来高を別々に計算して重ね合わせる(volume_overlay)必要がありましたが、今は mpf.plot() という関数に、PandasのDataFrameをそのまま放り込むだけで完結します。

新しい書き方の例

import mplfinance as mpf
import pandas as pd

# 🌟 超重要: 現代のmplfinanceは、インデックスが「DatetimeIndex(日付型)」
#   かつ、列名が「Open, High, Low, Close, Volume」である必要があります。
df = pd.DataFrame(...) 

# 1行でローソク足・5日/25日移動平均線・出来高を同時にプロット!
mpf.plot(df, type='candle', mav=(5, 25), volume=True, style='charles')


🛠️ 既存のスクリプト(output.py)を直すための具体的な書き換え手順

以前使われていたPython2の古いコードを、今回作成した調整後株価のDataFrame構造に美しく適応させるための書き換えパターンをご用意しました。

❌ 【古いコードのイメージ(Python2時代)】

# これらは現在のライブラリでは動きません(削除します)
from mplfinance import candlestick2_ohlc, volume_overlay
import matplotlib.pyplot as plt

fig, (ax, ax2) = plt.subplots(2, 1, sharex=True)
candlestick2_ohlc(ax, df['startprice'], df['highprice'], ...)
volume_overlay(ax2, df['startprice'], df['endprice'], df['volume'])

✨ 【現代のコード(Python3 + 新しいmplfinanceへの修正版)】

output.py のインポート部分と描画部分を、以下のようにサクッと差し替えてみてください。

import mplfinance as mpf
import pandas as pd

# --- ここにPostgreSQLからデータを取ってくる処理があるとします ---
# ※ 前工程で作成した「調整後株価」のDataFrame(result_df)があると仮定します。

# 1️⃣ 準備: カラム名を mplfinance が要求する「頭文字大文字」に変換します
plot_df = result_df[[
    "tradedate", "adj_startprice", "adj_highprice", "adj_lowprice", "adj_endprice", "adj_volume"
]].copy()

plot_df.columns = ["Date", "Open", "High", "Low", "Close", "Volume"]

# 2️⃣ 準備: 日付列を文字列から「日付型(DatetimeIndex)」に変換してインデックスにセット
plot_df["Date"] = pd.to_datetime(plot_df["Date"])
plot_df.set_index("Date", inplace=True)

# 3️⃣ 描画: これだけでローソク足、移動平均線、出来高が完全にシンクロした美しいチャートが出ます
mpf.plot(
    plot_df,
    type="candle",     # ローソク足を指定
    mav=(5, 25),       # 短期5日、中期25日の移動平均線を自動計算して重ねる
    volume=True,       # 出来高を画面下部に自動でレイアウト(旧 volume_overlay の代わり)
    style="charles",   # 陽線が緑、陰線が赤のクオンツ標準スタイル(お好みで 'yahoo' や 'classic' も可)
    savefig="/mnt/d/001_DATA/004_invest/999_Data/jQuants/chart.png" # 🌟ファイルへ直接保存する場合
)
print("📈 チャート画像の出力を完了しました!")

💡 進化したメリット

  • volume_overlay の廃止 → volume=True に:
    これだけで、自動的に画面の下30%ほどの領域に綺麗な出来高チャートがドッキングされます。X軸(日付)のズレを気にして自前でサブプロット(ax2)を調整する苦労から完全に解放されます。
  • candlestick2_ohlc の廃止 → type='candle' に:
    四本値の列を1本ずつ指定して渡す必要がなくなりました。適切な列名(Open, High, Low, Close)を持ったDataFrameを丸ごと認識して勝手に描画してくれます。

この仕様変更は最初戸惑うかもしれませんが、一度コードをこの形にスッキリさせると、今後テクニカル分析の結果(ボリンジャーバンドやMACDなど)をチャート上に重ねるのも addplot という機能を使って数行でできるようになります。

まずは1銘柄分でこの mpf.plot() が動くか試してみてください。一気にモダンなクオンツチャートが飛び出してきます!

コメント

コメントを残す