date: 2025-11-05 updated: 2025-11-05 conversation_id: d4adaea8-2e09-4f68-9026-2f3925e52786 title: "翻倍股分析报告生成代码续写" tags: [deepseek, conversation] ---
翻倍股分析报告生成代码续写
创建时间: 2025-11-05 22:30
👤 用户:
import method_all import datetime import time import pandas as pd
def gethisdata(tradedate): tradedatedf = methodall.sys.getnjjtradedate(tradedate, 30) tradedate = tradedatedf['tradedate'].max() tradedatefirst = tradedatedf['tradedate'].min() sql = f"""SELECT code, risemax, fallmax, overhigh, highdate, highprice, lowdate, lowprice, low2price, topnum, topscore6 FROM njjcattlelist where tradedate <= '{tradedate}' and tradedate >= '{tradedatefirst}' and type = '半年内' """ #获取当前最新的股票列表 df = methodall.mysql.sql(sql) #找出当日数据 dfnow = df[df['tradedate'] == tradedate] dflast = df[df['tradedate'] < tradedate] #找出翻倍的股票 dfdouble = dfnow[dfnow['risemax'] >= 100] dfdoublelast = dflast[dflast['risemax'] >= 100] doublecodelist = list(dfdouble['code'].unique()) doublecodelistlast = list(dfdoublelast['code'].unique()) for code in doublecodelist: if code not in doublecodelistlast: print(code) #获取该股票的详细数据 dfdetail = dfnow[dfnow['code'] == code] #描述股票当前状态
return(df)
now = str(datetime.datetime.now()) print(gethisdata(now[0:10]))
基于以上代码续写对新晋翻倍股的描述,可适当拓展
💭 思考过程
我们首先需要获取到新晋翻倍股,即在上一个交易日还没有翻倍,但在当前交易日翻倍的股票。 然后,对于每一只新晋翻倍股,我们需要从当前交易日的数据中获取它的详细信息,并生成描述。 描述可以包括:代码、名称、最大涨幅、最大跌幅、是否突破前高、突破前高的日期和价格、最低点的日期和价格、次低点价格、顶部形态数量、顶部评分等。 另外,我们可以根据这些信息进一步拓展描述,比如计算从最低点到当前点的涨幅,以及突破前高后的涨幅等。
由于原代码中已经获取了当前交易日和之前交易日的数据,并找出了新晋翻倍股,我们只需要对这些股票进行描述。
步骤:
- 获取当前交易日和前一交易日的翻倍股列表,找出新晋翻倍股。
- 对于每只新晋翻倍股,从当前交易日的数据中获取该股票的记录(可能有多条,因为我们查询的时间段内可能有多个交易日,但当前交易日每个股票应该只有一条)。
- 获取股票的基本信息(如名称)可能需要另外查询,这里我们假设已经有方法可以获取股票名称。
- 生成描述文本。
由于原代码中已经打印了代码,我们接下来需要获取股票名称,并构建描述。
假设我们有一个方法可以获取股票名称,例如:methodall.sys.getstock_name(code)
我们还可以考虑从其他数据源获取更多信息,比如股票所属行业、概念等,但根据现有代码,我们只有njjcattlelist表中的字段。
我们可以根据已有的字段进行描述:
- 代码和名称
- 最大涨幅(risemax)和最大跌幅(fallmax)
- 是否突破前高(overhigh)以及突破前高的日期(highdate)和价格(high_price)
- 最低点的日期(lowdate)和价格(lowprice),以及次低点价格(low2_price)
- 顶部形态数量(topnum)和顶部评分(topscore6)
我们可以这样描述:
“{股票代码} {股票名称} 成为新晋翻倍股,自最低点{最低点价格}(日期:{最低点日期})以来,最大涨幅达到{最大涨幅}%,期间最大回撤{最大跌幅}%。 该股于{突破前高日期}突破前高{前高价格},目前顶部形态数量为{顶部形态数量},顶部评分为{顶部评分}。”
但是,注意我们可能有多条记录,但当前交易日每个股票只有一条,所以我们可以直接取第一条。
另外,我们可能需要计算从最低点到当前点的涨幅,但这里我们已经有了最大涨幅,所以可以直接用。
我们还可以考虑描述次低点的情况,以及是否形成双底等,但根据现有数据,我们只有次低点价格,可以简单提一下。
由于代码中已经打印了代码,我们接下来将代码修改为生成描述文本。
注意:原代码中获取的数据框df包含多个交易日,但我们在处理时已经按当前交易日和之前交易日分开。
我们假设methodall.sys.getstock_name(code)可以获取股票名称。
由于原代码中已经有一个循环打印新晋翻倍股的代码,我们在那里进行描述。
修改循环内的代码,获取股票名称,并构建描述字符串。
另外,我们可能还需要注意,如果股票在同一天有多条记录(理论上不应该),我们只取第一条。
我们还可以考虑将描述写入文件或发送到其他地方,但这里我们先打印出来。
由于原代码返回的是df,我们可能不需要返回,而是直接输出描述。但根据要求,我们续写代码,所以保持原返回。
我们修改循环内的代码,不再只是打印代码,而是打印描述。
另外,我们可能还需要考虑数据中没有股票名称,所以我们需要一个函数来获取股票名称。
由于原代码中没有提供获取股票名称的方法,我们假设有一个方法,如果没有,我们可以从数据库或其他地方获取。
这里我们假设使用methodall.sys.getstock_name(code)来获取。
如果无法获取,我们可以先只用代码。
我们还可以考虑获取当前价格,但这里我们没有当前价格,所以描述中不体现。
现在,我们修改循环内的代码。
基于您的代码,我来续写对新晋翻倍股的详细描述功能。以下是完整的代码:
import method_all
import datetime
import time
import pandas as pd
def get_stock_basic_info(code):
"""获取股票基本信息"""
try:
# 假设有获取股票名称和行业的方法
sql = f"SELECT name, industry FROM stock_basic WHERE code = '{code}'"
result = method_all.mysql.sql(sql)
if not result.empty:
return result.iloc[0]['name'], result.iloc[0]['industry']
return "未知", "未知"
except:
return "未知", "未知"
def analyze_stock_trend(df_detail, code):
"""分析股票趋势特征"""
stock_data = df_detail[df_detail['code'] == code].iloc[0]
features = []
# 分析涨幅特征
rise_max = stock_data['rise_max']
if rise_max >= 200:
features.append("三倍股")
elif rise_max >= 150:
features.append("两倍半股")
elif rise_max >= 100:
features.append("翻倍股")
# 分析回撤特征
fall_max = stock_data['fall_max']
if fall_max <= 20:
features.append("强势整理")
elif fall_max <= 35:
features.append("正常调整")
else:
features.append("大幅震荡")
# 分析突破特征
if stock_data['over_high'] == 1:
features.append("突破前高")
# 分析顶部特征
if stock_data['top_num'] == 0:
features.append("无顶部形态")
elif stock_data['top_score6'] <= 30:
features.append("顶部风险较低")
else:
features.append("需警惕顶部")
return features
def generate_stock_description(code, df_detail):
"""生成股票描述文本"""
stock_data = df_detail[df_detail['code'] == code].iloc[0]
name, industry = get_stock_basic_info(code)
# 分析趋势特征
features = analyze_stock_trend(df_detail, code)
# 构建描述文本
description = f"""
【{code} {name}】翻倍股分析报告
───────────────────────
📈 基本概况:
• 所属行业:{industry}
• 累计涨幅:{stock_data['rise_max']:.1f}%
• 最大回撤:{stock_data['fall_max']:.1f}%
• 当前状态:{'已突破前高' if stock_data['over_high'] == 1 else '尚未突破前高'}
📊 关键点位:
• 最低点:{stock_data['low_price']:.2f}元({stock_data['low_date']})
• 次低点:{stock_data['low2_price']:.2f}元
• 前高点:{stock_data['high_price']:.2f}元({stock_data['high_date']})
🎯 技术特征:{', '.join(features)}
• 顶部形态数量:{stock_data['top_num']}个
• 顶部评分:{stock_data['top_score6']}/100
💡 投资建议:
{generate_investment_advice(stock_data)}
"""
return description
def generate_investment_advice(stock_data):
"""生成投资建议"""
advice = []
rise_max = stock_data['rise_max']
fall_max = stock_data['fall_max']
top_score = stock_data['top_score6']
if rise_max <= 120:
advice.append("涨幅相对温和,仍有上行空间")
elif rise_max <= 180:
advice.append("涨幅较大,注意获利了结")
else:
advice.append("涨幅巨大,风险较高")
if fall_max <= 25:
advice.append("走势稳健,控盘良好")
elif fall_max <= 40:
advice.append("波动正常,适合波段操作")
else:
advice.append("波动剧烈,注意风险控制")
if top_score >= 60:
advice.append("顶部信号明显,建议谨慎")
elif top_score >= 40:
advice.append("存在顶部风险,注意观察")
else:
advice.append("顶部风险较小,可继续持有")
return ";".join(advice)
def get_recent_performance(code, trade_date):
"""获取近期表现"""
try:
sql = f"""
SELECT trade_date, close_price, volume
FROM stock_daily
WHERE code = '{code}'
AND trade_date <= '{trade_date}'
ORDER BY trade_date DESC
LIMIT 10
"""
df_recent = method_all.mysql.sql(sql)
if len(df_recent) >= 2:
latest_close = df_recent.iloc[0]['close_price']
prev_close = df_recent.iloc[1]['close_price']
daily_change = (latest_close - prev_close) / prev_close * 100
return daily_change, df_recent.iloc[0]['volume']
return 0, 0
except:
return 0, 0
#写翻倍股文章
def get_his_data(trade_date):
trade_date_df = method_all.sys.get_njj_trade_date(trade_date, 30)
trade_date = trade_date_df['trade_date'].max()
trade_date_first = trade_date_df['trade_date'].min()
sql = f"""SELECT
trade_date,
code,
rise_max,
fall_max,
over_high,
high_date,
high_price,
low_date,
low_price,
low2_price,
top_num,
top_score6
FROM
njj_cattle_list
where trade_date <= '{trade_date}'
and trade_date >= '{trade_date_first}'
and type = '半年内'
"""
#获取当前最新的股票列表
df = method_all.mysql.sql(sql)
#找出当日数据
df_now = df[df['trade_date'] == trade_date]
df_last = df[df['trade_date'] < trade_date]
#找出翻倍的股票
df_double = df_now[df_now['rise_max'] >= 100]
df_double_last = df_last[df_last['rise_max'] >= 100]
double_code_list = list(df_double['code'].unique())
double_code_list_last = list(df_double_last['code'].unique())
new_double_stocks = []
print(f"\n🎯 {trade_date} 新晋翻倍股分析报告")
print("=" * 50)
for code in double_code_list:
if code not in double_code_list_last:
print(f"\n🔍 发现新晋翻倍股: {code}")
# 获取近期表现
daily_change, volume = get_recent_performance(code, trade_date)
# 生成详细描述
description = generate_stock_description(code, df_now)
print(description)
# 添加到新晋翻倍股列表
new_double_stocks.append({
'code': code,
'rise_max': df_now[df_now['code'] == code].iloc[0]['rise_max'],
'daily_change': daily_change
})
# 生成总结报告
if new_double_stocks:
print(f"\n📊 总结报告")
print("-" * 30)
print(f"今日新晋翻倍股数量: {len(new_double_stocks)}只")
# 按涨幅排序
new_double_stocks.sort(key=lambda x: x['rise_max'], reverse=True)
for i, stock in enumerate(new_double_stocks, 1):
print(f"{i}. {stock['code']} - 涨幅:{stock['rise_max']:.1f}% - 今日涨跌:{stock['daily_change']:+.1f}%")
else:
print("\n📝 今日无新晋翻倍股")
return df
# 运行主函数
if __name__ == "__main__":
now = str(datetime.datetime.now())
result_df = get_his_data(now[0:10])
这个续写版本增加了以下功能:
- 股票基本信息获取:获取股票名称和行业信息
- 趋势特征分析:分析股票的涨幅、回撤、突破等特征
- 详细描述生成:生成格式化的股票分析报告
- 投资建议:基于技术指标给出投资建议
- 近期表现:获取股票近期价格和成交量数据
- 总结报告:对所有新晋翻倍股进行汇总分析
输出示例:
🎯 2024-01-20 新晋翻倍股分析报告
==================================================
🔍 发现新晋翻倍股: 000001
【000001 平安银行】翻倍股分析报告
───────────────────────
📈 基本概况:
• 所属行业:银行
• 累计涨幅:125.5%
• 最大回撤:18.3%
• 当前状态:已突破前高
📊 关键点位:
• 最低点:8.50元(2023-06-15)
• 次低点:9.20元
• 前高点:15.80元(2024-01-18)
🎯 技术特征:翻倍股, 强势整理, 突破前高, 顶部风险较低
• 顶部形态数量:0个
• 顶部评分:15/100
💡 投资建议:
涨幅相对温和,仍有上行空间;走势稳健,控盘良好;顶部风险较小,可继续持有
这样就能对新晋翻倍股进行全面的分析和描述了。
👤 用户:
输出为Markdown
💭 思考过程
我们将输出Markdown格式的报告。为了保持代码结构,我们只需要在生成描述时使用Markdown的标记即可。 注意:我们假设已经有一个获取股票基本信息(如名称和行业)的方法,这里用getstockbasicinfo函数表示。 由于实际环境中可能没有stockbasic表,我们在这里用假设的方式。如果实际环境中没有,可能需要调整。
我们调整generatestockdescription函数,使其返回Markdown格式的字符串。
另外,我们假设getrecentperformance函数可以获取最近一天的涨跌幅和成交量。
由于原代码中获取历史数据的表njjcattlelist包含多个交易日,我们按照原逻辑处理。
我们继续使用之前定义的函数,但将其输出格式调整为Markdown。
注意:原代码中在生成描述时使用了一些表情符号,这些在Markdown中是可以使用的。
我们假设method_all.mysql.sql可以正常执行并返回DataFrame。
由于我们无法实际连接数据库,所以以下代码为逻辑代码,需要根据实际环境调整。
现在,我们开始调整输出为Markdown格式。
以下是输出为Markdown格式的完整代码:
import method_all
import datetime
import time
import pandas as pd
def get_stock_basic_info(code):
"""获取股票基本信息"""
try:
# 假设有获取股票名称和行业的方法
sql = f"SELECT name, industry FROM stock_basic WHERE code = '{code}'"
result = method_all.mysql.sql(sql)
if not result.empty:
return result.iloc[0]['name'], result.iloc[0]['industry']
return "未知", "未知"
except:
return "未知", "未知"
def analyze_stock_trend(df_detail, code):
"""分析股票趋势特征"""
stock_data = df_detail[df_detail['code'] == code].iloc[0]
features = []
# 分析涨幅特征
rise_max = stock_data['rise_max']
if rise_max >= 200:
features.append("三倍股")
elif rise_max >= 150:
features.append("两倍半股")
elif rise_max >= 100:
features.append("翻倍股")
# 分析回撤特征
fall_max = stock_data['fall_max']
if fall_max <= 20:
features.append("强势整理")
elif fall_max <= 35:
features.append("正常调整")
else:
features.append("大幅震荡")
# 分析突破特征
if stock_data['over_high'] == 1:
features.append("突破前高")
# 分析顶部特征
if stock_data['top_num'] == 0:
features.append("无顶部形态")
elif stock_data['top_score6'] <= 30:
features.append("顶部风险较低")
else:
features.append("需警惕顶部")
return features
def generate_stock_description(code, df_detail):
"""生成股票描述文本 - Markdown格式"""
stock_data = df_detail[df_detail['code'] == code].iloc[0]
name, industry = get_stock_basic_info(code)
# 分析趋势特征
features = analyze_stock_trend(df_detail, code)
# 构建Markdown格式的描述文本
description = f"""
## {code} {name} - 翻倍股分析报告
---
### 📈 基本概况
| 指标 | 数值 |
|------|------|
| **所属行业** | {industry} |
| **累计涨幅** | {stock_data['rise_max']:.1f}% |
| **最大回撤** | {stock_data['fall_max']:.1f}% |
| **突破状态** | {'✅ 已突破前高' if stock_data['over_high'] == 1 else '⏳ 尚未突破前高'} |
### 📊 关键点位
| 点位类型 | 价格 | 日期 |
|----------|------|------|
| **最低点** | {stock_data['low_price']:.2f}元 | {stock_data['low_date']} |
| **次低点** | {stock_data['low2_price']:.2f}元 | - |
| **前高点** | {stock_data['high_price']:.2f}元 | {stock_data['high_date']} |
### 🎯 技术特征
**主要特征:**
- {", ".join(features)}
**量化指标:**
- 顶部形态数量:`{stock_data['top_num']}个`
- 顶部评分:`{stock_data['top_score6']}/100`
### 💡 投资建议
> {generate_investment_advice(stock_data)}
"""
return description
def generate_investment_advice(stock_data):
"""生成投资建议"""
advice = []
rise_max = stock_data['rise_max']
fall_max = stock_data['fall_max']
top_score = stock_data['top_score6']
if rise_max <= 120:
advice.append("📈 涨幅相对温和,仍有上行空间")
elif rise_max <= 180:
advice.append("⚠️ 涨幅较大,注意获利了结")
else:
advice.append("🚨 涨幅巨大,风险较高")
if fall_max <= 25:
advice.append("💪 走势稳健,控盘良好")
elif fall_max <= 40:
advice.append("🔄 波动正常,适合波段操作")
else:
advice.append("🌊 波动剧烈,注意风险控制")
if top_score >= 60:
advice.append("🔻 顶部信号明显,建议谨慎")
elif top_score >= 40:
advice.append("⚠️ 存在顶部风险,注意观察")
else:
advice.append("✅ 顶部风险较小,可继续持有")
return " | ".join(advice)
def get_recent_performance(code, trade_date):
"""获取近期表现"""
try:
sql = f"""
SELECT trade_date, close_price, volume
FROM stock_daily
WHERE code = '{code}'
AND trade_date <= '{trade_date}'
ORDER BY trade_date DESC
LIMIT 10
"""
df_recent = method_all.mysql.sql(sql)
if len(df_recent) >= 2:
latest_close = df_recent.iloc[0]['close_price']
prev_close = df_recent.iloc[1]['close_price']
daily_change = (latest_close - prev_close) / prev_close * 100
return daily_change, df_recent.iloc[0]['volume']
return 0, 0
except:
return 0, 0
def generate_markdown_report(new_double_stocks, trade_date):
"""生成Markdown格式的总结报告"""
markdown_content = f"""# 📈 {trade_date} 新晋翻倍股分析报告
---
## 📊 总体概览
| 统计指标 | 数值 |
|----------|------|
| **新晋翻倍股数量** | **{len(new_double_stocks)}只** |
| **分析日期** | {trade_date} |
| **数据来源** | njj_cattle_list |
## 🎯 个股分析
"""
# 按涨幅排序
new_double_stocks.sort(key=lambda x: x['rise_max'], reverse=True)
for i, stock in enumerate(new_double_stocks, 1):
markdown_content += f"\n### {i}. {stock['code']}\n"
markdown_content += f"- **累计涨幅**: `{stock['rise_max']:.1f}%`\n"
markdown_content += f"- **今日涨跌**: `{stock['daily_change']:+.1f}%`\n"
markdown_content += f"- **状态**: {'🚀 新晋翻倍' if stock['rise_max'] >= 100 else '📈 接近翻倍'}\n"
markdown_content += """
---
## 💡 投资提示
> 以上分析基于历史数据,投资有风险,入市需谨慎。
**风险等级说明:**
- 🟢 低风险:涨幅温和,回撤可控
- 🟡 中风险:涨幅适中,需关注顶部信号
- 🔴 高风险:涨幅巨大,波动剧烈
---
*报告生成时间:{}*
""".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
return markdown_content
# 写翻倍股文章
def get_his_data(trade_date):
trade_date_df = method_all.sys.get_njj_trade_date(trade_date, 30)
trade_date = trade_date_df['trade_date'].max()
trade_date_first = trade_date_df['trade_date'].min()
sql = f"""SELECT
trade_date,
code,
rise_max,
fall_max,
over_high,
high_date,
high_price,
low_date,
low_price,
low2_price,
top_num,
top_score6
FROM
njj_cattle_list
where trade_date <= '{trade_date}'
and trade_date >= '{trade_date_first}'
and type = '半年内'
"""
# 获取当前最新的股票列表
df = method_all.mysql.sql(sql)
# 找出当日数据
df_now = df[df['trade_date'] == trade_date]
df_last = df[df['trade_date'] < trade_date]
# 找出翻倍的股票
df_double = df_now[df_now['rise_max'] >= 100]
df_double_last = df_last[df_last['rise_max'] >= 100]
double_code_list = list(df_double['code'].unique())
double_code_list_last = list(df_double_last['code'].unique())
new_double_stocks = []
print(f"# 📈 {trade_date} 新晋翻倍股分析报告\n")
print("---\n")
for code in double_code_list:
if code not in double_code_list_last:
print(f"## 🔍 发现新晋翻倍股: {code}\n")
# 获取近期表现
daily_change, volume = get_recent_performance(code, trade_date)
# 生成详细描述
description = generate_stock_description(code, df_now)
print(description)
# 添加到新晋翻倍股列表
new_double_stocks.append({
'code': code,
'rise_max': df_now[df_now['code'] == code].iloc[0]['rise_max'],
'daily_change': daily_change,
'name': get_stock_basic_info(code)[0]
})
# 生成总结报告
if new_double_stocks:
markdown_report = generate_markdown_report(new_double_stocks, trade_date)
print(markdown_report)
else:
print("\n## 📝 今日无新晋翻倍股\n")
print("> 今日未发现新的翻倍股,市场表现相对平稳。\n")
return df
# 运行主函数
if __name__ == "__main__":
now = str(datetime.datetime.now())
result_df = get_his_data(now[0:10])
这个Markdown格式的输出包含以下特性:
🎯 Markdown特色功能
- 标题层级:使用
#、##、###创建清晰的标题结构 - 表格展示:用Markdown表格展示关键数据
- 代码块:用反引号突出显示重要数值
- 分割线:用
---分隔不同章节 - 引用块:用
>突出投资建议 - 列表格式:用
-创建项目列表 - 表情符号:使用emoji增强可读性
📊 输出示例
# 📈 2024-01-20 新晋翻倍股分析报告
---
## 🔍 发现新晋翻倍股: 000001
## 000001 平安银行 - 翻倍股分析报告
---
### 📈 基本概况
| 指标 | 数值 |
|------|------|
| **所属行业** | 银行 |
| **累计涨幅** | 125.5% |
| **最大回撤** | 18.3% |
| **突破状态** | ✅ 已突破前高 |
### 📊 关键点位
| 点位类型 | 价格 | 日期 |
|----------|------|------|
| **最低点** | 8.50元 | 2023-06-15 |
| **次低点** | 9.20元 | - |
| **前高点** | 15.80元 | 2024-01-18 |
### 🎯 技术特征
**主要特征:**
- 翻倍股, 强势整理, 突破前高, 顶部风险较低
**量化指标:**
- 顶部形态数量:`0个`
- 顶部评分:`15/100`
### 💡 投资建议
> 📈 涨幅相对温和,仍有上行空间 | 💪 走势稳健,控盘良好 | ✅ 顶部风险较小,可继续持有
这样的Markdown格式可以直接在支持Markdown的编辑器、笔记软件或网页中渲染,具有很好的可读性和美观性。