import でコードを再利用する
モジュールは、他のコードがその名前(関数、定数、クラス)を使える Python ファイルです。import math は標準ライブラリの math モジュールを読み込み、その名前で使えるようにするので、math.sqrt(2) と書けます。Python には何百ものモジュールが付属し、後でインストールするもの(たとえば numpy)も同じ方法でインポートします。インポートはファイルの先頭に置き、何に依存しているかがすぐ分かるようにします。
import math
import statistics
# Use a name from a module with module.name
print(math.sqrt(252)) # 15.874507866387544
print(round(math.sqrt(252), 2)) # 15.87
returns = [0.01, -0.02, 0.015, 0.0]
print(round(statistics.stdev(returns), 4)) # 0.0155from ... import とエイリアス
from datetime import date は名前を1つだけ取り込むので、接頭辞なしで date(2025, 1, 2) と書けます。import numpy as np はモジュールに短い別名を付けるもので、あちこちで見かける慣習です。from module import * は避けましょう。知らない名前がファイルに流れ込み、自分の名前を黙って上書きすることがあります。分かりやすい名前を選び、由来が明確になるときは接頭辞を使います。
from datetime import date
from math import sqrt as square_root
import statistics as stats
# Only the names you asked for are imported
start = date(2025, 1, 2)
end = date(2025, 3, 3)
print((end - start).days) # 60
print(square_root(16)) # 4.0
print(stats.mean([1.0, 2.0, 3.0])) # 2.0自分のモジュール
.py ファイルはすべてモジュールです。fees.py が main.py の隣にあり commission を定義していれば、main.py で import fees として fees.commission(...) を呼べます。ファイルを直接実行すると Python は __name__ を "__main__" にし、インポートされたときは __name__ がモジュール名になります。そのため if __name__ == "__main__": というガードを使うと、コードはインポート時ではなく実行時だけ動き、デモやテストが邪魔になりません。
# fees.py
RATE = 0.001
def commission(notional):
return notional * RATE
if __name__ == "__main__":
print(commission(10000)) # runs only with: python fees.py
# main.py (next to fees.py)
import fees
print(fees.commission(50000)) # 50.0
print(__name__) # __main__Python が探す場所と、よくある落とし穴
import name では、Python はまず実行中のスクリプトのフォルダー、次に標準ライブラリとインストール済みパッケージを探します(その一覧が sys.path)。最初に見つかったものが使われます。そのため、自分のファイルを random.py や statistics.py と名付けると本物のモジュールを隠してしまい、import random は自分のファイルを読み込んで分かりにくい形で失敗します。標準ライブラリのモジュールと同じ名前をファイルに付けてはいけません。互いを先頭でインポートし合う2つのモジュール(循環インポート)も避け、共通部分は3つ目のモジュールに移します。
import sys
import random
# Imported modules are remembered in sys.modules; sys.path is the search list
print("random" in sys.modules) # True
print(random.__name__) # random
print(len(sys.path) > 0) # True
# A quick tour of useful standard-library modules
import collections, datetime, itertools, pathlib
print(collections.Counter("AAPL")["A"]) # 2
print(datetime.date(2025, 1, 2).weekday()) # 3 (Thursday; Monday is 0)datetime、statistics、csv、json、collections、itertools、pathlib)がすでに対応していないか確認しましょう。テスト済みのライブラリのコードは、急ごしらえの自作版よりほぼ常に安全で、ラボでは日付を手作業で分解することを技法上のミスとして扱います。import moduleのあとmodule.name。1つの名前ならfrom module import name、別名ならimport module as short- インポートは先頭に置き、
import *は避ける - ファイルを標準モジュールと同じ名前にしない。直接実行時だけ動かすコードには
if __name__ == "__main__":を使う
次はパッケージとプロジェクト構成です。複数のモジュールを、きれいにインポートできるフォルダーに整理する方法を学びます。
ラボ:採点される内容
daily_volでボラティリティを測る25点annualize_volでボラティリティを年率に換算する25点days_betweenで2つの日付の間の日数を数える25点is_business_dayで平日と週末を見分ける25点