48 KiB
48 KiB
In [ ]:
from utils.gtools import MySQLconnect import pandas as pd import numpy as np
In [ ]:
import tqdm from utils.gtools import MySQLconnect import pandas as pd import numpy as np import pickle import os # 读取csv文件 csv_file = r"F:\DOCUMENTS\WXWork\1688854527635889\Cache\File\2025-03\Litfad产品点击数据 (26).csv" print("读取csv文件...") df1 = pd.read_csv(csv_file, skiprows=2) max_len = len(df1) batch_size = 500000 df1 = df1.rename(columns={"产品 ID": "psid"}) print("csv文件读取完毕") for j in range(0, (max_len // batch_size) + 1): print(f"正在处理第{j}批数据...") start_idx = j * batch_size end_idx = start_idx + batch_size batch_df = df1.iloc[start_idx:end_idx] # 获取每一批数据 with MySQLconnect("ods") as db: conn = db.connect() cursor = conn.cursor() if not os.path.exists(f"spu_data{j}.csv"): for i,row in batch_df.iterrows(): psid = row["psid"].split("sku")[1] if "sku" in row["psid"] else row["psid"] # 产品PSID show_count = row["展示次数"] click_count = row["点击次数"] sql = rf"""SELECT SPU,DATE_FORMAT(spu.添加时间, '%Y-%m') AS 年月 FROM stg_bayshop_litfad_sku sku left JOIN stg_bayshop_litfad_spu spu ON sku.`产品PID` =spu.`产品PID` WHERE `产品PSID` = '{psid}' """ cursor.execute(sql) result = cursor.fetchone() if result: year_month = result[0] spu = result[1] else: continue # df1新增一列保存这个年月 batch_df.loc[i,"年月"] = year_month batch_df.loc[i,"SPU"] = spu batch_df.to_csv(f"spu_data{j}.csv", index=False, encoding="utf-8-sig") else: batch_df = pd.read_csv(f"spu_data{j}.csv") batch_df["展示次数"] = pd.to_numeric(batch_df["展示次数"], errors='coerce') batch_df["点击次数"] = pd.to_numeric(batch_df["点击次数"], errors='coerce') result1 = batch_df.groupby("年月").agg( 年月 = ("年月", "first"), SPU = ("SPU", "first"), 展示总次数 = ("展示次数", "sum"), 点击总次数 = ("点击次数", "sum")) result = result1.groupby("SPU").agg( 展示大于0点击为0数量=("年月", lambda x: ((result1.loc[x.index, "展示总次数"] > 0) & (result1.loc[x.index, "点击总次数"] == 0)).sum()), 点击大于0数量=("年月", lambda x: (result1.loc[x.index, "点击总次数"] > 0).sum()), 展示为0数量=("年月", lambda x: (result1.loc[x.index, "展示总次数"] == 0).sum()) ).reset_index() result.to_csv(f"spu_statistics{j}.csv", index=False, encoding="utf-8-sig") # 最后读取所有批次的统计数据并合并(相加) all_result = pd.DataFrame() for j in range(0, (max_len // batch_size) + 1): result = pd.read_csv(f"spu_statistics{j}.csv") # 以年月为组,其他数据各批次相加 if all_result.empty: all_result = result else: all_result = pd.merge(all_result, result, on="SPU", how="outer", suffixes=('', '_new')) all_result = all_result.groupby("SPU").sum().reset_index() all_result.to_csv("all_spu_statistics.csv", index=False, encoding="utf-8-sig")
In [ ]:
from utils.gtools import MySQLconnect import pandas as pd df=pd.read_excel(r"F:\DOCUMENTS\WXWork\1688854527635889\Cache\File\2025-03\导出订单维护任务数据2025-3-20.xlsx",sheet_name="导出订单维护任务数据2025-3-20") df['订单数量'] = df['订单数量'].astype(str) df = df[df['订单数量'].str.len() > 0] df['订单数量'] = df['订单数量'].astype(float) df = df[df['订单数量']>0] df=df[['erp sku','订单号']]
In [ ]:
with MySQLconnect("ods") as db: engine = db.engine() conn = db.connect() cursor = conn.cursor() df_group = df.groupby('erp sku') for sku, group in df_group: for index,row in group.iterrows(): order_id_list = group["订单号"].tolist() param = ",".join(f"'{order_id}'" for order_id in order_id_list) sql = f""" SELECT SKU, sum(as_value_amount) AS 销售额, sum(product_num) AS 产品数量, count(order_id) AS 订单数量, date_format(MAX(order_date), '%%Y-%%m-%%d') AS 最后一次订单日期 FROM dws.fact_order_product_list WHERE SKU = {sku} AND order_id not IN ({param}) group by SKU """ amount_df = pd.read_sql(sql, con=engine) if amount_df.empty: amount = 0 product_num = 0 order_num = 0 last_order_date = None else: amount = amount_df["销售额"].values[0] product_num = amount_df["产品数量"].values[0] order_num = amount_df["订单数量"].values[0] last_order_date = amount_df["最后一次订单日期"].values[0] df.loc[df["erp sku"] == sku, "不含此次总销售额"] = amount df.loc[df["erp sku"] == sku, "产品数量"] = product_num df.loc[df["erp sku"] == sku, "订单数量"] = order_num df.loc[df["erp sku"] == sku, "最后一次订单日期"] = last_order_date print(f"{sku}的销售额为{amount}, 产品数量为{product_num}, 订单数量为{order_num}, 最后一次订单日期为{last_order_date}") df = df.drop_duplicates(subset=["erp sku", "订单号"], keep="last") df.to_clipboard(index=False)
In [ ]:
from utils.countryOperator import OperateCountry from utils.logisticsBill import BillFactory from utils.Package import Package, Package_group import pandas as pd from utils.gtools import MySQLconnect # 美国 from utils.logisticsBill import Billing ods = MySQLconnect('ods') cursor = ods.connect().cursor() df = pd.read_excel(r'F:\DOCUMENTS\WXWork\1688854527635889\Cache\File\2025-04\Litfad 4-10-25 with data analysis-2(1).xlsx', sheet_name='NJ-96004848') df_grouped= df.groupby('TRACKING#') calculated_results = [] package_list = ",".join(str(item) for item in df['ORDER#'].tolist()) print(package_list) query = f"SELECT package,length,width,hight,weight FROM `package_vol_info` WHERE `package` IN ({package_list})" result = cursor.execute(query) packages_info = cursor.fetchall() print(packages_info) # 将df和result合并 new_df = pd.DataFrame(packages_info, columns=['package', 'length', 'width', 'hight', 'weight']) df = df.merge(new_df, left_on='ORDER#', right_on='package') df = df.drop(columns='package') for order_num, group in df_grouped: # opCountry = OperateCountry(group['目的国'].iloc[0]) opCountry = OperateCountry('US') postcode = group['ZIPCODE'].iloc[0] packages= Package_group() packages_dict = {} volume_weight = 0 weight = 0 for index,row in group.iterrows(): length = float(row['L*H*W(CM)'].split('*')[0]) width = float(row['L*H*W(CM)'].split('*')[1]) hight = float(row['L*H*W(CM)'].split('*')[2]) weight = row['WEIGHT'] package = Package(row['ORDER#'],length,width,hight,weight) packages.add_package(package) # packages_dict[row['包裹号']] = { # "长": row['长'], # "宽": row['宽'], # "高": row['高'], # "重量": row['重量'] # } # weight += row['重量']/1000 # volume_weight += package.get_volume_weight(6000) # postcode = row['postcode'] # head_type = 1 if row['运输方式'] == '海运' else 0 try: bill1 = Billing(str(index),opCountry,packages,postcode,company_name='大健-Metro',head_type=1,beizhu='1') tail_price1 = bill1.tail_amount[0] except: tail_price1 = '出错' try: bill2 = Billing(str(index),opCountry,packages,postcode,company_name='大健-CEVA',head_type=1,beizhu='1') tail_price2 = bill2.tail_amount[0] except: tail_price2 = '出错' try: bill3 = Billing(str(index),opCountry,packages,postcode,company_name='大健-GIGA',head_type=1,beizhu='1') tail_price3 = bill3.tail_amount[0] except: tail_price3 = '出错' result = { 'TRACKING#': order_num, '大健-MATRO': tail_price1,# Same for all rows in the group '大健-CEVA':tail_price2, '大健-GIGA':tail_price3, } print(result) calculated_results.append(result) # print(packages_dict) calculated_df = pd.DataFrame(calculated_results) # 将calculated_df的订单号改为order_id # calculated_df.rename(columns={'订单号':'order_id'},inplace=True) calculated_df
In [ ]:
# 取表格数据is_first为1的数据,取spu,长宽高重量系数 import pandas as pd df = pd.read_excel(r'D:\test\logistics\拦截数据\一票一件发货订单.xlsx',sheet_name="单包裹系数计算") # 写一个cal_size算法,输入原属性和新属性,返回涨幅系数 df=df[['is_first','SPU','SKU','长','宽','高','重量']] base_df = df[df['is_first']==1]
In [ ]:
# 取这些SPU下的所有SKU及其现在售价 from sell.sell_price import call_sell_and_order_price import json from utils.gtools import MySQLconnect import pandas as pd spu_list = ( base_df['SPU'] .apply(pd.to_numeric, errors='coerce') # 转数字,非法的变 NaN .dropna() .astype(int) .astype(str) .tolist() ) placeholders = ','.join(['%s'] * len(spu_list)) # result = [] with MySQLconnect('ods') as db: enginal = db.engine() sql = f"""SELECT 产品品类, 产品分类, SPU, sku.SKU, sku.`成本价`, spi.`包裹数据`, 物流分摊, 产品售价 FROM stg_bayshop_litfad_sku sku LEFT JOIN stg_bayshop_litfad_spu spu ON sku.`产品PID` = spu.`产品PID` LEFT JOIN ads.new_erp_sku_size spi ON sku.SKU =spi.SKU WHERE spu.SPU IN ({placeholders}) """ result = pd.read_sql(sql, enginal,params= tuple(spu_list)) # 合并df all_df = pd.merge(result,df, on=['SPU','SKU'], how='left') all_df.head()
In [ ]:
import pandas as pd from utils.gtools import MySQLconnect # 读取需要计算的包裹信息 with MySQLconnect('ods') as db: sql = r""" SELECT DATE_FORMAT(order_date,'%Y-%m') AS 月份, order_id, order_date, opl.SKU, CASE WHEN opl.order_product_id LIKE '%\_%' ESCAPE '\\' AND opl.order_product_id NOT LIKE '%\_%\_%' ESCAPE '\\' THEN product_num END AS product_num, DATE_FORMAT(order_date,"%Y-%m-%d") AS 订单时间, sku.`产品售价`*product_num AS erp售价, sku.成本价*product_num AS erp采购价, spvi.erp_package_vol FROM dws.fact_order_product_list opl LEFT JOIN stg_bayshop_litfad_sku sku ON opl.SKU = sku.SKU LEFT JOIN dwd.dim_erp_sku_package_vol_info spvi ON opl.SKU = spvi.erp_sku WHERE order_date >= "20240601" AND order_date < "20250701" AND opl.SKU <> "" AND opl.order_product_id NOT LIKE '%\_%\_%' ESCAPE '\\' GROUP BY order_id,SKU """ df=pd.read_sql(sql,db.con) # print(df) # df.to_clipboard(index=False) df
In [ ]:
import re import json import pandas as pd def extract_number(value): match = re.search(r"[-+]?\d*\.\d+|\d+", str(value)) return float(match.group()) if match else 0.0 def calc_volume(row): try: package_json = str(row['erp_package_vol']) if not package_json.startswith('{'): return 0.0 package_dict = json.loads(package_json) total_volume = 0.0 # product_num是seri try: num = int(row['product_num']) except: num = 0 for package in package_dict.values(): l = extract_number(package.get('长', 0)) w = extract_number(package.get('宽', 0)) h = extract_number(package.get('高', 0)) total_volume += l * w * h * num return total_volume except Exception as e: print(f"错行:{row}\n错误:{e}") return 0.0 # 计算体积 df['体积'] = df.apply(calc_volume, axis=1) # order_id聚合,除了 月份,order_id,order_date,保留第一行,其他售价,采购价,体积求和 df_agg = df.groupby(['order_id']).agg({ '月份': 'first', 'order_id': 'first', 'order_date': 'first', '订单时间': 'first', 'erp售价': 'sum', 'erp采购价': 'sum', '体积': 'sum' })
In [ ]:
df.to_clipboard(index=False)
In [ ]:
In [ ]:
# 先把ERP包裹数据拆出来 import re import json for index, row in all_df.iterrows(): if not isinstance(row['包裹数据'], str) or not row['包裹数据']: print(f"第{index}行包裹数据为空或非字符串,跳过") continue try: package_dict = json.loads(row['包裹数据']) except json.JSONDecodeError as e: print(f"解析失败:第{index}行,错误信息:{e}") continue try: for package in package_dict.values(): item = {} for key, value in package.items(): try: # 使用正则表达式提取数字部分 number_str = re.findall(r"[-+]?\d*\.\d+|\d+", str(value)) if number_str: item[key] = float(number_str[0]) # 取第一个匹配到的数字并转换为 float else: item[key] = value # 如果没有数字部分,保留原值 except ValueError: item[key] = value # 如果遇到无法转换的值,保留原值 except AttributeError: print(f"解析失败:第{index}行,错误信息:包裹数据为空") continue size = [] size.append(item['长']) size.append(item['宽']) size.append(item['高']) weight = item['重量'] size.sort() length = size[2] width = size[1] height = size[0] all_df.loc[index, 'ERP长'] = length all_df.loc[index, 'ERP宽'] = width all_df.loc[index, 'ERP高'] = height all_df.loc[index, 'ERP重量'] = weight print(f"{row['SKU']}尺寸为:{width},h:{height},d:{length},w:{weight}")
In [ ]:
# 计算每个SPU的长宽高重量系数 def cal_size(old,new): try: old = float(old) new = float(new) if old == 0: return None # 或 return 0,防止除以0 return (new - old) / old except (ValueError, TypeError): return None # 遇到不能转为 float 的就返回 None test_df = all_df[all_df['is_first']==1] # 取基准数据SPU的系数 for index, row in test_df.iterrows(): test_df.loc[index, '长系数'] = cal_size(row['ERP长'],row['长']) test_df.loc[index, '宽系数'] = cal_size(row['ERP宽'],row['宽']) test_df.loc[index, '高系数'] = cal_size(row['ERP高'],row['高']) test_df.loc[index, '重量系数'] = cal_size(row['ERP重量'],row['重量']) print( f"{row['SPU']} 的系数为 " f"{test_df.loc[index, '长系数']}, " f"{test_df.loc[index, '宽系数']}, " f"{test_df.loc[index, '高系数']}, " f"{test_df.loc[index, '重量系数']}" ) # 将SPU的基准系数合并至all_df all_df = pd.merge(all_df, test_df[['SPU', '长系数', '宽系数', '高系数', '重量系数']], on='SPU', how='left') all_df.to_excel('单包裹SKU售价分析.xlsx', index=False)
In [ ]:
import pandas as pd all_df = pd.read_excel('单包裹SKU售价分析.xlsx') # 根据系数 得到所有SKU的预测尺寸 # 根据系数计算每个SKU的理论尺寸 all_df['理论长'] = ((1 + all_df['长系数']) * all_df['ERP长']).round(2) all_df['理论宽'] = ((1 + all_df['宽系数']) * all_df['ERP宽']).round(2) all_df['理论高'] = ((1 + all_df['高系数']) * all_df['ERP高']).round(2) all_df['理论重量'] = ((1 + all_df['重量系数']) * all_df['ERP重量']).round(2) # 计算三种尺寸下的售价 # 计算预测后的尺寸下,一票一件订单的售价和订单价格 from sell.sell_price import call_sell_and_order_price for index,row in all_df.iterrows(): price = row['成本价'] package_dict1={} package_dict2={} package_dict3={} try: package_dict1['包裹1'] = {} package_dict2['包裹1'] = {} package_dict3['包裹1'] = {} package_dict1['包裹1']['长'] = row['长'] package_dict1['包裹1']['宽'] = row['宽'] package_dict1['包裹1']['高'] = row['高'] package_dict1['包裹1']['重量'] = row['重量'] package_dict2['包裹1']['长'] = row['理论长'] package_dict2['包裹1']['宽'] = row['理论宽'] package_dict2['包裹1']['高'] = row['理论高'] package_dict2['包裹1']['重量'] = row['理论重量'] package_dict3['包裹1']['长'] = row['ERP长'] package_dict3['包裹1']['宽'] = row['ERP宽'] package_dict3['包裹1']['高'] = row['ERP高'] package_dict3['包裹1']['重量'] = row['ERP重量'] sell_price1, order_price1, order_type1 = call_sell_and_order_price(price, package_dict1) sell_price2, order_price2, order_type2 = call_sell_and_order_price(price, package_dict2) sell_price3, order_price3, order_type3 = call_sell_and_order_price(price, package_dict3) except Exception as e: print(f"SKU: {row['SKU']} 报错: {e}") continue all_df.loc[index, 'ERP售价'] = sell_price3 all_df.loc[index, '实际体积售价'] = sell_price1 all_df.loc[index, '理论体积售价'] = sell_price2 all_df.loc[index, 'ERP订单价'] = order_price3 all_df.loc[index, '实际体积订单价'] = order_price1 all_df.loc[index, '理论体积订单价'] = order_price2 # all_df.loc[index, '理论体积订单类型'] = order_type2 print(f"SPU: {row['SPU']}, SKU {row['SKU']} ,网站售价: {row['产品售价']}, ERP售价: {sell_price3}, 实际体积售价: {sell_price1}, 理论体积售价: {sell_price2},") all_df.to_excel('单包裹SKU售价分析.xlsx', index=False)
In [ ]:
import pandas as pd all_df = pd.read_excel('单包裹SKU售价分析1.xlsx',sheet_name="Sheet1") all_df
In [ ]:
all_df = all_df[(all_df['是否有过修改记录']=="否")&(all_df['使用尺寸售价']!="ERP售价")] all_df['SPU最大涨幅']=all_df.groupby('SPU')['售价涨跌幅'].transform(max) all_df['SPU最小涨幅']=all_df.groupby('SPU')['售价涨跌幅'].transform(min) filtered_df = all_df[(all_df['SPU最大涨幅'] <= 0.5) & (all_df['SPU最小涨幅'] >= -0.5)] for index,row in filtered_df.iterrows(): if row['使用尺寸售价']=="实际体积售价": length = str(row['长']) width = str(row['宽']) height = str(row['高']) weight = str(row['重量']) else: length = str(row['理论长']) width = str(row['理论宽']) height = str(row['理论高']) weight = str(row['理论重量']) filtered_df.loc[index, '尺寸重量'] = f"{weight}|{length}*{width}*{height}*1," print(index) spu_list = filtered_df['SPU'].unique() filtered_df = filtered_df[['SKU','成本价','尺寸重量']] filtered_df
In [ ]:
filtered_df.to_excel("product_property_data.xlsx")
In [ ]:
import pandas as pd df=pd.read_clipboard()
In [ ]:
D, E, F = [], [], [] temp_sum = 0 for i in range(len(df)): temp_sum += df.loc[i, '未售出'] if df.loc[i, '已售出'] != 0: D.append(df.loc[i, '价格']) E.append(temp_sum) F.append(df.loc[i, '已售出']) temp_sum = 0 # 重置 # 结果 result = pd.DataFrame({'D': D, 'E': E, 'F': F}) result.to_clipboard(index=False)
In [ ]:
def uk_package(packages_real): try: packages = json.loads(packages_real) p_num = len(packages) volume_weight_total = 0 for key,package in packages.items(): side_list = [float(i) for i in [package["长"], package["宽"], package["高"]]] side_list.sort(reverse=True) volume_weight = side_list[0] * side_list[1] * side_list[2]/6000 volume_weight_total += volume_weight express_type = "快递" girth = side_list[0] + side_list[1] * 2 + side_list[2] * 2 if side_list[0] > 300 or side_list[1] > 180 or int(package["重量"]) >= 150000 or volume_weight >95000 : express_type = "卡派" break if side_list[0] > 175 or girth > 339 or int(package["重量"]) >= 40000 : express_type = "大件" if express_type != "卡派" else "卡派" elif side_list[0] > 100 or side_list[0] > 60 or int(package["重量"]) >= 30000 : express_type = "快递超长" if express_type == "快递超长" or express_type == "快递" else express_type else : express_type = "快递" if express_type == "快递" else express_type return pd.Series({"尾端物流类型":express_type}) except Exception as e: print(e) return pd.Series({"尾端物流类型":"未知"})
In [ ]:
def order_freight_price(packages_real,express_type): try: packages = json.loads(packages_real) p_num = len(packages) volume_weight_total = 0 express_fee = 0 if express_type == "卡派": express_fee = 55 else : for key,package in packages.items(): side_list = [float(i) for i in [package["长"], package["宽"], package["高"]]] side_list.sort(reverse=True) volume_weight = side_list[0] * side_list[1] * side_list[2]/6000 volume_weight_total += volume_weight girth = side_list[0] + side_list[1] * 2 + side_list[2] * 2 if int(package["重量"]) <=5000 : express_fee = max(express_fee,4.99) elif int(package["重量"]) <=10000 : express_fee = max(express_fee,6.99) elif int(package["重量"]) <=20000 : express_fee = max(express_fee,9.99) else : express_fee = max(express_fee,14.99) if side_list[0] > 175 or int(package["重量"]) >= 30000: express_fee = max(express_fee,19.99) elif side_list[0] > 120 : express_fee = max(express_fee,14.99) return pd.Series({"订单尾端费用":express_fee}) except: return pd.Series({"订单尾端费用":0})
In [ ]:
import pandas as pd import re df=pd.read_clipboard() def clean_data(row): #250221074014717&250222211202474&250222215014600& 250227073002821 #提取它的数字部分,使用正则提取 pattern = re.compile(r'\d+') numbers = re.findall(pattern, str(row)) lenth = len(numbers) return pd.Series([lenth, numbers]) df[['单数', '号码']] = df['订单号'].apply(clean_data)
In [ ]:
new_rows = [] for index, row in df.iterrows(): print(index) if row['单数'] == 0: new_rows.append({**row, 'order_id': j,'单号长': 0}) else: for j in row['号码']: if len(j)==7 or left(j,3)=='25': new_rows.append({**row, 'order_id': j,'单号长': len(j)}) new_df = pd.DataFrame(new_rows) new_df
In [ ]:
# new_df的order_id列中有重复的订单号,需要去重,按照创建日期排序,保留创建日期最早的那个 new_df = new_df.sort_values(by=['工单号']) new_df = new_df.drop_duplicates(subset=['order_id'], keep='first') new_df.to_clipboard(index=False) new_df
In [2]:
from openai import OpenAI text = "超短,完全小白,讲板块情绪,擅长找出各板块的绝对核心" client = OpenAI( api_key="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" ) conversation_object = client.conversations.create( ) history = [] print(conversation_object) response = client.responses.create( conversation = 'conv_6926bdf9368c8195abbb9530da3abc200d904bb0cb286f5a', model="gpt-5.1", input=text ) print(response.output_text) history.append((response.output_text))
Conversation(id='conv_6926c33b9c988194acabfd4ad198556e002f691818f05aa5', created_at=1764148027, metadata={}, object='conversation')
按你这三个关键词来设计:
- 风格:超短
- 受众:完全小白
- 卖点:板块情绪 + 找“绝对核心龙头”
直接给你一套可落地的抖音账号方案。
---
## 一、先把你的人设一句话写清楚
你现在的信息翻译一下:
> 做超短线,不和你讲复杂技术,专门给你看板块情绪,告诉你谁是龙头。
可以这样写成一句定位(任选/微调):
1. 「超短情绪交易|只讲板块和龙头,不讲废话」
2. 「A股超短情绪分析|带你看懂板块核心龙头」
3. 「专做A股情绪周期|帮你认清每一波的真龙头」
这句话用在:
- 抖音主页简介第一行
- 视频第一秒的口播,比如:“我是XX,一个做超短情绪的交易者。”
---
## 二、账号基础包装(直接给模板)
1. 账号名示例(自己替换“XX”)
- 「XX说情绪」
- 「XX聊龙头」
- 「XX超短情绪」
- 「A股情绪观察员XX」
2. 主页简介模板(你可以直接改名就用)
> A股超短实战
> 主讲:板块情绪周期 / 龙头选拔
> 不荐股不带单,只讲我自己的交易思路
> 仅作个人复盘记录,非投资建议
3. 头像
- 优先:你本人正脸/侧脸 + 简单字(“情绪 / 龙头 / 超短”三选一)
- 不露脸就用统一风格Logo,例如深色底 + 白字“情绪周期”
---
## 三、内容设计:为“完全小白”重构你的专业
你擅长的是很专业的一块,但受众是小白,核心是:
- 不讲深邃理论
- 讲「看得见、听得懂、记得住」的东西
### 1)必备的固定栏目(建议至少两个)
① 《今日A股情绪温度·30秒版》
每个交易日收盘后 30–60 秒讲三件事:
- 今天情绪是:冰点 / 修复 / 高潮 / 退潮
- 主线板块是谁?(最多说 1–2 个)
- 哪个是真龙头?为什么是它?(一句话逻辑)
② 《这一波行情的真龙头是谁?》系列
- 一期只讲一个板块的一只“绝对核心”
- 用最近几天的K线 + 板块涨幅录屏简单解释:
- 为什么它是核心(涨幅、换手、封板质量、带动性)
- 什么时候已经不是核心了(开板、分歧、补涨上位等)
③ 《情绪周期小白课》系列(慢慢打基础)
每条控制在 60 秒左右,一次只讲一个点,例如:
- 什么叫:冰点 / 修复 / 高潮 / 退潮(用历史例子)
- 龙头、补涨龙、杂毛票,各是什么?举例+图
- 超短里最容易亏钱的3个时间点:
- 情绪高潮末期去追板
- 龙头走完接补涨末端
- 退潮期硬做反包
你先选 2 个栏目,保证能坚持,而不是一上来啥都做。
---
## 四、每条视频的讲解结构(照这个模板来)
超短+小白,建议用统一结构,观众容易养成习惯。
### 模板 A:盘后情绪视频(30–60秒)
1. 开头 3 秒:
- 「今天A股情绪:XX。」(比如:冰点/修复/小高潮)
2. 中间 20–40 秒:
- 1 句话说指数状态(跌多涨多)
- 2 句话说主线板块
- 1 句话点出“今天谁是板块里的真核心,为什么”
- 如:“算力板里,真正的龙头是XX,因为它一字打穿、换手最高、带动了整个板块。”
3. 尾巴 5–10 秒:
- 风险提示:
- 「现在已经是情绪XX阶段,小白不要瞎追。」
- 「只是我的盘后记录,不建议你照着买。」
### 模板 B:单支龙头拆解视频(60–90秒)
1. 开头:
- 「这波XX题材,真正的龙头是它,而不是你以为的那只。」
2. 正文三点:
- 它是怎么从板块里“被选出来”的:
- 第一个涨停 / 连板最多 / 首个反包 / 放量换手最好
- 它如何带动:
- 带起板块涨停潮 / 反复给板块做情绪修复
- 它什么时候“退位”:
- 高位天地、断板放巨量、补涨上来抢风头
3. 结尾:
- 「现在它处在XX阶段(如高位分歧/退潮),新手别接最后一棒。」
---
## 五、把“板块情绪”和“绝对核心”讲小白能懂
你可以准备几套固定说法,反复用:
1. 情绪阶段,用生活比喻:
- 冰点:大家都怕,不敢买(涨停家数少、放量大跌多)
- 修复:突然有人敢出手,出现明星股带头(龙头首板/反包)
- 高潮:什么都涨、连板一片、大家打板都赚钱(高位风险最大)
- 退潮:龙头走弱、补涨乱飞、炸板多,新手进去基本挨打
2. 什么是“绝对核心龙头”(小白版定义):
- 涨得最快、最猛、最早启动的那只
- 整个板块涨停,它往往是最先封板、最难被砸开的
- 板块回调时,它率先止跌、带着板块重新冲起来
3. 你可以明确告诉小白:
- 「我不带你去打这些票,我只是告诉你:
什么时候是龙头赚钱的阶段,什么时候是给人接盘的阶段。」
既展示你能力,又不踩“荐股”红线。
---
## 六、第一批内容的具体安排(可以直接照抄题目)
先准备 7–10 条视频当“启动库存”:
1)《我是XX,一个做超短情绪的交易者》
- 你超短几年了、主要做什么段位(打板/接力/混沌)
- 你这个号以后每天/每周会固定输出什么
2)《20秒教你看懂:今天A股情绪是冷还是热》
- 用历史某天举例,解释“冰点”和“高潮”的差异(涨停数+板块情况)
3)《这一波XX题材,真正的龙头是它》
- 挑一波你熟悉的经典行情案例来讲(不用讲现在的,讲历史更安全)
4)《为什么90%的散户追板都死在“高潮末期”》
- 讲情绪高潮末尾的特征:
- 涨停家数爆多 / 连板高度见顶 / 补涨杂毛一堆
- 明确说:这个阶段小白最容易亏钱
5)《超短情绪里的3个典型角色:龙头、补涨、杂毛》
- 用简图/录屏 K 线画出 3 个区别
- 各举1个历史例子
6)《我认定“龙头”的4个标准》
- 启动最早 / 板块带动性 / 换手质量 / 情绪修复能力
- 每条用1句白话解释 + 盘面截图
后面再逐渐加:
- 每日盘后情绪复盘
- 单个板块的龙头拆解
- 粉丝评论区问某个板块,你录屏讲5分钟变成60秒剪辑
---
## 七、合规和话术安全线(做超短题材更要注意)
1. 永远不要说:
- 「明天跟我一起上」
- 「这只明天还能干」
- 「目标价××,冲」
- 「今天尾盘上车,明天大概率核不掉」
2. 统一用:
- 「这是我盘后的个人复盘记录,不构成投资建议。」
- 「我自己会把它当×阶段,但不建议小白去接。」
- 「你要真想做,仓位自己控制,我不会带单。」
---
## 八、你现在可以马上做的两件事
1. 选定并写下来:
- 抖音号名(比如“XX说情绪”)
- 一句话定位(比如“专讲A股超短情绪和龙头”)
- 两个固定栏目名称:
- 《今日A股情绪温度》
- 《这一波的真龙头是谁?》
2. 先写 3 条视频的草稿(每条几行就行):
- 第1条:自我介绍 + 账号能给粉丝什么
- 第2条:用历史上一波题材行情,讲清“真龙头”是咋选出来的
- 第3条:用一个极端例子讲“高潮末期追板是怎么被埋的”
如果你愿意,可以把:
- 你想好的账号名
- 你的一句话定位草稿
- 打算做的两个固定栏目名字
发给我,我可以帮你把这几句文案改得更利于涨粉、又不踩红线。
In [3]:
pip install openai
Collecting openai Obtaining dependency information for openai from https://files.pythonhosted.org/packages/55/4f/dbc0c124c40cb390508a82770fb9f6e3ed162560181a85089191a851c59a/openai-2.8.1-py3-none-any.whl.metadata Downloading openai-2.8.1-py3-none-any.whl.metadata (29 kB) Requirement already satisfied: anyio<5,>=3.5.0 in c:\programdata\anaconda3\lib\site-packages (from openai) (3.5.0) Collecting distro<2,>=1.7.0 (from openai) Obtaining dependency information for distro<2,>=1.7.0 from https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl.metadata Downloading distro-1.9.0-py3-none-any.whl.metadata (6.8 kB) Requirement already satisfied: httpx<1,>=0.23.0 in c:\programdata\anaconda3\lib\site-packages (from openai) (0.28.1) Collecting jiter<1,>=0.10.0 (from openai) Obtaining dependency information for jiter<1,>=0.10.0 from https://files.pythonhosted.org/packages/bb/60/1032b30ae0572196b0de0e87dce3b6c26a1eff71aad5fe43dee3082d32e0/jiter-0.12.0-cp311-cp311-win_amd64.whl.metadata Downloading jiter-0.12.0-cp311-cp311-win_amd64.whl.metadata (5.3 kB) Requirement already satisfied: pydantic<3,>=1.9.0 in c:\programdata\anaconda3\lib\site-packages (from openai) (2.11.7) Requirement already satisfied: sniffio in c:\programdata\anaconda3\lib\site-packages (from openai) (1.2.0) Requirement already satisfied: tqdm>4 in c:\programdata\anaconda3\lib\site-packages (from openai) (4.65.0) Requirement already satisfied: typing-extensions<5,>=4.11 in c:\programdata\anaconda3\lib\site-packages (from openai) (4.12.2) Requirement already satisfied: idna>=2.8 in c:\programdata\anaconda3\lib\site-packages (from anyio<5,>=3.5.0->openai) (2.10) Requirement already satisfied: certifi in c:\programdata\anaconda3\lib\site-packages (from httpx<1,>=0.23.0->openai) (2024.6.2) Requirement already satisfied: httpcore==1.* in c:\programdata\anaconda3\lib\site-packages (from httpx<1,>=0.23.0->openai) (1.0.9) Requirement already satisfied: h11>=0.16 in c:\programdata\anaconda3\lib\site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.16.0) Requirement already satisfied: annotated-types>=0.6.0 in c:\programdata\anaconda3\lib\site-packages (from pydantic<3,>=1.9.0->openai) (0.7.0) Requirement already satisfied: pydantic-core==2.33.2 in c:\programdata\anaconda3\lib\site-packages (from pydantic<3,>=1.9.0->openai) (2.33.2) Requirement already satisfied: typing-inspection>=0.4.0 in c:\programdata\anaconda3\lib\site-packages (from pydantic<3,>=1.9.0->openai) (0.4.1) Requirement already satisfied: colorama in c:\programdata\anaconda3\lib\site-packages (from tqdm>4->openai) (0.4.6) Downloading openai-2.8.1-py3-none-any.whl (1.0 MB) ---------------------------------------- 0.0/1.0 MB ? eta -:--:-- ---------------------------------------- 0.0/1.0 MB ? eta -:--:-- - -------------------------------------- 0.0/1.0 MB 653.6 kB/s eta 0:00:02 - -------------------------------------- 0.0/1.0 MB 653.6 kB/s eta 0:00:02 -- ------------------------------------- 0.1/1.0 MB 363.1 kB/s eta 0:00:03 --- ------------------------------------ 0.1/1.0 MB 476.3 kB/s eta 0:00:02 ----- ---------------------------------- 0.1/1.0 MB 607.9 kB/s eta 0:00:02 ------ --------------------------------- 0.2/1.0 MB 697.2 kB/s eta 0:00:02 ------- -------------------------------- 0.2/1.0 MB 556.2 kB/s eta 0:00:02 --------- ------------------------------ 0.2/1.0 MB 654.9 kB/s eta 0:00:02 ----------- ---------------------------- 0.3/1.0 MB 707.1 kB/s eta 0:00:02 --------------- ------------------------ 0.4/1.0 MB 922.1 kB/s eta 0:00:01 ----------------- ---------------------- 0.5/1.0 MB 938.8 kB/s eta 0:00:01 ------------------- -------------------- 0.5/1.0 MB 952.6 kB/s eta 0:00:01 ---------------------- ----------------- 0.6/1.0 MB 1.0 MB/s eta 0:00:01 -------------------------------- ------- 0.8/1.0 MB 1.4 MB/s eta 0:00:01 -------------------------------------- - 1.0/1.0 MB 1.5 MB/s eta 0:00:01 ---------------------------------------- 1.0/1.0 MB 1.5 MB/s eta 0:00:00 Downloading distro-1.9.0-py3-none-any.whl (20 kB) Downloading jiter-0.12.0-cp311-cp311-win_amd64.whl (204 kB) ---------------------------------------- 0.0/204.9 kB ? eta -:--:-- --------------------------------------- 204.9/204.9 kB 13.0 MB/s eta 0:00:00 Installing collected packages: jiter, distro, openai Successfully installed distro-1.9.0 jiter-0.12.0 openai-2.8.1 Note: you may need to restart the kernel to use updated packages.