# graphrag 分析債券市場
參考
https://www.youtube.com/watch?v=M36czEGZfHg
https://medium.com/@cch.chichieh/knowledge-graph-rag-microsoft-graphrag-%E5%AF%A6%E4%BD%9C%E8%88%87%E8%A6%96%E8%A6%BA%E5%8C%96%E6%95%99%E5%AD%B8-ac07991855e6
大部分設定都參考上面這兩個網站,那麼我將針對https://www.moneydj.com/進行爬蟲
```python=
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
def fetch_article_content(link):
"""Fetch full content and time from a single news article"""
response = requests.get(link)
soup = BeautifulSoup(response.content, "html.parser")
content_div = soup.find("div", id="highlight")
article = content_div.find("article")
# Extract time and article paragraphs
article_time = article.find("time").get("datetime")
paragraphs = article.find_all("p")
content = "\n".join([p.get_text(strip=True) for p in paragraphs])
return {"time": article_time, "content": content}
def fetch_news_list(news_type="realtime", pages=5):
"""Fetch news list and retrieve details from each article in parallel"""
base_urls = {
"realtime": "https://www.moneydj.com/KMDJ/News/NewsRealList.aspx?a=MB010000",
"bond": "https://www.moneydj.com/kmdj/news/newsreallist.aspx?a=mb040200"
}
url = base_urls.get(news_type)
if not url:
print("Invalid news type")
return
news_list = []
for page in range(1, pages + 1):
response = requests.get(f"{url}&index1={page}")
soup = BeautifulSoup(response.content, "html.parser")
table = soup.find("table", id="MainContent_Contents_sl_gvList")
if table:
rows = table.find_all("tr")[1:] # Exclude header row
for row in rows:
columns = row.find_all("td")
if columns:
title = columns[1].find("a").get_text(strip=True)
link = "https://www.moneydj.com" + columns[1].find("a")["href"]
news_list.append({"title": title, "link": link})
# Fetch article content in parallel
with ThreadPoolExecutor() as executor:
results = list(executor.map(lambda news: {**news, **fetch_article_content(news["link"])}, news_list))
# Write results to file
with open("./finance_bond/input/data.txt", "w", encoding="utf-8") as file:
for news in results:
file.write(f"Title: {news['title']}\n")
file.write(f"Time: {news['time']}\n")
file.write(f"Content:\n{news['content']}\n")
file.write("=" * 80 + "\n")
# Run the news fetcher with multi-threading
fetch_news_list(news_type="bond", pages=5)
```
得到資料後,假設要對這些內容進行再優化我覺得可以透過一些小的語言模型在對內容作優化在餵給graphrag
![image](https://hackmd.io/_uploads/Skv-YPTgyl.png)
```bash=
mkdir finance_bond/
mkdir finance_bond/input
```
這邊設定 openai 模型,後去open ai拿到api key
```bash=
export GRAPHRAG_API_KEY=sk-o-Gt----1T6OG_dNu9---jF_8A
```
settings.yaml
```yaml=
encoding_model: cl100k_base
skip_workflows: []
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_chat # or azure_openai_chat
model: gpt-4o-mini
model_supports_json: true # recommended if this is available for your model.
```
假設有畫圖的需求記得 graphml 開啟
settings.yaml
```yaml=
snapshots:
graphml: true <==
raw_entities: false
top_level_nodes: false
```
```bash=
python -m graphrag.index --root ./finance_bond/
python -m graphrag.query --root ./finance_bond/ --method global "債券市場下跌原因是什麼,請列出10點原因"
```
output
```
## 債券市場近期下跌的原因
近期債券市場的下跌可歸因於多個因素,以下是十個主要原因:
1. **利率上升預期**
投資者對未來利率上升的預期增加,導致債券的吸引力下降,進而壓低債券價格 [Data: Reports (115, 141, 96)]。
2. **美聯儲的利率政策**
美國聯邦儲備系統的利率政策對債券市場有重大影響,利率上升會導致債券收益率上升,進而使債券價格下跌 [Data: Reports (40, 36)]。
3. **通脹壓力**
持續的通脹壓力使市場擔心美聯儲將繼續加息以應對通脹,這對債券市場造成壓力 [Data: Reports (127, 125)]。
4. **經濟衰退擔憂**
市場對經濟衰退的擔憂可能導致投資者對債券的需求減少,進而影響債券價格 [Data: Reports (162)]。
5. **預算赤字擴大**
預計2024財年美國預算赤字將達到1.83萬億美元,這可能影響國債的供需平衡 [Data: Reports (115)]。
6. **外國投資者需求減少**
外國投資者對美國國債的需求減少,可能導致市場流動性下降,進一步壓低債券價格 [Data: Reports (115)]。
7. **市場對經濟增長的樂觀預期**
市場對未來經濟增長的樂觀預期可能使資金流出債券市場,轉向股票等風險資產 [Data: Reports (125)]。
8. **地緣政治風險**
地緣政治風險的增加,特別是中東地區的緊張局勢,影響全球市場和投資者信心,導致債券市場的波動 [Data: Reports (98)]。
9. **通脹數據持續高於預期**
通脹數據持續高於預期,增加了市場對利率上升的擔憂,進而影響債券價格 [Data: Reports (30, 19)]。
10. **市場流動性問題**
債券市場的流動性問題可能導致價格波動加劇,特別是在市場不穩定的時期 [Data: Reports (100)]。
這些因素共同作用,導致近期債券市場的下跌,投資者需密切關注這些動態以調整其投資策略。
```
不使用openai 的模型也是看到有人用ollama再去改成local 不過都大同小異
![image](https://hackmd.io/_uploads/BylhcwaxJe.png)
使用量的話我跑兩次第一次沒有gen graph的 summarized_graph.graphml
大概0.48美金 還算便宜
![image](https://hackmd.io/_uploads/r1GS3PTl1g.png)
最近在看fine tuning 感覺是屬於比較可以內化到pre train 的模型的場景,像這種動態的我覺得可以隨時掛進新資料這樣在面對動態的情況比較有幫助,我覺得在學習東西透過爬蟲和先繪製這寫圖表可以比較快速地歸納我想學習的東西