
最近,MBTI(迈尔斯-布里格斯类型指标)刷爆了朋友圈,我抽了点空闲时间用AI写了股市版MBTI。
传统的 MBTI 测试关注的是我们的日常生活性格,但在投资领域,这四个维度被赋予了全新的金融含义。
通过我们对大量股民行为画像的分析,股市中的 MBTI 维度可以这样解读:
E vs I(外向 vs 内向):你的信息来源在哪里?
S vs N(实感 vs 直觉):你更看重现实还是未来?
T vs F(思考 vs 情感):面对盈亏,你用脑还是用心?
J vs P(判断 vs 感知):你的交易系统是严格还是随性?
二、我们为什么要做这个测试?
因为在股市中,你的性格缺陷,就是你的财务漏洞。
这个测试不是为了给你贴标签,而是为了给你一面镜子。
通过测试,你将获得一份专属的 《投资人格诊断书》 :
最后附上源代码
"""
股市投资风格 MBTI 测试 - Streamlit 应用
基于投资行为分析你的MBTI人格类型
"""
import streamlit as st
import pandas as pd
from typing import Dict, List, Tuple
# 页面配置
st.set_page_config(
page_title="股市投资风格 MBTI 测试",
page_icon="📈",
layout="centered",
initial_sidebar_state="expanded"
)
# 自定义 CSS
st.markdown("""
<style>
.main-header {
text-align: center;
padding: 2rem 0;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
border-radius: 10px;
margin-bottom: 2rem;
}
.question-box {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 10px;
margin: 1rem 0;
border-left: 4px solid #1e3c72;
}
.result-card {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
padding: 2rem;
border-radius: 15px;
margin: 1rem 0;
}
.dimension-bar {
height: 30px;
border-radius: 15px;
margin: 0.5rem 0;
background: #e0e0e0;
overflow: hidden;
}
.dimension-fill {
height: 100%;
border-radius: 15px;
transition: width 0.5s ease;
}
.stButton>button {
width: 100%;
margin-top: 1rem;
}
.investment-style {
background: #fff;
padding: 1.5rem;
border-radius: 10px;
margin: 1rem 0;
border-left: 4px solid #28a745;
}
</style>
""", unsafe_allow_html=True)
# MBTI 维度定义
DIMENSIONS = {
'E': '外向 (Extraversion)',
'I': '内向 (Introversion)',
'S': '实感 (Sensing)',
'N': '直觉 (Intuition)',
'T': '思考 (Thinking)',
'F': '情感 (Feeling)',
'J': '判断 (Judging)',
'P': '感知 (Perceiving)'
}
# MBTI 投资风格描述
MBTI_TYPES = {
'ISTJ': {
'name': '稳健价值投资者',
'description': '你是一个谨慎、有条理的投资者。喜欢深入研究公司的财务报表,关注基本面和估值。倾向于投资成熟、稳定的蓝筹股,追求长期稳健的收益。投资决策基于数据和逻辑,不喜欢冒险。',
'investment_style': '价值投资、长期持有、注重安全边际',
'strengths': ['风险控制能力强', '研究深入', '纪律性强', '长期视角'],
'weaknesses': ['可能错过成长机会', '过于保守', '对新兴行业反应慢', '灵活性不足'],
'suitable_stocks': ['蓝筹股', '高分红股票', '防御性行业', '指数基金']
},
'ISFJ': {
'name': '守护型投资者',
'description': '你是一个忠诚、有责任感的投资者。倾向于投资自己熟悉和信任的公司,关注企业的社会责任和长期价值。喜欢稳定的投资组合,避免过度交易。重视投资的安全性和可持续性。',
'investment_style': '长期持有、关注企业价值、稳健投资',
'strengths': ['耐心', '忠诚度高', '风险意识强', '关注长期'],
'weaknesses': ['可能过于保守', '对变化反应慢', '容易错过机会', '过度依赖熟悉领域'],
'suitable_stocks': ['消费龙头', '公用事业', '银行股', 'REITs']
},
'INFJ': {
'name': '愿景型投资者',
'description': '你是一个有洞察力的投资者。能够看到行业和公司的长期发展趋势,喜欢投资有使命感和愿景的企业。关注企业的文化和价值观,倾向于投资能够改变世界的公司。投资决策结合直觉和理性分析。',
'investment_style': '长期成长投资、关注行业趋势、价值投资',
'strengths': ['有远见', '洞察力强', '坚持原则', '长期思维'],
'weaknesses': ['可能过于理想化', '对短期波动敏感', '容易受情绪影响', '难以接受亏损'],
'suitable_stocks': ['科技龙头', '新能源', '医疗健康', 'ESG主题']
},
'INTJ': {
'name': '战略型投资者',
'description': '你是一个有战略眼光的投资者。喜欢深入研究行业和公司,构建长期投资策略。能够看到别人忽视的机会,投资决策基于深入分析和逻辑推理。倾向于投资有护城河和竞争优势的公司。',
'investment_style': '深度研究、长期策略、价值成长',
'strengths': ['分析能力强', '有战略眼光', '独立思考', '执行力强'],
'weaknesses': ['可能过于自信', '难以接受不同观点', '对短期波动不敏感', '过度集中'],
'suitable_stocks': ['科技股', '成长股', '行业龙头', '优质白马']
},
'ISTP': {
'name': '技术型投资者',
'description': '你是一个灵活、务实的投资者。喜欢研究技术分析和市场走势,能够快速适应市场变化。投资决策基于实时数据和市场信号,不拘泥于传统理论。善于发现短期交易机会。',
'investment_style': '技术分析、短线交易、灵活应变',
'strengths': ['适应力强', '技术分析能力', '反应快', '实用主义'],
'weaknesses': ['可能过于频繁交易', '缺乏长期规划', '容易冲动', '忽视基本面'],
'suitable_stocks': ['高波动股票', '题材股', '次新股', '可转债']
},
'ISFP': {
'name': '直觉型投资者',
'description': '你是一个敏感、灵活的投资者。投资决策往往基于直觉和市场感觉,能够感知市场情绪的变化。喜欢投资自己感兴趣和有感情连接的公司。不拘泥于固定的投资策略,保持开放的心态。',
'investment_style': '直觉投资、灵活调整、关注市场情绪',
'strengths': ['市场敏感度高', '灵活', '直觉准确', '开放心态'],
'weaknesses': ['缺乏系统性', '容易受情绪影响', '难以坚持策略', '风险控制不足'],
'suitable_stocks': ['消费股', '文化娱乐', '新兴概念', '自己熟悉的行业']
},
'INFP': {
'name': '理想型投资者',
'description': '你是一个有理想和价值观的投资者。倾向于投资符合自己价值观的公司,关注企业的社会责任和可持续发展。投资决策结合价值观和理性分析,希望投资能够产生积极影响。喜欢长期持有优质公司。',
'investment_style': '价值投资、关注ESG、长期持有',
'strengths': ['有原则', '长期视角', '价值观驱动', '耐心'],
'weaknesses': ['可能过于理想化', '对短期波动敏感', '难以接受亏损', '选择范围受限'],
'suitable_stocks': ['ESG主题', '新能源', '社会责任企业', '优质成长股']
},
'INTP': {
'name': '分析型投资者',
'description': '你是一个逻辑严密、善于分析的投资者。喜欢深入研究投资理论和市场机制,构建复杂的投资模型。投资决策基于严谨的分析和数据验证,不轻易相信市场传言。善于发现市场定价错误。',
'investment_style': '量化分析、深度研究、套利交易',
'strengths': ['逻辑性强', '分析能力', '独立思考', '善于发现机会'],
'weaknesses': ['可能过度分析', '行动迟缓', '忽视市场情绪', '过于理论化'],
'suitable_stocks': ['被低估股票', '套利机会', '量化策略', '复杂金融产品']
},
'ESTP': {
'name': '机会型投资者',
'description': '你是一个敏锐、行动力强的投资者。善于发现市场机会并快速行动,喜欢短线交易和波段操作。投资决策基于实时市场信息,不拘泥于长期规划。能够承受较大风险,追求高收益。',
'investment_style': '短线交易、波段操作、机会主义',
'strengths': ['行动力强', '市场敏感', '适应力强', '敢于冒险'],
'weaknesses': ['可能过于冲动', '缺乏长期规划', '风险控制不足', '容易频繁交易'],
'suitable_stocks': ['高波动股票', '题材股', '次新股', '期权期货']
},
'ESFP': {
'name': '社交型投资者',
'description': '你是一个喜欢交流和分享的投资者。投资决策往往受到朋友、社群和市场热点的影响。喜欢讨论投资话题,从他人那里获取信息和灵感。投资风格灵活,容易受市场情绪影响。',
'investment_style': '跟风投资、社交投资、灵活调整',
'strengths': ['信息来源广', '社交能力强', '灵活', '乐观'],
'weaknesses': ['容易受他人影响', '缺乏独立思考', '可能追涨杀跌', '风险控制不足'],
'suitable_stocks': ['热门题材', '市场热点', '朋友推荐', '社交媒体热门']
},
'ENFP': {
'name': '探索型投资者',
'description': '你是一个充满好奇心和热情的投资者。喜欢探索新的投资机会和领域,对新兴行业和创新公司特别感兴趣。投资决策结合直觉和热情,能够看到未来的可能性。投资组合多样化,不拘一格。',
'investment_style': '成长投资、多元化投资、关注创新',
'strengths': ['有远见', '热情', '多元化', '善于发现机会'],
'weaknesses': ['可能过于分散', '缺乏纪律', '容易受情绪影响', '难以坚持策略'],
'suitable_stocks': ['科技股', '创新企业', '新兴市场', '成长型基金']
},
'ENTP': {
'name': '策略型投资者',
'description': '你是一个善于辩论和创新的投资者。喜欢挑战传统投资观念,寻找独特的投资机会。投资决策基于创新思维和策略分析,善于发现市场定价错误。投资风格灵活多变,不拘一格。',
'investment_style': '策略投资、套利交易、创新思维',
'strengths': ['创新思维', '策略能力强', '善于辩论', '灵活'],
'weaknesses': ['可能过于复杂', '缺乏耐心', '容易频繁调整', '风险控制不足'],
'suitable_stocks': ['套利机会', '复杂策略', '被误解的股票', '特殊机会']
},
'ESTJ': {
'name': '管理型投资者',
'description': '你是一个有条理、有执行力的投资者。喜欢制定详细的投资计划并严格执行,投资决策基于系统分析和既定策略。重视投资组合的管理和优化,追求效率和纪律性。倾向于投资管理良好的公司。',
'investment_style': '系统投资、纪律执行、组合管理',
'strengths': ['有组织能力', '纪律性强', '执行力强', '系统化'],
'weaknesses': ['可能过于僵化', '缺乏灵活性', '难以适应变化', '过度依赖系统'],
'suitable_stocks': ['蓝筹股', '指数基金', 'ETF', '优质白马']
},
'ESFJ': {
'name': '服务型投资者',
'description': '你是一个乐于助人、有责任感的投资者。倾向于投资对社会有积极影响的公司,关注企业的社会责任。投资决策结合价值观和他人的建议,喜欢与朋友分享投资经验。重视投资的安全性和稳定性。',
'investment_style': '价值投资、关注ESG、稳健投资',
'strengths': ['有责任感', '关注社会价值', '善于合作', '稳健'],
'weaknesses': ['可能过于保守', '容易受他人影响', '缺乏独立思考', '对变化反应慢'],
'suitable_stocks': ['ESG主题', '消费龙头', '公用事业', '社会责任企业']
},
'ENFJ': {
'name': '影响型投资者',
'description': '你是一个有魅力、有影响力的投资者。喜欢与他人分享投资见解,能够影响和帮助他人做出投资决策。投资决策结合价值观和对他人的关注,倾向于投资有社会责任感的公司。重视投资的社会影响。',
'investment_style': '价值投资、关注影响力、长期持有',
'strengths': ['有影响力', '有同理心', '善于沟通', '有远见'],
'weaknesses': ['可能过于关注他人', '容易受情绪影响', '难以接受亏损', '过度理想化'],
'suitable_stocks': ['ESG主题', '社会责任企业', '影响力投资', '优质成长股']
},
'ENTJ': {
'name': '领袖型投资者',
'description': '你是一个有领导力、有战略眼光的投资者。喜欢制定宏大的投资策略并积极执行,投资决策基于深入分析和战略思考。能够看到市场的大趋势,善于把握重大投资机会。投资风格积极主动,追求卓越回报。',
'investment_style': '战略投资、积极管理、追求卓越',
'strengths': ['有领导力', '战略眼光', '执行力强', '自信'],
'weaknesses': ['可能过于强势', '难以接受不同观点', '风险偏好高', '过度集中'],
'suitable_stocks': ['行业龙头', '成长股', '科技股', '优质白马']
}
}
# 股市投资风格测试问题
QUESTIONS = [
# E vs I - 社交与能量来源
{
'dimension': 'EI',
'question': '在股市投资中,你更倾向于:',
'options': [
'积极参与投资社区讨论,与他人分享观点',
'独自研究和分析,不依赖他人意见'
]
},
{
'dimension': 'EI',
'question': '当你发现一个投资机会时,你会:',
'options': [
'立即告诉朋友,一起讨论和验证',
'先自己深入研究,确认后再考虑分享'
]
},
{
'dimension': 'EI',
'question': '在投资决策过程中,你更喜欢:',
'options': [
'与他人讨论,听取不同意见',
'独立思考,不受他人影响'
]
},
# S vs N - 信息收集方式
{
'dimension': 'SN',
'question': '分析股票时,你更关注:',
'options': [
'具体的财务数据、市盈率、市净率等指标',
'公司的商业模式、行业趋势和未来潜力'
]
},
{
'dimension': 'SN',
'question': '做投资决策时,你更看重:',
'options': [
'历史业绩和可验证的数据',
'未来成长性和行业前景'
]
},
{
'dimension': 'SN',
'question': '你更相信:',
'options': [
'技术分析和历史走势',
'基本面分析和行业逻辑'
]
},
# T vs F - 决策方式
{
'dimension': 'TF',
'question': '面对投资亏损时,你会:',
'options': [
'理性分析原因,调整策略',
'感到焦虑,考虑是否应该止损'
]
},
{
'dimension': 'TF',
'question': '选择股票时,你更看重:',
'options': [
'公司的盈利能力和估值水平',
'公司的社会价值和影响力'
]
},
{
'dimension': 'TF',
'question': '做投资决策时,你更依赖:',
'options': [
'逻辑分析和客观数据',
'直觉和市场情绪'
]
},
# J vs P - 生活方式
{
'dimension': 'JP',
'question': '你的投资风格是:',
'options': [
'制定详细计划,严格执行',
'灵活应对,根据市场变化调整'
]
},
{
'dimension': 'JP',
'question': '面对市场波动,你会:',
'options': [
'提前设定止损止盈点,按计划执行',
'根据情况随时调整,保持灵活性'
]
},
{
'dimension': 'JP',
'question': '管理投资组合时,你更喜欢:',
'options': [
'定期调整和平衡,保持目标配置',
'保持开放,根据机会灵活调整'
]
}
]
def calculate_scores(answers: Dict[str, int]) -> Dict[str, int]:
"""计算各维度的得分"""
scores = {
'E': 0, 'I': 0,
'S': 0, 'N': 0,
'T': 0, 'F': 0,
'J': 0, 'P': 0
}
for question_idx, answer in answers.items():
question = QUESTIONS[int(question_idx)]
dimension = question['dimension']
if dimension == 'EI':
if answer == 0: # 第一个选项偏向E
scores['E'] += 1
else: # 第二个选项偏向I
scores['I'] += 1
elif dimension == 'SN':
if answer == 0: # 第一个选项偏向S
scores['S'] += 1
else: # 第二个选项偏向N
scores['N'] += 1
elif dimension == 'TF':
if answer == 0: # 第一个选项偏向T
scores['T'] += 1
else: # 第二个选项偏向F
scores['F'] += 1
elif dimension == 'JP':
if answer == 0: # 第一个选项偏向J
scores['J'] += 1
else: # 第二个选项偏向P
scores['P'] += 1
return scores
def determine_mbti_type(scores: Dict[str, int]) -> str:
"""根据得分确定MBTI类型"""
mbti = ''
mbti += 'E' if scores['E'] >= scores['I'] else 'I'
mbti += 'S' if scores['S'] >= scores['N'] else 'N'
mbti += 'T' if scores['T'] >= scores['F'] else 'F'
mbti += 'J' if scores['J'] >= scores['P'] else 'P'
return mbti
def render_welcome_page():
"""渲染欢迎页面"""
st.markdown('<div class="main-header"><h1>📈 股市投资风格 MBTI 测试</h1><p>通过投资行为分析你的性格类型</p></div>',
unsafe_allow_html=True)
st.markdown("""
### 📋 关于测试
这是一个基于投资行为的 MBTI 人格测试。通过分析你在股市投资中的行为模式、决策方式和思维习惯,来揭示你的性格类型。
测试将评估你在以下四个维度上的偏好:
- **E vs I** - 外向 vs 内向:你在投资中如何获取信息和能量
- **S vs N** - 实感 vs 直觉:你如何收集和分析投资信息
- **T vs F** - 思考 vs 情感:你如何做投资决策
- **J vs P** - 判断 vs 感知:你如何管理投资组合
### ⏱️ 测试说明
- 共 12 道题目,全部与股市投资相关
- 每道题有 2 个选项
- 选择最符合你真实投资行为的答案
- 测试时间约 3-5 分钟
### 💡 温馨提示
- 请根据你实际的投资行为回答,而不是理想中的行为
- 选择最自然、最符合你日常投资习惯的答案
- 没有对错之分,每种投资风格都有其优势和适用场景
- 测试结果仅供参考,不构成投资建议
""")
if st.button("开始测试", key="start_test", use_container_width=True):
st.session_state.current_page = 'test'
st.session_state.current_question = 0
st.session_state.answers = {}
st.rerun()
def render_test_page():
"""渲染测试页面"""
st.markdown('<div class="main-header"><h1>📈 股市投资风格 MBTI 测试</h1></div>', unsafe_allow_html=True)
# 进度条
progress = (st.session_state.current_question + 1) / len(QUESTIONS)
st.progress(progress)
st.markdown(f"<p style='text-align: center;'>问题 {st.session_state.current_question + 1} / {len(QUESTIONS)}</p>",
unsafe_allow_html=True)
# 显示当前问题
question = QUESTIONS[st.session_state.current_question]
st.markdown(f'<div class="question-box"><h3>{question["question"]}</h3></div>', unsafe_allow_html=True)
# 选项按钮
col1, col2 = st.columns(2)
with col1:
if st.button(question['options'][0], key=f"option_{st.session_state.current_question}_0",
use_container_width=True):
st.session_state.answers[str(st.session_state.current_question)] = 0
next_question()
with col2:
if st.button(question['options'][1], key=f"option_{st.session_state.current_question}_1",
use_container_width=True):
st.session_state.answers[str(st.session_state.current_question)] = 1
next_question()
# 返回按钮
if st.session_state.current_question > 0:
if st.button("← 上一题", key="prev_question", use_container_width=True):
st.session_state.current_question -= 1
st.rerun()
def next_question():
"""进入下一题"""
if st.session_state.current_question < len(QUESTIONS) - 1:
st.session_state.current_question += 1
st.rerun()
else:
st.session_state.current_page = 'result'
st.rerun()
def render_result_page():
"""渲染结果页面"""
st.markdown('<div class="main-header"><h1>🎉 测试完成!</h1></div>', unsafe_allow_html=True)
# 计算得分
scores = calculate_scores(st.session_state.answers)
mbti_type = determine_mbti_type(scores)
# 显示结果
result_info = MBTI_TYPES[mbti_type]
st.markdown(
f'<div class="result-card"><h2 style="text-align: center;">{mbti_type} - {result_info["name"]}</h2></div>',
unsafe_allow_html=True)
st.markdown(f"""
### 📝 投资风格描述
{result_info['description']}
""")
# 投资风格标签
st.markdown(f'<div class="investment-style"><h3>💼 投资风格:{result_info["investment_style"]}</h3></div>',
unsafe_allow_html=True)
# 显示各维度得分
st.markdown("### 📊 维度分析")
# E vs I
e_percent = scores['E'] / (scores['E'] + scores['I']) * 100 if (scores['E'] + scores['I']) > 0 else 50
i_percent = 100 - e_percent
st.markdown(f"**外向 (E) vs 内向 (I)** - 投资中的信息获取方式")
st.markdown(
f'<div class="dimension-bar"><div class="dimension-fill" style="width: {e_percent}%; background: #1e3c72;"></div></div>',
unsafe_allow_html=True)
st.markdown(f"<p>E: {e_percent:.1f}% | I: {i_percent:.1f}%</p>", unsafe_allow_html=True)
# S vs N
s_percent = scores['S'] / (scores['S'] + scores['N']) * 100 if (scores['S'] + scores['N']) > 0 else 50
n_percent = 100 - s_percent
st.markdown(f"**实感 (S) vs 直觉 (N)** - 投资信息分析方式")
st.markdown(
f'<div class="dimension-bar"><div class="dimension-fill" style="width: {s_percent}%; background: #2a5298;"></div></div>',
unsafe_allow_html=True)
st.markdown(f"<p>S: {s_percent:.1f}% | N: {n_percent:.1f}%</p>", unsafe_allow_html=True)
# T vs F
t_percent = scores['T'] / (scores['T'] + scores['F']) * 100 if (scores['T'] + scores['F']) > 0 else 50
f_percent = 100 - t_percent
st.markdown(f"**思考 (T) vs 情感 (F)** - 投资决策方式")
st.markdown(
f'<div class="dimension-bar"><div class="dimension-fill" style="width: {t_percent}%; background: #28a745;"></div></div>',
unsafe_allow_html=True)
st.markdown(f"<p>T: {t_percent:.1f}% | F: {f_percent:.1f}%</p>", unsafe_allow_html=True)
# J vs P
j_percent = scores['J'] / (scores['J'] + scores['P']) * 100 if (scores['J'] + scores['P']) > 0 else 50
p_percent = 100 - j_percent
st.markdown(f"**判断 (J) vs 感知 (P)** - 投资组合管理方式")
st.markdown(
f'<div class="dimension-bar"><div class="dimension-fill" style="width: {j_percent}%; background: #ffc107;"></div></div>',
unsafe_allow_html=True)
st.markdown(f"<p>J: {j_percent:.1f}% | P: {p_percent:.1f}%</p>", unsafe_allow_html=True)
# 优势和劣势
col1, col2 = st.columns(2)
with col1:
st.markdown("### ✅ 投资优势")
for strength in result_info['strengths']:
st.markdown(f"- {strength}")
with col2:
st.markdown("### ⚠️ 需要注意")
for weakness in result_info['weaknesses']:
st.markdown(f"- {weakness}")
# 适合的股票类型
st.markdown("### 🎯 适合的投资标的")
suitable_stocks = "、".join(result_info['suitable_stocks'])
st.markdown(f"<p>{suitable_stocks}</p>", unsafe_allow_html=True)
# 免责声明
st.markdown("---")
st.markdown("""
### ⚠️ 免责声明
- 本测试仅供娱乐和自我了解,不构成任何投资建议
- 投资有风险,入市需谨慎
- 请根据自身风险承受能力和投资目标做出决策
- 建议结合专业投资顾问的意见进行投资
""")
# 重新测试按钮
if st.button("重新测试", key="retake_test", use_container_width=True):
st.session_state.current_page = 'welcome'
st.session_state.current_question = 0
st.session_state.answers = {}
st.rerun()
def main():
"""主函数"""
# 初始化 session state
if 'current_page' not in st.session_state:
st.session_state.current_page = 'welcome'
if 'current_question' not in st.session_state:
st.session_state.current_question = 0
if 'answers' not in st.session_state:
st.session_state.answers = {}
# 根据当前页面渲染不同内容
if st.session_state.current_page == 'welcome':
render_welcome_page()
elif st.session_state.current_page == 'test':
render_test_page()
elif st.session_state.current_page == 'result':
render_result_page()
if __name__ == '__main__':
main()选择适合自己性格的交易方式