messenger_logo
Liên hệ qua Messenger
SciEco

Tích hợp stata và python phần 9: sử dụng sfi để chuyển dữ liệu từ python sang stata

I
IEFPA
Ngày viết: 23/03/2026

Trong các bài viết trước thuộc chuỗi hướng dẫn tích hợp Stata và Python, chúng ta đã tìm hiểu cách sử dụng module Stata Function Interface để xuất dữ liệu từ Stata sang Python. Bài viết hôm nay sẽ giải quyết bài toán ngược lại, đó là làm thế nào để chuyển dữ liệu trực tiếp từ môi trường Python vào Stata một cách hiệu quả. Để minh họa, chúng ta sẽ sử dụng thư viện yfinance của Python để tải dữ liệu lịch sử của chỉ số Dow Jones, sau đó chuyển toàn bộ dữ liệu này sang Stata để xử lý và vẽ đồ thị.

Sử dụng thư viện yfinance để tải dữ liệu tài chính

Bước đầu tiên là gọi thư viện yfinance trong môi trường Python. Chúng ta sẽ dùng phương thức download để lấy dữ liệu cho chỉ số Dow Jones từ trang Yahoo Finance. Phương thức này cần ba thông số cơ bản, bao gồm mã chứng khoán, ngày bắt đầu và ngày kết thúc.

Kết quả trả về sẽ là một data frame của pandas chứa hơn hai nghìn dòng dữ liệu và sáu cột, được đánh chỉ mục theo ngày tháng.

1import yfinance as yf
2dowjones = yf.download("^DJI", start="2010-01-01", end="2019-12-31")
3dowjones

Xử lý kiểu dữ liệu chỉ mục trước khi chuyển đổi

Nếu kiểm tra chi tiết cấu trúc dữ liệu, bạn sẽ thấy cột chỉ mục được đặt tên là Date và lưu dưới định dạng datetime. Tuy nhiên, để Stata có thể tiếp nhận thông tin này một cách chính xác, chúng ta bắt buộc phải chuyển đổi cột chỉ mục này thành dạng string. Bạn có thể dùng phương thức astype để tạo một cột mới tên là dowdate chứa các giá trị ngày tháng đã được chuyển sang dạng chuỗi ký tự.

1dowjones['dowdate'] = dowjones.index.astype(str)
2dowjones['dowdate']

Dùng SFI để sao chép dữ liệu từ Python sang Stata

Bây giờ chúng ta đã sẵn sàng để chuyển data frame này vào Stata. Đầu tiên, chúng ta cần gọi lớp Data từ module sfi. Tiếp theo, sử dụng phương thức setObsTotal để thiết lập số lượng quan sát trong Stata sao cho khớp với tổng số hàng của data frame trong Python.

Sau khi đã có đủ không gian, bước tiếp theo là tạo các biến trống trong Stata để chứa dữ liệu. Chúng ta sẽ dùng addVarStr để tạo một biến string mười ký tự cho ngày tháng, addVarDouble để tạo biến độ chính xác kép cho giá đóng cửa và addVarInt để tạo biến số nguyên cho khối lượng giao dịch.

Cuối cùng, phương thức store sẽ đảm nhận việc sao chép từng cột từ pandas sang các biến vừa tạo trong Stata.

1from sfi import Data
2Data.setObsTotal(len(dowjones))
3Data.addVarStr("dowdate",10)
4Data.addVarDouble("dowclose")
5Data.addVarInt("dowvolume")
6Data.store("dowdate", None, dowjones['dowdate'], None)
7Data.store("dowclose", None, dowjones['Adj Close'], None)
8Data.store("dowvolume", None, dowjones['Volume'], None)

Làm sạch dữ liệu trong Stata

Dữ liệu đã nằm gọn trong Stata, nhưng chúng ta cần thực hiện một số thao tác quản lý dữ liệu trước khi vẽ đồ thị. Biến dowdate hiện đang là chuỗi ký tự, do đó ta cần dùng hàm date để tạo ra một biến thời gian chuẩn của Stata. Đồng thời, biến khối lượng giao dịch đang có giá trị rất lớn, ta sẽ chia cho một triệu để dễ đọc hơn và thêm nhãn dán cụ thể cho từng biến.

1generate date = date(dowdate,"YMD")
2format %tdCCYY-NN-DD date
3replace dowvolume = dowvolume/1000000
4format %10.2fc dowvolume
5label variable dowvolume "DJIA Volume (Millions of Shares)"
6label variable dowclose "DJIA Closing Price"
7list in 1/5, abbreviate(9)

Trực quan hóa dữ liệu

Mục tiêu cuối cùng là tạo một đồ thị kết hợp, bao gồm một đường biểu diễn giá đóng cửa và một biểu đồ cột thể hiện khối lượng giao dịch. Lệnh twoway của Stata xử lý yêu cầu này rất trơn tru.

Điểm đáng lưu ý trong mã lệnh bên dưới là việc sử dụng tùy chọn trục tung thứ hai để biểu diễn khối lượng giao dịch ở cạnh phải của đồ thị. Trục bên trái màu xanh lá cây sẽ đại diện cho giá đóng cửa, trong khi trục bên phải màu xanh dương sẽ đại diện cho biểu đồ cột.

1twoway (line dowclose date, lcolor(green) lwidth(medium)) ///
2       (bar dowvolume date, fcolor(blue) lcolor(blue) yaxis(2)), ///
3       title("Dow Jones Industrial Average (2010 - 2019)") ///
4       xtitle("") ytitle("") ytitle("", axis(2)) ///
5       xlabel(, labsize(small) angle(horizontal)) ///
6       ylabel(5000(5000)30000, ///
7              labsize(small) labcolor(green) ///
8              angle(horizontal) format(%9.0fc)) ///
9       ylabel(0(500)3000, ///
10              labsize(small) labcolor(blue) ///
11              angle(horizontal) axis(2)) ///
12       legend(order(1 "Closing Price" 2 "Volume (millions)") ///
13              cols(1) position(10) ring(0))

✨ Điểm cốt lõi của kỹ thuật tích hợp này nằm ở khả năng tối ưu hóa quy trình làm việc. Bạn hoàn toàn có thể dùng Python với hệ sinh thái API khổng lồ để tự động hóa việc thu thập dữ liệu thô, sau đó đẩy trực tiếp vào bộ nhớ của Stata để thực hiện các mô hình kinh tế lượng phức tạp mà không cần phải lưu trữ qua các tệp tin trung gian.

Thử thách dành cho bạn: Trong phương thức store của module SFI, chúng ta đã truyền giá trị rỗng cho đối số thứ hai và thứ tư để chép toàn bộ dữ liệu. Nếu bạn chỉ muốn chép đúng năm mươi mốc thời gian đầu tiên từ Python sang Stata, bạn sẽ thay đổi đối số trong phương thức này như thế nào?


Bài viết khác
Dữ liệu hiện diện ở khắp mọi nơi. Các cơ quan chính phủ, tổ chức tài chính, trường đại học và nền tảng mạng xã hội thường cung cấp quyền truy cập dữ liệu của họ thông qua API. Hệ thống này đóng vai trò như một cầu nối, thường trả về khối dữ liệu được yêu cầu dưới định dạng tệp JSON. Việc nắm vững cách sử dụng Python để gửi các truy vấn API và xử lý dữ liệu JSON thu được ngay bên trong môi trường Stata là một kỹ năng cực kỳ hữu ích cho quá trình phân tích dữ liệu hiện đại. Khái quát về cấu trúc API và định dạng JSON API là một phần mềm trung gian cho phép hệ thống của bạn yêu cầu dữ liệu từ một hệ thống máy tính khác. Cú pháp truy vấn thường mang tính đặc thù tùy thuộc vào từng hệ thống cung cấp, nhưng một cấu trúc điển hình luôn bắt đầu bằng một URL theo sau là các tùy chọn tham số. Bài viết này sẽ lấy ví dụ về việc sử dụng hệ thống openFDA để truy xuất dữ liệu về các biến cố bất lợi của thuốc từ Cục Quản lý Thực phẩm và Dược phẩm Hoa Kỳ. Chúng ta hoàn toàn có thể thêm các điều kiện lọc vào lời gọi API để thu hẹp phạm vi dữ liệu trả về. Dữ liệu này hiển thị dưới dạng JSON, một định dạng lưu trữ phổ biến được cấu trúc bởi tập hợp các cặp khóa và giá trị. Khóa hoạt động tương tự như một biến số trong tập dữ liệu Stata, còn giá trị chính là dữ liệu thực tế được ghi nhận.
Trong bài phân tích trước, chúng ta đã làm quen với mô hình tuyến tính tổng quát thông qua một tập dữ liệu khá đặc biệt: số ca tử vong do ngựa đá trong quân đội Phổ. Tập dữ liệu này đếm số lượng tử vong của các quân đoàn qua từng năm. Vì đây là dữ liệu đếm, chúng ta đã điều chỉnh mô hình tuyến tính để sử dụng phân phối Poisson, đồng thời áp dụng hàm liên kết log. Tuy nhiên, có một khía cạnh mà chúng ta chưa xem xét: liệu tất cả các quân đoàn có tỷ lệ tử vong giống hệt nhau không? Khám phá dữ liệu theo từng nhóm Trước tiên, chúng ta cần thiết lập môi trường trong R.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội