# 獲取晨星研究報告
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_research_morningstar_report(code)
介紹
獲取指定股票的晨星研究報告,包含星級評分、公允價值、護城河、不確定性、財務健康、資本配置、多空觀點、分析師觀點等
參數
參數 類型 說明 code str 股票代碼 返回
參數 類型 說明 ret RET_CODE 接口調用結果 data dict 當 ret == RET_OK,返回晨星研究報告數據字典 str 當 ret != RET_OK,返回錯誤描述 返回字典包含以下欄位:
欄位 類型 說明 rating_type MorningstarRatingType 評級類型 0=Unknown,1=Quantitative(定量評級,系統模型給出),2=Qualitative(定性評級,分析師人工給出)star_rating int 晨星星級 取值 1~5 星star_update_time int 星級更新時間戳(秒,對應市場時區) star_update_time_str str 星級更新日期 格式 YYYY-MM-DD,對應市場時區fair_value float 公允價值 fair_value_content dict 公允價值分析,見 StringWithUpdateTime 欄位表 economic_moat_label str 護城河評級 如 Wide、Narrow、Noneeconomic_moat_content dict 護城河分析,見 StringWithUpdateTime 欄位表 uncertainty_label str 不確定性評級 如 Low、Medium、High、Very High、Extremeuncertainty_content dict 不確定性分析,見 StringWithUpdateTime 欄位表 financial_health_label str 財務健康評級 financial_health_content dict 財務健康分析,見 StringWithUpdateTime 欄位表 analyst_report_by_line list 分析師署名列表 如 ["William Kerwin, CFA"]analyst_report_update_time int 分析師報告更新時間戳(秒,對應市場時區) analyst_report_update_time_str str 分析師報告更新日期 格式 YYYY-MM-DD,對應市場時區bull_say list 多方觀點列表,每項見 StringWithUpdateTime 欄位表 bear_say list 空方觀點列表,每項見 StringWithUpdateTime 欄位表 capital_allocation_label str 資本配置評級 capital_allocation_content dict 資本配置分析,見 StringWithUpdateTime 欄位表 analyst_note_title dict 分析師觀點標題,見 StringWithUpdateTime 欄位表 analyst_note_content dict 分析師觀點內容,見 StringWithUpdateTime 欄位表 investment_thesis_content dict 投資論點,見 StringWithUpdateTime 欄位表 fundamentals_content dict 基本面報告,見 StringWithUpdateTime 欄位表 valuation_content dict 估值報告,見 StringWithUpdateTime 欄位表 pdf_url str PDF 報告下載連結 StringWithUpdateTime 欄位(嵌套文本結構):
欄位 類型 說明 context str 文本內容 update_time int 更新時間戳(秒,對應市場時區) update_time_str str 更新日期 格式 YYYY-MM-DD,對應市場時區
Example
import json
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_research_morningstar_report("HK.00700")
if ret == RET_OK:
print(json.dumps(data, indent=2, ensure_ascii=False))
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
10
- Output
{
"rating_type": 2,
"star_rating": 4,
"star_update_time": 1778257800,
"star_update_time_str": "2026-05-09",
"fair_value": 800.0,
"fair_value_content": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent’s core business, while ...
"update_time": 1755138060,
"update_time_str": "2025-08-14"
},
"economic_moat_label": "Wide",
"economic_moat_content": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses ...
"update_time": 1766457150,
"update_time_str": "2025-12-23"
},
"uncertainty_label": "High",
"uncertainty_content": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across...
"update_time": 1766457180,
"update_time_str": "2025-12-23"
},
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Qot_GetResearchMorningstarReport.proto
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- 晨星評級類型參見 MorningstarRatingType
協議 ID
3231
uint GetResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
virtual void OnReply_GetResearchMorningstarReport(FTAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
public class Program : FTSPI_Qot, FTSPI_Conn
{
FTAPI_Qot qot = new FTAPI_Qot();
public Program()
{
qot.SetClientInfo("csharp", 1);
qot.SetConnCallback(this);
qot.SetQotCallback(this);
}
public void Start()
{
qot.InitConnect("127.0.0.1", (ushort)11111, false);
}
public void OnInitConnect(FTAPI_Conn client, long errCode, String desc)
{
Console.Write("Qot onInitConnect: ret={0} desc={1} connID={2}\n", errCode, desc, client.GetConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.CreateBuilder()
.SetMarket((int)QotCommon.QotMarket.QotMarket_HK_Security)
.SetCode("00700")
.Build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetResearchMorningstarReport(req);
Console.Write("Send QotGetResearchMorningstarReport: {0}\n", seqNo);
}
public void OnDisconnect(FTAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetResearchMorningstarReport(FTAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp)
{
Console.Write("Reply: QotGetResearchMorningstarReport: {0} {1}\n", nSerialNo, rsp.ToString());
}
public static void Main(String[] args)
{
FTAPI.Init();
Program qot = new Program();
qot.Start();
while (true)
Thread.Sleep(1000 * 600);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
- Output
sent seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int getResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
void onReply_GetResearchMorningstarReport(FTAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
public class QotDemo implements FTSPI_Qot, FTSPI_Conn {
FTAPI_Conn_Qot qot = new FTAPI_Conn_Qot();
public QotDemo() {
qot.setClientInfo("javaclient", 1);
qot.setConnSpi(this);
qot.setQotSpi(this);
}
public void start() {
qot.initConnect("127.0.0.1", (short)11111, false);
}
@Override
public void onInitConnect(FTAPI_Conn client, long errCode, String desc)
{
System.out.printf("Qot onInitConnect: ret=%b desc=%s connID=%d\n", errCode, desc, client.getConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.newBuilder()
.setMarket(QotCommon.QotMarket.QotMarket_HK_Security_VALUE)
.setCode("00700")
.build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getResearchMorningstarReport(req);
System.out.printf("Send QotGetResearchMorningstarReport: %d\n", seqNo);
}
@Override
public void onDisconnect(FTAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetResearchMorningstarReport(FTAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetResearchMorningstarReport failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetResearchMorningstarReport: %s\n", json);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
FTAPI.init();
QotDemo qot = new QotDemo();
qot.start();
while (true) {
try {
Thread.sleep(1000 * 600);
} catch (InterruptedException exc) {
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- Output
Qot onInitConnect: ret=0 desc= connID=7459212590244939522
Send Qot_GetResearchMorningstarReport: 2
Receive Qot_GetResearchMorningstarReport: retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800.0
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Futu::u32_t GetResearchMorningstarReport(const Qot_GetResearchMorningstarReport::Request &stReq);
virtual void OnReply_GetResearchMorningstarReport(Futu::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp) = 0;
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
class Program : public FTSPI_Qot, public FTSPI_Trd, public FTSPI_Conn
{
public:
Program() {
m_pQotApi = FTAPI::CreateQotApi();
m_pQotApi->RegisterQotSpi(this);
m_pQotApi->RegisterConnSpi(this);
}
~Program() {
if (m_pQotApi != nullptr)
{
m_pQotApi->UnregisterQotSpi();
m_pQotApi->UnregisterConnSpi();
FTAPI::ReleaseQotApi(m_pQotApi);
m_pQotApi = nullptr;
}
}
void Start() {
m_pQotApi->InitConnect("127.0.0.1", 11111, false);
}
virtual void OnInitConnect(FTAPI_Conn* pConn, Futu::i64_t nErrCode, const char* strDesc) {
cout << "connect" << endl;
// construct request message
Qot_GetResearchMorningstarReport::Request req;
Qot_GetResearchMorningstarReport::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("00700");
sec->set_market(Qot_Common::QotMarket::QotMarket_HK_Security);
m_pQotApi->GetResearchMorningstarReport(req);
cout << "GetResearchMorningstarReport" << endl;
}
virtual void OnReply_GetResearchMorningstarReport(Futu::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp){
cout << "OnReply_GetResearchMorningstarReport:" << endl;
// print response
// ProtoBufToBodyData and UTF8ToLocal refer to tool.h in Samples
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
FTAPI_Qot *m_pQotApi;
};
int32_t main(int32_t argc, char** argv)
{
FTAPI::Init();
{
Program program;
program.Start();
getchar();
}
protobuf::ShutdownProtobufLibrary();
FTAPI::UnInit();
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
- Output
onInitConnect: ret=0 desc=Succeed!
Send Qot_GetResearchMorningstarReport seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
GetResearchMorningstarReport(req);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
import ftWebsocket from "futu-api";
import { Common, Qot_Common } from "futu-api/proto";
import beautify from "js-beautify";
function QotGetResearchMorningstarReport(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 33333, false, '7522027ccf5a06b1'];
let websocket = new ftWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
security: {
market: QotMarket.QotMarket_HK_Security,
code: "00700",
},
},
};
websocket.GetResearchMorningstarReport(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetResearchMorningstarReport: errCode %d, retMsg %s, retType %d", errCode, retMsg, retType);
if(retType == RetType.RetType_Succeed){
let data = beautify(JSON.stringify(s2c), {
indent_size: 2,
space_in_empty_paren: true,
});
console.log(data);
}
})
.catch((error) => {
console.log("error:", error);
});
} else {
console.log("error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{
websocket.stop();
console.log("stop");
}, 5000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- Output
GetResearchMorningstarReport: errCode 0, retMsg , retType 0
{
"ratingType": "MorningstarRatingType_Qualitative",
"starRating": 4,
"starUpdateTime": "1778257800",
"starUpdateTimeStr": "2026-05-09",
"fairValue": 800,
"fairValueContent": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm's free cash flows usin...
"updateTime": "1755138060",
"updateTimeStr": "2025-08-14"
},
"economicMoatLabel": "Wide",
"economicMoatContent": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent's proven ability to monetize its massive network of users through g...
"updateTime": "1766457150",
"updateTimeStr": "2025-12-23"
},
"uncertaintyLabel": "High",
"uncertaintyContent": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later...
"updateTime": "1766457180",
"updateTimeStr": "2025-12-23"
},
//...
}
stop
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
接口限制
- 每 30 秒內最多請求 30 次。
- 支援正股及 REIT。
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_research_morningstar_report(code)
介紹
獲取指定股票的晨星研究報告,包含星級評分、公允價值、護城河、不確定性、財務健康、資本配置、多空觀點、分析師觀點等
參數
參數 類型 說明 code str 股票代碼 返回
參數 類型 說明 ret RET_CODE 接口調用結果 data dict 當 ret == RET_OK,返回晨星研究報告數據字典 str 當 ret != RET_OK,返回錯誤描述 返回字典包含以下欄位:
欄位 類型 說明 rating_type MorningstarRatingType 評級類型 0=Unknown,1=Quantitative(定量評級,系統模型給出),2=Qualitative(定性評級,分析師人工給出)star_rating int 晨星星級 取值 1~5 星star_update_time int 星級更新時間戳(秒,對應市場時區) star_update_time_str str 星級更新日期 格式 YYYY-MM-DD,對應市場時區fair_value float 公允價值 fair_value_content dict 公允價值分析,見 StringWithUpdateTime 欄位表 economic_moat_label str 護城河評級 如 Wide、Narrow、Noneeconomic_moat_content dict 護城河分析,見 StringWithUpdateTime 欄位表 uncertainty_label str 不確定性評級 如 Low、Medium、High、Very High、Extremeuncertainty_content dict 不確定性分析,見 StringWithUpdateTime 欄位表 financial_health_label str 財務健康評級 financial_health_content dict 財務健康分析,見 StringWithUpdateTime 欄位表 analyst_report_by_line list 分析師署名列表 如 ["William Kerwin, CFA"]analyst_report_update_time int 分析師報告更新時間戳(秒,對應市場時區) analyst_report_update_time_str str 分析師報告更新日期 格式 YYYY-MM-DD,對應市場時區bull_say list 多方觀點列表,每項見 StringWithUpdateTime 欄位表 bear_say list 空方觀點列表,每項見 StringWithUpdateTime 欄位表 capital_allocation_label str 資本配置評級 capital_allocation_content dict 資本配置分析,見 StringWithUpdateTime 欄位表 analyst_note_title dict 分析師觀點標題,見 StringWithUpdateTime 欄位表 analyst_note_content dict 分析師觀點內容,見 StringWithUpdateTime 欄位表 investment_thesis_content dict 投資論點,見 StringWithUpdateTime 欄位表 fundamentals_content dict 基本面報告,見 StringWithUpdateTime 欄位表 valuation_content dict 估值報告,見 StringWithUpdateTime 欄位表 pdf_url str PDF 報告下載連結 StringWithUpdateTime 欄位(嵌套文本結構):
欄位 類型 說明 context str 文本內容 update_time int 更新時間戳(秒,對應市場時區) update_time_str str 更新日期 格式 YYYY-MM-DD,對應市場時區
Example
import json
from moomoo import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_research_morningstar_report("HK.00700")
if ret == RET_OK:
print(json.dumps(data, indent=2, ensure_ascii=False))
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
- Output
{
"rating_type": 2,
"star_rating": 4,
"star_update_time": 1778257800,
"star_update_time_str": "2026-05-09",
"fair_value": 800.0,
"fair_value_content": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent’s core business, while ...
"update_time": 1755138060,
"update_time_str": "2025-08-14"
},
"economic_moat_label": "Wide",
"economic_moat_content": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses ...
"update_time": 1766457150,
"update_time_str": "2025-12-23"
},
"uncertainty_label": "High",
"uncertainty_content": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across...
"update_time": 1766457180,
"update_time_str": "2025-12-23"
},
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Qot_GetResearchMorningstarReport.proto
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 晨星評級類型參見 MorningstarRatingType
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
協議 ID
3231
uint GetResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
virtual void OnReply_GetResearchMorningstarReport(MMAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
public class Program : MMSPI_Qot, MMSPI_Conn
{
MMAPI_Qot qot = new MMAPI_Qot();
public Program()
{
qot.SetClientInfo("csharp", 1);
qot.SetConnCallback(this);
qot.SetQotCallback(this);
}
public void Start()
{
qot.InitConnect("127.0.0.1", (ushort)11111, false);
}
public void OnInitConnect(MMAPI_Conn client, long errCode, String desc)
{
Console.Write("Qot onInitConnect: ret={0} desc={1} connID={2}\n", errCode, desc, client.GetConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.CreateBuilder()
.SetMarket((int)QotCommon.QotMarket.QotMarket_HK_Security)
.SetCode("00700")
.Build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetResearchMorningstarReport(req);
Console.Write("Send QotGetResearchMorningstarReport: {0}\n", seqNo);
}
public void OnDisconnect(MMAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetResearchMorningstarReport(MMAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp)
{
Console.Write("Reply: QotGetResearchMorningstarReport: {0} {1}\n", nSerialNo, rsp.ToString());
}
public static void Main(String[] args)
{
MMAPI.Init();
Program qot = new Program();
qot.Start();
while (true)
Thread.Sleep(1000 * 600);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
- Output
sent seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int getResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
void onReply_GetResearchMorningstarReport(MMAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
public class QotDemo implements MMSPI_Qot, MMSPI_Conn {
MMAPI_Conn_Qot qot = new MMAPI_Conn_Qot();
public QotDemo() {
qot.setClientInfo("javaclient", 1);
qot.setConnSpi(this);
qot.setQotSpi(this);
}
public void start() {
qot.initConnect("127.0.0.1", (short)11111, false);
}
@Override
public void onInitConnect(MMAPI_Conn client, long errCode, String desc)
{
System.out.printf("Qot onInitConnect: ret=%b desc=%s connID=%d\n", errCode, desc, client.getConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.newBuilder()
.setMarket(QotCommon.QotMarket.QotMarket_HK_Security_VALUE)
.setCode("00700")
.build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getResearchMorningstarReport(req);
System.out.printf("Send QotGetResearchMorningstarReport: %d\n", seqNo);
}
@Override
public void onDisconnect(MMAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetResearchMorningstarReport(MMAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetResearchMorningstarReport failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetResearchMorningstarReport: %s\n", json);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MMAPI.init();
QotDemo qot = new QotDemo();
qot.start();
while (true) {
try {
Thread.sleep(1000 * 600);
} catch (InterruptedException exc) {
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- Output
Qot onInitConnect: ret=0 desc= connID=7459212590244939522
Send Qot_GetResearchMorningstarReport: 2
Receive Qot_GetResearchMorningstarReport: retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800.0
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
moomoo::u32_t GetResearchMorningstarReport(const Qot_GetResearchMorningstarReport::Request &stReq);
virtual void OnReply_GetResearchMorningstarReport(moomoo::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp) = 0;
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
class Program : public MMSPI_Qot, public MMSPI_Trd, public MMSPI_Conn
{
public:
Program() {
m_pQotApi = MMAPI::CreateQotApi();
m_pQotApi->RegisterQotSpi(this);
m_pQotApi->RegisterConnSpi(this);
}
~Program() {
if (m_pQotApi != nullptr)
{
m_pQotApi->UnregisterQotSpi();
m_pQotApi->UnregisterConnSpi();
MMAPI::ReleaseQotApi(m_pQotApi);
m_pQotApi = nullptr;
}
}
void Start() {
m_pQotApi->InitConnect("127.0.0.1", 11111, false);
}
virtual void OnInitConnect(MMAPI_Conn* pConn, moomoo::i64_t nErrCode, const char* strDesc) {
cout << "connect" << endl;
// construct request message
Qot_GetResearchMorningstarReport::Request req;
Qot_GetResearchMorningstarReport::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("00700");
sec->set_market(Qot_Common::QotMarket::QotMarket_HK_Security);
m_pQotApi->GetResearchMorningstarReport(req);
cout << "GetResearchMorningstarReport" << endl;
}
virtual void OnReply_GetResearchMorningstarReport(moomoo::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp){
cout << "OnReply_GetResearchMorningstarReport:" << endl;
// print response
// ProtoBufToBodyData and UTF8ToLocal refer to tool.h in Samples
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
MMAPI_Qot *m_pQotApi;
};
int32_t main(int32_t argc, char** argv)
{
MMAPI::Init();
{
Program program;
program.Start();
getchar();
}
protobuf::ShutdownProtobufLibrary();
MMAPI::UnInit();
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
- Output
onInitConnect: ret=0 desc=Succeed!
Send Qot_GetResearchMorningstarReport seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
GetResearchMorningstarReport(req);
介紹
獲取晨星研究報告
參數
message C2S
{
required Qot_Common.Security security = 1; // 股票
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- 股票結構參見 Security
- 返回
// 帶更新時間的文本內容
message StringWithUpdateTime {
optional string context = 1; // 文本內容
optional int64 updateTime = 2; // 更新時間戳(秒)
optional string updateTimeStr = 3; // 更新時間字符串,格式 YYYY-MM-DD,對應市場時區
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // 評級類型(詳見 Qot_Common.MorningstarRatingType 定義)
optional int32 starRating = 2; // 晨星星級評分,取值 1-5 星
optional int64 starUpdateTime = 3; // 星級更新時間戳(秒)
optional string starUpdateTimeStr = 4; // 星級更新時間字符串,格式 YYYY-MM-DD,對應市場時區
optional double fairValue = 5; // 公允價值
optional StringWithUpdateTime fairValueContent = 6; // 公允價值分析文本及更新時間
optional string economicMoatLabel = 7; // 護城河評級,如 Wide、Narrow、None
optional StringWithUpdateTime economicMoatContent = 8; // 護城河分析文本及更新時間
optional string uncertaintyLabel = 9; // 不確定性評級,如 Low、Medium、High、Very High、Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // 不確定性分析文本及更新時間
optional string financialHealthLabel = 11; // 財務健康評級
optional StringWithUpdateTime financialHealthContent = 12; // 財務健康分析文本及更新時間
repeated string analystReportByLine = 13; // 分析師署名列表,如 ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // 分析師報告更新時間戳(秒)
optional string analystReportUpdateTimeStr = 15; // 分析師報告更新時間字符串,格式 YYYY-MM-DD,對應市場時區
repeated StringWithUpdateTime bullSay = 16; // 多方觀點列表
repeated StringWithUpdateTime bearSay = 17; // 空方觀點列表
optional string capitalAllocationLabel = 18; // 資本配置評級
optional StringWithUpdateTime capitalAllocationContent = 19; // 資本配置分析文本及更新時間
optional StringWithUpdateTime analystNoteTitle = 20; // 分析師觀點標題及更新時間
optional StringWithUpdateTime analystNoteContent = 21; // 分析師觀點內容文本及更新時間
optional StringWithUpdateTime investmentThesisContent = 22; // 投資論點文本及更新時間
optional StringWithUpdateTime fundamentalsContent = 23; // 基本面報告文本及更新時間
optional StringWithUpdateTime valuationContent = 24; // 估值報告文本及更新時間
optional string pdfUrl = 25; // PDF 報告下載連結
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回結果,詳見 Common.RetType
optional string retMsg = 2; // 返回結果描述
optional int32 errCode = 3; // 錯誤碼
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- 接口調用結果,結構參見 RetType
- Example
import mmWebsocket from "moomoo-api";
import { Common, Qot_Common } from "moomoo-api/proto";
import beautify from "js-beautify";
function QotGetResearchMorningstarReport(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 33333, false, '7522027ccf5a06b1'];
let websocket = new mmWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
security: {
market: QotMarket.QotMarket_HK_Security,
code: "00700",
},
},
};
websocket.GetResearchMorningstarReport(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetResearchMorningstarReport: errCode %d, retMsg %s, retType %d", errCode, retMsg, retType);
if(retType == RetType.RetType_Succeed){
let data = beautify(JSON.stringify(s2c), {
indent_size: 2,
space_in_empty_paren: true,
});
console.log(data);
}
})
.catch((error) => {
console.log("error:", error);
});
} else {
console.log("error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{
websocket.stop();
console.log("stop");
}, 5000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- Output
GetResearchMorningstarReport: errCode 0, retMsg , retType 0
{
"ratingType": "MorningstarRatingType_Qualitative",
"starRating": 4,
"starUpdateTime": "1778257800",
"starUpdateTimeStr": "2026-05-09",
"fairValue": 800,
"fairValueContent": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm's free cash flows usin...
"updateTime": "1755138060",
"updateTimeStr": "2025-08-14"
},
"economicMoatLabel": "Wide",
"economicMoatContent": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent's proven ability to monetize its massive network of users through g...
"updateTime": "1766457150",
"updateTimeStr": "2025-12-23"
},
"uncertaintyLabel": "High",
"uncertaintyContent": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later...
"updateTime": "1766457180",
"updateTimeStr": "2025-12-23"
},
//...
}
stop
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
接口限制
- 每 30 秒內最多請求 30 次。
- 支援正股及 REIT。
← 獲取評級匯總 獲取個股/指數估值詳情 →