カテゴリー: Python

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

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

    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() が動くか試してみてください。一気にモダンなクオンツチャートが飛び出してきます!