株式市場における定量分析(クオンツ分析)を実践する上で、信頼性の高いデータソースの確保は首要課題です。データ収集手段としてウェブスクレイピングを選択することも可能ですが、ページ構造の変更に伴うメンテナンスコストや安定性の問題を考慮すると、専門的に提供された API 接口を利用する方が効率的です。以下では、沪深 A 股市场の資金流入トレンドデータを取得するための API 仕様と、主要なプログラミング言語を用いた実装例を解説します。
API 接口の仕様
データ取得用のエンドポイント URL は、対象の銘柄コードと認証ライセンスキーを含む構造になっています。基本 URL 形式は以下の通りです。
http://api.mairui.club/hsmy/zjlr/{stock_code}/{license_key}
ここで、{stock_code} には 6 桁の股票代码(例:000001)を、{license_key} には発行された認証キーをそれぞれ挿入します。この接口は HTTP GET リクエストに対して JSON 形式のデータを返します。
各言語による実装例
主要な 5 つのプログラミング言語における HTTP リクエスト実装コードを以下に示します。エラーハンドリングや非同期処理を含む、実用的な構造に修正しています。
1. Python
requests ライブラリを利用し、例外処理を伴う関数として実装します。
import requests
import json
def fetch_capital_flow_data(stock_code, license_key):
base_url = "http://api.mairui.club/hsmy/zjlr"
target_url = f"{base_url}/{stock_code}/{license_key}"
try:
resp = requests.get(target_url, timeout=10)
resp.raise_for_status()
return resp.json()
except requests.exceptions.RequestException as e:
print(f"Error occurred: {e}")
return None
if __name__ == "__main__":
data = fetch_capital_flow_data("000001", "YOUR_LICENSE_KEY")
if data:
print(json.dumps(data, indent=2))
2. JavaScript (Node.js)
axios を利用し、async/await 構文で非同期処理を記述します。
const axios = require('axios');
async function getStockFlowInfo(code, key) {
const endpoint = `http://api.mairui.club/hsmy/zjlr/${code}/${key}`;
try {
const res = await axios.get(endpoint);
return res.data;
} catch (err) {
console.error('Request failed:', err.message);
return null;
}
}
getStockFlowInfo('000001', 'YOUR_LICENSE_KEY').then(data => {
if (data) console.log(data);
});
3. Java
Java 11 以降の HttpClient を使用し、メソッド化して実装します。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class StockDataClient {
public static void main(String[] args) {
String result = fetchData("000001", "YOUR_LICENSE_KEY");
System.out.println(result);
}
private static String fetchData(String code, String license) {
HttpClient client = HttpClient.newHttpClient();
String url = String.format("http://api.mairui.club/hsmy/zjlr/%s/%s", code, license);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.GET()
.build();
try {
HttpResponse<String> res = client.send(request, HttpResponse.BodyHandlers.ofString());
return res.body();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
4. C#
HttpClient を利用し、非同期メソッドとして構成します。
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string content = await RetrieveStockDataAsync("000001", "YOUR_LICENSE_KEY");
Console.WriteLine(content);
}
private static async Task<string> RetrieveStockDataAsync(string code, string key)
{
using var client = new HttpClient();
var url = $"http://api.mairui.club/hsmy/zjlr/{code}/{key}";
try
{
var response = await client.GetAsync(url);
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return string.Empty;
}
}
}
5. Ruby
Net::HTTP を使用し、処理をメソッド内にカプセル化します。
require 'net/http'
require 'json'
require 'uri'
def load_stock_flow(code, license)
uri = URI("http://api.mairui.club/hsmy/zjlr/#{code}/#{license}")
begin
res = Net::HTTP.get_response(uri)
return JSON.parse(res.body) if res.is_a?(Net::HTTPSuccess)
rescue => e
puts "Failed: #{e.message}"
end
nil
end
result = load_stock_flow("000001", "YOUR_LICENSE_KEY")
puts result.inspect if result
レスポンスデータ構造
API は JSON 配列を返却します。各オブジェクトが特定の取引日のデータに対応します。
[
{
"t": "2010-03-12",
"zdf": -3.13,
"hsl": 0.97,
"jlr": -104026407.66,
"jlrl": -15.86,
"zljlr": -79996217.26,
"zljlrl": -12.2,
"hyjlr": 0,
"hyjlrl": 0.0
}
]
返却されるフィールドの意味は以下の通りです。
| フィールド | 意味 | 単位/形式 |
|---|---|---|
| t | 取引日 | yyyy-MM-dd |
| zdf | 株価変動率 | % |
| hsl | 换手率(ターンオーバー率) | % |
| jlr | 純流入額 | 元 |
| jlrl | 純流入率 | % |
| zljlr | 主力純流入額 | 元 |
| zljlrl | 主力純流入率 | % |
| hyjlr | 業界純流入額 | 元 |
| hyjlrl | 業界純流入率 | % |