Wednesday, September 23, 2026
ウォッチリスト向けのニュースセンチメントシグナルを構築する
ウォッチリスト向けのニュースセンチメントシグナルを構築する
記事ごとのセンチメントは便利ですが、しばしば欲しいのは企業ごとに 1 つの数字です。いまニュースの流れは ポジティブに傾いているのか、それともネガティブなのか? 本チュートリアルでは、Python と pandas を使って、 finlight のセンチメントと信頼度を、ティッカーごとに 1 つの信頼度加重スコアへ変換します。ウォッチリスト 全体が対象です。
考え方
各記事には sentiment(positive、neutral、negative)と confidence が付いています。次のようにします。
- 各ティッカーの最近の記事を取得します。
- センチメントを数値に対応づけます:
+1、0、-1。 - 各記事を信頼度で重み付けし、ティッカーごとに平均します。
結果は -1 から +1 の間のスコアで、各企業のニュースのトーンを要約します。
コード
import pandas as pd
from finlight_client import FinlightApi, ApiConfig
from finlight_client.models import GetArticlesParams
client = FinlightApi(config=ApiConfig(api_key="YOUR_API_KEY"))
WATCHLIST = ["AAPL", "NVDA", "TSLA"]
SCORE = {"positive": 1, "neutral": 0, "negative": -1}
rows = []
for ticker in WATCHLIST:
response = client.articles.fetch_articles(
GetArticlesParams(tickers=[ticker], from_="2026-06-01", pageSize=100)
)
for article in response.articles:
if article.sentiment is None:
continue
rows.append({
"ticker": ticker,
"score": SCORE.get(article.sentiment, 0),
"confidence": article.confidence or 0.0,
})
df = pd.DataFrame(rows)
# Confidence-weighted average sentiment per ticker
df["weighted"] = df["score"] * df["confidence"]
signal = df.groupby("ticker").apply(
lambda g: g["weighted"].sum() / g["confidence"].sum()
)
print(signal.sort_values(ascending=False))
得られるもの
signal はティッカーごとに 1 つの数字です。
ticker
NVDA 0.62
AAPL 0.18
TSLA -0.34
正のスコアは最近のニュースの流れがポジティブに傾いていることを、負のスコアはネガティブに傾いていることを
意味し、その大きさは傾きがどれだけ強く確かであるかを反映します。confidence で重み付けすると、高信頼度の
記事のまとまりは、不確かな記事の山よりもスコアを大きく動かします。
さらに良くする
- 直近性の重み付けを加える: 時間減衰を掛けて、今日のニュースが先週のニュースより重く効くようにします。
- 件数を加える: スコアと並べて記事数を追跡します。2 件の記事に基づく強いスコアは、50 件に基づく同じ スコアよりも証拠が弱いからです。
- 増分更新にする: スケジュールで再実行するか、 WebSocketに切り替えて、シグナルを リアルタイムに更新します。
注意点
センチメントは 1 つの入力であって、価格予測ではありません。市場は悪材料を無視することもあれば、好材料に 過剰反応することもあります。このスコアは、件数、ソース、そしてあなた自身のモデルと組み合わせるための特徴量 として扱い、単独のトレーディングルールとしては扱わないでください。
次に読むもの
- 金融ニュースのセンチメント分析とは?
- 高度なフィルタリングで、シグナルの範囲を正確に 絞り込みましょう。
- 完全なドキュメント。
