有同学问我,怎么用Python实现策略选股, 我其实自己用得很low的,就是用的问财自然语句管理我的不同策略。不管是 竞价模式、 盘中追涨模式、一进二模式 , 我就是用自然语句实现的。虽然我知道 一些同学 是用聚宽因子 或QMT因子、 或通达信选股实现。 每个人的习惯不一样, 选择自己习惯的方式就好了。 需要注意的一点,问财的自然语句 需要自己确认语句稳定性,因为一些问法 问财不一定能正确识别。 对于严谨的同学,完全可以自己用 财务因子、情绪因子、资金因子 自行用Python代码实现选股。也许有同学会说,用同花顺APP分组也可以做到这点,为啥这里用界面实现。 其实你的策略一旦稳定, 你后期完全可以用Python语言借助miniqmt自动交易的。我之前写过问财+miniqmt自动交易的文章,以及问财+miniqmt的文章, 感兴趣的同学可以翻一翻。 如果需要miniqmt开户,可以找我咨询。 我写的文章很杂, 比如库 akshare、 tushare、 miniqmt、mootdx、pywencai等有在用,其实这些工具我在不同的阶段都有用到部分。 tushare这1周出问题,一些同学慌了,没有备用方案。 就像股票投资名言, 不要把鸡蛋放在同一个篮子里。 我们做技术的也一样,也要有备用技术方案。 就像我之前写的问财选股,我还专门写了一套 东方财富条件选股做备用。这里贴一下完整代码,参考下思路, 具体根据自己的实际情况改造。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。 希望我的分享对大家有所帮助import streamlit as st
import pandas as pd
import json
import os
import pywencai
if 'strategies' not in st.session_state:
st.session_state.strategies = {}
if 'last_result' not in st.session_state:
st.session_state.last_result = None
STRATEGY_FILE = "wencai_strategies.json"
def load_strategies():
if os.path.exists(STRATEGY_FILE):
with open(STRATEGY_FILE, 'r') as f:
st.session_state.strategies = json.load(f)
def save_strategies():
with open(STRATEGY_FILE, 'w') as f:
json.dump(st.session_state.strategies, f, indent=2)
def run_wencai_query(query_str):
"""执行问财查询并返回结果"""
try:
if not query_str:
st.warning("查询条件不能为空")
return None
result = pywencai.get(query=query_str)
return result
except Exception as e:
st.error(f"查询失败: {str(e)}")
return None
st.set_page_config(
page_title="问财策略查询工具",
page_icon="📊",
layout="wide"
)
load_strategies()
with st.sidebar:
st.header("📋 策略管理")
with st.expander("➕ 添加新策略", expanded=False):
with st.form("add_strategy"):
strategy_name = st.text_input("策略名称", key="strategy_name")
condition = st.text_area("完整查询语句", key="condition_input",
help="例如: ROE连续三年大于10%,净利率同比增长超过20%,市盈率小于30")
submit = st.form_submit_button("保存策略")
if submit and strategy_name:
if strategy_name in st.session_state.strategies:
st.warning("该策略名称已存在!")
elif not condition.strip():
st.warning("请输入查询语句")
else:
st.session_state.strategies[strategy_name] = {
"query": condition.strip(),
"last_used": pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S")
}
save_strategies()
st.success(f"策略 '{strategy_name}' 已保存!")
st.divider()
st.subheader("已保存策略")
if not st.session_state.strategies:
st.info("暂无策略,请添加新策略")
else:
for name, details in list(st.session_state.strategies.items()):
col1, col2 = st.columns([0.7, 0.3])
with col1:
st.markdown(f"**{name}**")
st.caption(f"最后使用: {details['last_used']}")
with col2:
if st.button("删除", key=f"del_{name}"):
del st.session_state.strategies[name]
save_strategies()
st.rerun()
st.title("📊 问财策略查询")
if st.session_state.strategies:
selected_strategy = st.selectbox(
"选择策略",
list(st.session_state.strategies.keys()),
index=0
)
strategy_details = st.session_state.strategies[selected_strategy]
query_str = strategy_details["query"]
st.subheader("策略详情")
st.info(f"**策略名称**: {selected_strategy}")
st.code(query_str, language="sql")
with st.expander("✏️ 编辑策略", expanded=False):
new_query = st.text_area("修改查询语句", value=query_str, height=150)
if st.button("💾 保存修改", key=f"update_{selected_strategy}"):
st.session_state.strategies[selected_strategy]["query"] = new_query.strip()
save_strategies()
st.success("策略已更新!")
st.rerun()
if st.button("🚀 执行查询", type="primary", key="run_query"):
with st.spinner(f"执行中... 正在查询 {selected_strategy}"):
st.session_state.strategies[selected_strategy]["last_used"] = pd.Timestamp.now().strftime(
"%Y-%m-%d %H:%M:%S")
save_strategies()
result = run_wencai_query(query_str)
if result is not None:
if not
result.empty:
st.session_state.last_result = result
st.session_state.last_strategy = selected_strategy
st.session_state.last_query = query_str
else:
st.info("未找到匹配的结果")
if st.session_state.last_result is not None:
st.divider()
st.subheader(f"查询结果: {st.session_state.last_strategy}")
st.info(f"**查询语句**: {st.session_state.last_query}")
df = st.session_state.last_result
if '代码' in df.columns:
df['代码'] = df['代码'].astype(str).str.zfill(6)
st.dataframe(df, height=600)
csv = df.to_csv(index=False).encode('utf-8')
st.download_button(
label="下载CSV",
data=csv,
file_name=f"wencai_{st.session_state.last_strategy.replace(' ', '_')}.csv",
mime='text/csv'
)
else:
st.info("请选择策略后执行查询,或使用直接查询功能")
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。如果对每日复盘感兴趣,欢迎关注我另外一个号。重在市场理解(大盘情绪、 热门概念板块、 热门个股), 技术只是辅助。 另外每天板块RPS变化也会在盘后更新在这个号上。