下一章 上一章 目录 设置
40、第40章:代码预测的K线图 ...
-
科技园新店的空气像凝固的松香,混合着未散尽的油漆稀释剂、新鲜油墨和六类网线塑料外皮的工业气息。吴舟蜷在角落刚组装的二手办公桌后,后背紧贴着冰凉的玻璃幕墙。窗外,地铁站汹涌的人流如同永不停歇的血管,将城市的养分泵向四面八方。他面前,那台老旧的方正电脑风扇嘶吼着,屏幕幽蓝的光映着他冷峻的侧脸,额角渗出的汗珠在冷气中凝成细小的水珠。
屏幕上,Python的IDLE窗口幽幽亮着。绿色的字符流如同瀑布般冲刷而下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
模拟2004-2008年数据 (实际需爬取或使用离线数据包)
def generate_mock_data():
dates = pd.date_range(start='2004-01-01', end='2008-12-31', freq='B')
# 模拟新能源指数 (虚构,实际应包含比亚迪、宁德时代等成分股)
np.random.seed(42)
base_value = 1000
# 加入趋势性上涨 + 随机波动 + 2007年股灾大跌 + 2008年底政策预期反弹
trend = np.linspace(0, 0.8, len(dates)) # 长期缓慢上涨趋势
noise = np.random.normal(0, 0.02, len(dates)) # 日常波动
# 2007年股灾模拟 (10月左右开始暴跌)
crash = np.zeros(len(dates))
crash_start = np.where(dates == '2007-10-01')[0][0]
crash[crash_start:crash_start+60] = np.linspace(0, -0.4, 60) # 两个月内暴跌40%
# 2008年底政策预期反弹 (11月后)
rebound = np.zeros(len(dates))
rebound_start = np.where(dates == '2008-11-01')[0][0]
rebound[rebound_start:] = np.linspace(0, 0.5, len(dates) - rebound_start) # 政策预期带来的强势反弹
values = base_value * np.exp(trend + noise + crash + rebound)
return pd.Series(values, index=dates, name='新能源指数')
生成模拟数据
new_energy_index = generate_mock_data()
计算技术指标 (简化版)
def calculate_technical_indicators(data):
# 移动平均线 (MA)
data['MA5'] = data.rolling(window=5).mean()
data['MA20'] = data.rolling(window=20).mean()
# MACD (指数平滑异同平均线)
ema12 = data.ewm(span=12, adjust=False).mean()
ema26 = data.ewm(span=26, adjust=False).mean()
data['MACD'] = ema12 - ema26
data['Signal'] = data['MACD'].ewm(span=9, adjust=False).mean()
# KDJ (随机指标)
low_min = data.rolling(window=9).min()
high_max = data.rolling(window=9).max()
rsv = (data - low_min) / (high_max - low_min) * 100
data['K'] = rsv.ewm(com=2).mean() # 快速K值
data['D'] = data['K'].ewm(com=2).mean() # 慢速D值
data['J'] = 3 data['K'] - 2 data['D'] # J值
return data
计算指标
df = calculate_technical_indicators(new_energy_index.to_frame('Close'))
绘制K线图 (简化版,使用折线图代替)
plt.figure(figsize=(14, 10))
主图:价格走势 + MA
ax1 = plt.subplot(2, 1, 1)
plt.plot(df.index, df['Close'], label='新能源指数', color='b', linewidth=2)
plt.plot(df.index, df['MA5'], label='5日均线', color='orange', linestyle='--')
plt.plot(df.index, df['MA20'], label='20日均线', color='purple', linestyle='-.')
plt.title('新能源板块指数走势 (2004-2008)')
plt.legend(loc='best')
plt.grid(True)
副图1:MACD
ax2 = plt.subplot(2, 1, 2)
plt.bar(df.index, df['MACD'], color=np.where(df['MACD'] >= 0, 'r', 'g'), alpha=0.7, label='MACD')
plt.plot(df.index, df['Signal'], color='b', label='Signal Line')
plt.title('MACD指标')
plt.legend(loc='best')
plt.grid(True)
标记关键区域 - 2009年Q1预期陡坡 (模拟)
在2008年底位置添加箭头和文字标注
plt.annotate('政策预期引爆点',
xy=(df.index[-50], df['Close'].iloc[-50]),
xytext=(df.index[-100], df['Close'].iloc[-50] - 200),
arrowprops=dict(facecolor='red', shrink=0.05),
fontsize=12,
color='red')
显示图形
plt.tight_layout()
plt.show()
代码运行。风扇的嘶鸣陡然拔高,像垂死者的喘息。屏幕上的折线图如同沉睡的巨龙,在时间的坐标轴上蜿蜒爬行。2004年的起点平缓,2007年股灾的断崖式暴跌触目惊心(模拟的40%跌幅),如同被斩断的龙尾。随后是漫长的、令人窒息的横盘,如同巨龙在泥沼中挣扎。直到2008年底,那条蓝色的“新能源指数”线如同被注入强心针,猛地昂起头颅!5日均线(橙色虚线)金叉上穿20日均线(紫色点划线),形成锐利的黄金交叉!MACD指标柱状图(红绿相间)在底部翻红,红色柱体迅猛拉长,如同喷发的火山熔岩!信号线(蓝色)被强势拉起,指向苍穹!
吴舟的目光死死钉在2009年第一季度模拟的陡峭上升线上。那条红线如同烧红的烙铁,灼烧着他的视网膜。前世记忆如高压电流瞬间贯穿——2009年初,四万亿刺激政策落地,新能源补贴细则出台,被压抑的产能和资本如同开闸的洪水,瞬间淹没了市场!比亚迪股价一个月翻三倍!天齐锂业、赣锋锂业这些后来的巨头,彼时还名不见经传的小公司,股价如同坐上了火箭!市场称之为——“煤飞色舞”!煤炭、有色、新能源……所有与“新基建”、“绿色能源”沾边的板块,都沐浴在政策的金色暴雨中,疯狂起舞!
“我操!这波浪线!”一个带着烟味和汗酸气的声音突然在耳边炸响,震得吴舟耳膜嗡嗡作响,“跟老子玩的《劲舞团》节奏似的!Duang!Duang!Duang!”赵磊不知何时凑了过来,油亮的脑袋几乎要贴到屏幕上,手指戳着那条陡峭的红线,“看!这地方!像不像Perfect连击?爆分点!”
吴舟猛地转头!赵磊晒得黝黑的脸上挂着亢奋的笑容,后颈蝎子刺青的伤口结着暗红的痂,在屏幕蓝光下微微反光。他嘴里喷着劣质烟草的气息,眼睛里却燃烧着一种近乎原始的、对图形韵律的敏感。
《劲舞团》?Perfect连击?爆分点?
这几个词像闪电般劈开混沌!吴舟的瞳孔骤然收缩!前世在量化交易部门,那些冰冷的算法模型、高频交易策略、市场情绪捕捉AI……无数复杂的、耗资巨大的系统,其核心逻辑之一,不就是捕捉市场节奏的突变点吗?就像游戏里精准踩中那个“Perfect”的瞬间!
他猛地看向屏幕!那条陡峭的红线,在技术指标上,正是MACD翻红放量、均线金叉、KDJ低位钝化后J值急速上穿的超买信号叠加点!是技术分析上的“黄金买点”!也是政策预期引爆市场情绪的“爆点”!
一个近乎疯狂的主意,如同岩浆般从心底喷涌而出!
“磊子,”吴舟的声音带着一种金属摩擦般的嘶哑,目光锐利如刀,直刺赵磊眼底,“你的脚本……能抓游戏里的节奏点吗?”
赵磊一愣,随即咧嘴笑了,露出被烟熏黄的牙齿:“废话!《劲舞团》的Perfect判定,老子写的脚本闭着眼都能踩中!毫秒不差!”他拍着胸脯,T恤上印着的“涅槃战队”LOGO被拍得啪啪响,“怎么?舟哥也想打游戏?我带你飞!”
“不打游戏。”吴舟的指尖在键盘上敲击,调出另一个窗口——是爬虫实时抓取的财经新闻和政府工作报告关键词频率统计。绿色的字符流显示:“新能源”出现频率 +15%,“补贴” +22%,“试点城市” +18%……冰冷的数字如同密集的鼓点,敲击着市场的神经。“打这个。”他指着屏幕上跳动的数据和那条蓄势待发的陡峭红线,“市场的节奏。”
赵磊脸上的笑容僵住了,浑浊的眼珠里充满了困惑:“市场?啥节奏?”
“政策落地前的躁动,资金涌入的脉冲,散户跟风的狂热……”吴舟的声音低沉,像在描述一场即将到来的风暴,“就像《劲舞团》里,音乐高潮前的那几个节拍,鼓点越来越密,屏幕提示箭头越来越快……”他的指尖点在MACD翻红的柱状图上,“这里,就是‘Perfect’的前奏!”
赵磊的眼睛一点点瞪圆了!他看看屏幕上那如同火山喷发前兆的红色柱体,又看看吴舟那双仿佛能洞穿未来的眼睛,再想想自己脚本里那些精准判定游戏节奏的代码逻辑……一种难以言喻的、混合着震惊和狂热的电流瞬间窜遍全身!
“操!”他猛地一拍大腿,震得桌子嗡嗡作响,“舟哥!你是说……用抓游戏节奏的脚本……抓……抓这个?!”他指着那条陡峭的红线,手指因激动而剧烈颤抖,“能行?!”
“试试。”吴舟的声音平静无波,却带着不容置疑的力量。他调出Python编辑器,新建一个文件,指尖在油腻的键盘上翻飞,敲下新的代码框架:
量化交易策略雏形:市场节奏捕捉器 (MarketBeatCatcher)
核心逻辑:模仿游戏节奏判定,捕捉政策/情绪引爆点
class MarketBeatCatcher:
def __init__(self, stock_data):
self.data = stock_data # 包含价格、成交量、技术指标等
self.beat_threshold = 0.0 # 节奏强度阈值 (动态调整)
self.current_beat_strength = 0.0 # 当前节奏强度
def detect_rhythm(self, new_data_point):
"""
检测新数据点带来的市场节奏变化
逻辑类似游戏判定:连续利好(正向箭头)累积节奏强度,超阈值触发“Perfect”买入信号
"""
# 1. 计算“利好箭头”强度 (示例逻辑)
arrow_strength = 0
# MACD柱状图变长且为正 (利好)
if new_data_point['MACD'] > 0 and new_data_point['MACD'] > self.data.iloc[-1]['MACD']:
arrow_strength += 0.3 * new_data_point['MACD'] # MACD增长贡献强度
# 成交量放大 (利好)
if new_data_point['Volume'] > self.data.iloc[-1]['Volume'] * 1.5:
arrow_strength += 0.2
# 出现政策关键词 (重大利好)
if new_data_point['PolicyKeywordCount'] > 5: # 假设爬虫实时提供关键词计数
arrow_strength += 0.5
# 2. 更新节奏强度 (类似连击Combo)
if arrow_strength > 0:
self.current_beat_strength += arrow_strength
# 衰减机制 (避免无限累积)
self.current_beat_strength *= 0.9
else:
# 出现利空 (节奏中断)
self.current_beat_strength = max(0, self.current_beat_strength - 0.5)
# 3. 动态调整阈值 (市场热度越高,阈值越低,越容易触发)
market_heat = self.calculate_market_heat() # 综合成交量、换手率、市场情绪指数等
self.beat_threshold = 0.8 - (market_heat * 0.1) # 示例公式
# 4. 判定“Perfect”信号 (买入)
if self.current_beat_strength >= self.beat_threshold:
return "PERFECT_BUY", self.current_beat_strength
else:
return "HOLD", self.current_beat_strength
def calculate_market_heat(self):
# 简化计算:使用近期平均成交量 / 历史平均成交量
recent_avg_vol = self.data['Volume'].tail(5).mean()
historical_avg_vol = self.data['Volume'].mean()
heat = min(1.0, recent_avg_vol / historical_avg_vol) # 限制在0-1范围
return heat
示例使用 (需接入实时数据流)
catcher = MarketBeatCatcher(historical_data)
while True:
new_data = get_real_time_data() # 获取实时数据点
signal, strength = catcher.detect_rhythm(new_data)
if signal == "PERFECT_BUY":
execute_buy_order() # 执行买入
catcher.current_beat_strength = 0 # 重置节奏强度
代码在屏幕上滚动,绿色的字符如同跳跃的音符。赵磊凑得更近,浑浊的眼珠死死盯着屏幕,嘴里念念有词:“利好箭头…强度…连击Combo…阈值…Perfect信号……”他猛地抬起头,脸上爆发出难以置信的狂喜!“操!舟哥!这他妈不就是《劲舞团》的判定逻辑吗?!利好是箭头!强度是按键准度!连击是Combo!阈值是Perfect线!信号就是爆分!”
他激动得手舞足蹈,后颈的蝎子刺青随着动作微微起伏:“老子能写!这玩意儿老子闭着眼睛都能写出来!比游戏判定简单!游戏里还要算延迟!算网络!这玩意儿就他妈看数据!看新闻!”
吴舟没说话,只是将笔记本电脑推向赵磊。屏幕幽蓝的光映着赵磊因亢奋而扭曲的脸,也映着那条指向2009年Q1的、如同血色利剑般的陡峭红线。窗外,地铁站的人流依旧汹涌,城市的脉搏在暮色中强劲搏动。而在这间弥漫着工业气息的新店里,一个由游戏脚本演变而来的、捕捉市场“Perfect”节奏的量化幽灵,正悄然诞生。吴舟的目光越过赵磊激动的脸庞,投向窗外科技园璀璨的灯火。那里,资本的巨兽正在沉睡,而他们手中,已经握住了唤醒它的、名为“节奏”的钥匙。