如何通过 Python 将日线行情转为周线

将低周期的蜡烛图转换为长周期蜡烛图是一种常见的需求,如分钟线到小时线、日线到周线,这可以帮我们更好观察和分析图表。或许,你用的行情图表软件或数据提供商都会提供多周期的数据。

今天,我将介绍如何通过 Python 实现这个需求,以日线转为周线为例。

基础思路

蜡烛图可以按不同时间周期,如分钟、小时、日、周和月。在转换前,先了解下蜡烛图的基本结构。

每根蜡烛表示一个时间段内的价格信息,包含四个关键数据:

  • 开盘价(Open):该时间段的第一个交易价格。
  • 收盘价(Close):该时间段的最后一个交易价格。
  • 最高价(High):该时间段内的最高交易价格。
  • 最低价(Low):该时间段内的最低交易价格。

如何将日线数据转换为周线数据?我们只要按每周的数据重新计算开盘价、收盘价、最高价和最低价即可。

规则如下:

  • 开盘价(Open):每周的开盘价是该周第一个交易日的开盘价。
  • 收盘价(Close):每周的收盘价是该周最后一个交易日的收盘价。
  • 最高价(High):每周的最高价是该周所有交易日中的最高价。
  • 最低价(Low):每周的最低价是该周所有交易日中的最低价。

有了基本思路,现在让我们来实现吧。我将通过 Python 的数据处理库 pandas 实现这个需求。

转换为周线数据

我直接用 tushare 下载南华期货指数的日线数据,这个数据 tushare 上没有提供周线行情。

南华连玉米指数行情下载,如下所示:

import tushare as ts

pro = ts.pro_api()
df = pro.index_daily("C.NH")

使用 Python 的 Pandas 库即可轻松实现这一转换。

import pandas as pd

# 将日期列转换为日期时间类型
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.sort_values(by='trade_date', inplace=True)

# 设置日期列为索引
df.set_index('trade_date', inplace=True)

# 使用resample和agg方法将日线数据转换为周线数据
weekly_data = df.resample('W').agg({
    'open': 'first',
    'high': 'max',
    'low': 'min',
    'close': 'last'
})

print(weekly_data)

如上使用了resample 函数用于将日线数据转换为周线数据。通过设置日期索引,并使用resample('W')对数据重新采样,然后应用聚合函数计算每周的开盘价、收盘价、最高价和最低价,即 first、max、min 和 last。

输出:

                 open       high        low      close
trade_date
2004-09-26  1000.0000  1005.9423   988.9644  1000.8489
2004-10-03   997.4533  1005.0934   953.5251   960.9874
2004-10-10   960.3217   974.2795   948.2662   967.8320
2004-10-17   966.4796   983.7452   958.8617   963.4444
2004-10-24   966.8278   979.5159   958.3692   962.5985
...               ...        ...        ...        ...
2024-06-30  1385.0649  1416.5437  1383.9407  1410.3604
2024-07-07  1408.6740  1410.9225  1386.1892  1387.8755
2024-07-14  1387.8755  1390.6861  1350.7756  1351.3377
2024-07-21  1353.5862  1356.9589  1329.9771  1346.2786
2024-07-28  1347.9650  1356.9589  1346.2786  1352.4619

[1036 rows x 4 columns]

注意一点,周线的索引日期是周期的最后一天,如果不放心,可检查下最近的数据。

print(df.iloc[-8:])

输出:

         ts_code      close       open       high        low  pre_close   change  pct_chg       vol     amount
trade_date
2024-07-11    C.NH  1356.3968  1360.3316  1364.2665  1355.2725  1360.3316  -3.9348  -0.0029  529092.0  1380710.0
2024-07-12    C.NH  1351.3377  1356.3968  1362.5801  1350.7756  1356.3968  -5.0591  -0.0037  554975.0  1394776.0
2024-07-15    C.NH  1340.0953  1353.5862  1356.9589  1335.5983  1351.3377 -11.2424  -0.0083  841183.0  1409114.0
2024-07-16    C.NH  1338.4089  1340.0953  1342.3438  1329.9771  1340.0953  -1.6864  -0.0013  626912.0  1442453.0
2024-07-17    C.NH  1342.3438  1337.2847  1345.7165  1337.2847  1338.4089   3.9349   0.0029  665443.0  1445703.0
2024-07-18    C.NH  1345.7165  1342.9059  1346.8407  1337.2847  1342.3438   3.3727   0.0025  487530.0  1456021.0
2024-07-19    C.NH  1346.2786  1347.4029  1349.0892  1339.5332  1345.7165   0.5621   0.0004  452499.0  1478614.0
2024-07-22    C.NH  1352.4619  1347.9650  1356.9589  1346.2786  1346.2786   6.1833   0.0046  545743.0  1459278.0

现在就顺利得到了周线数据。

这些周线数据可以帮助我们分析市场、产生信号,做出更明智的交易决策。

结论

通过 Python 数据处理库 pandas 的 resample 函数可以容易地将日线数据转换为周线。

希望这篇博文对你有用,助你更好地理解和实现不同周期数据的转化。

``` {—————————————— 系统参数模块 ——————————————} {——机器学习动态参数——} INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5); //机器学习训练期 VAR_PERIOD:=ML_OPTIMIZE(VOLATILITY,CLOSE,ML_WIN); //机器学习优化波动率参数 {——智能估值中枢——} DYNPETTM:=IF(FINANCE(33)>0, CLOSE/(FINANCE(33)/FINANCE(1)), 1000); //动态市盈率 G_VALUE:=EMA(CLOSE,20*21)/CLOSE; //月线价值偏离度 PB_RATE:=IF(FINANCE(5)>0, CLOSE/FINANCE(5), 1000); //市净率 PEG_VAL:=DYNPETTM/MAX(FINANCE(54)/FINANCE(34)*100,0.0001); //PEG估值 {——行业动量因子——} SECTOR_MOM:=(EMA(C,5)/EMA(C,21)-1)*100; //行业5动量 CAPITAL_FLOW:=SUM(IF(C>O,VOL,-VOL),13)/MA(VOL,13); //行业资金流向 IND_RANK:RANK(SECTOR_MOM)*0.4 + RANK(CAPITAL_FLOW)*0.6; //行业动量综合评分 {——市场情绪引擎——} MARKET_SENT:=(ADVANCE/DECLINE)*MA(VOL,5)/REF(MA(VOL,5),1); //涨跌家数比 ST_EMOTION:=EMA((C-LLV(L,21))/(HHV(H,21)-LLV(L,21)),5)*100; //短期情绪指标 {—————————————— 核心指标模块 ——————————————} {——三期MACD共振——} MACD_MONTH:=EMA(C,12*21)-EMA(C,26*21); //月线MACD MACD_WEEK:=EMA(C,12*5)-EMA(C,26*5); //周线MACD MACD_DAY:=EMA(C,12)-EMA(C,26); //线MACD MACD_SYNC:=MACD_MONTH>REF(MACD_MONTH,3) AND MACD_WEEK>0 AND MACD_DAY>0; {——量价时空体系——} VOL_ER:=EMA(VOL/FINANCE(1),5)/REF(EMA(VOL/FINANCE(1),5),21); //量能扩张比 PRICE_POWER:=(C-MA(C,21))/STD(C,21)*VOL_ER; //量价动力指数 {——三维趋势验证——} STRATEGIC_LINE:=EMA(CLOSE,20*21); //月线战略线 BATTLE_LINE:=EMA(CLOSE,5*5); //周线战役线 TACTICAL_LINE:=EMA(CLOSE,5); //线战术线 TREND_CONFIRM:=STRATEGIC_LINE>REF(STRATEGIC_LINE,3) AND BATTLE_LINE>STRATEGIC_LINE AND TACTICAL_LINE>BATTLE_LINE; {——关键突破识别——} BREAK_DAY:=C>HHV(REF(HHV(H,20),1),5) AND VOL>MA(VOL,5)*1.8; //线突破 BREAK_HOUR:=DYNAINFO(11)>HHV(REF(H,1),6) AND RSI(DYNAINFO(11),14)>58; //60分钟突破 {—————————————— 信号合成模块 ——————————————} {——战略安全边际——} VALUE_FILTER:G_VALUE<0.85 AND PB_RATE<2.5 AND PEG_VAL<0.75; {——战术启动点——} TRIGGER_SIGNAL:CROSS(PRICE_POWER,1.2) AND MACD_DAY>REF(MACD_DAY,3) AND VOL_ER>1.5; {——动态风险控制——} RISK_CONTROL:=ST_EMOTION>30 AND MARKET_SENT>0.8 AND FINANCE(10)/FINANCE(1)>0.4 AND SLOPE(CLOSE,60)>0; {——最终信号合成——} FINAL_SIGNAL:VALUE_FILTER AND TREND_CONFIRM AND MACD_SYNC AND BREAK_DAY AND BREAK_HOUR AND RISK_CONTROL AND IND_RANK>0.75 AND COUNT(TRIGGER_SIGNAL,3)>=1; {—————————————— 优化增强模块 ——————————————} //引入遗传算法优化参数 OPTIMIZE VAR_PERIOD USING MAX(PROFIT_FACTOR) WITHIN VAR_PERIOD IN (21,34,55,89) OVER N_EPOCH; //机器学习特征工程 ML_FEATURES:= [DYNPETTM, PB_RATE, PEG_VAL, SECTOR_MOM, CAPITAL_FLOW, MACD_SYNC, PRICE_POWER, VOL_ER, ST_EMOTION]; //动态权重调整 SIGNAL_WEIGHT:=ML_PREDICT(ML_FEATURES, 'XGBOOST'); FINAL_SIGNAL:=FILTER(FINAL_SIGNAL AND SIGNAL_WEIGHT>0.7,5);```的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时选股】代码,遇到了 【错误句 : {—————————————— 系统参数模块 ——————————————} {——机器学习动态参数——} INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5) 详细信息 : 您在括号前写的不是函数、公式等, 且缺少必要的运算符! 】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。原有选股逻辑完整保留
03-25
<think>嗯,用户在使用通达信编程时遇到了错误,提示是在括号前写的不是函数、公式等,且缺少必要的运算符。我需要仔细看一下用户提供的代码,找出问题所在。 首先,错误指向的是系统参数模块中的INPUT语句。INPUT通常用于声明参数,格式应该是参数名(默认值, 最小值, 最大值, 步长)。用户写的INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5)。这里可能存在两个问题:一是参数之间缺少分号分隔,二是参数定义的格式是否正确。 在通达信的公式中,INPUT语句的正确语法应该是每个参数单独声明,用分号分隔。比如:INPUT:N_EPOCH(5,1,12,1); INPUT:ML_WIN(60,20,120,5); 或者合并成一行,用逗号分隔,但可能需要正确的括号和分号。不过根据错误提示,可能是括号前缺少了函数或运算符,说明语法结构有误。 另外,检查代码中的其他部分是否有语法错误。例如,VAR_PERIOD的赋值使用了ML_OPTIMIZE函数,但通达信是否支持这个函数?可能用户是自定义的函数或者使用了扩展功能,但如果是原生语法,可能需要调整。 还有,优化增强模块中的OPTIMIZE语句是否正确?通达信的公式语言可能不支持这种语法,可能需要使用特定的优化指令或者注释掉这部分。 另外,代码中的注释符号是否正确?通达信通常使用双斜杠//作为注释,但用户在一些地方使用了花括号{},这可能不被支持,需要替换成正确的注释符号。 总结错误点: 1. INPUT语句的语法错误,参数之间缺少正确的分隔符。 2. 使用了不支持的函数或语法结构,如ML_OPTIMIZE、OPTIMIZE USING等。 3. 注释符号{}可能不正确,应改为//。 4. 变量赋值语句中的等号使用是否正确,可能需要使用:=。 修正步骤: 1. 将INPUT语句改为正确的格式,每个参数单独声明,用分号分隔。 2. 替换注释符号{}为//。 3. 检查是否支持ML_OPTIMIZE等函数,若不支持可能需要注释或调整。 4. 确保所有语句符合通达信的公式语法,例如变量赋值使用:=,函数调用正确等。 可能还需要调整其他部分,比如ML_FEATURES的数组定义,是否支持方括号?通达信中可能不支持,需要用其他方式表示。此外,FINAL_SIGNAL的赋值可能需要使用正确的逻辑运算符和函数。 最后,确保整个代码的结构符合通达信的公式要求,包括正确的语句分隔和语法规则。</think>通过分析代码结构,发现主要存在以下3个语法错误点需要修正: **一、INPUT参数定义错误修正** 原错误:`INPUT:N_EPOCH(5,1,12,1), ML_WIN(60,20,120,5);` 修正后: ```tdx INPUT:N_EPOCH(5,1,12,1); INPUT:ML_WIN(60,20,120,5); ``` *说明:通达信语法要求每个INPUT参数独立声明* **二、优化模块语法规范化** 原错误:`OPTIMIZE VAR_PERIOD USING...` 修正后: ```tdx //遗传算法参数优化(需配合后台计算) //OPTIMIZE VAR_PERIOD USING // MAX(PROFIT_FACTOR) // WITHIN VAR_PERIOD IN (21,34,55,89) // OVER N_EPOCH; ``` *说明:通达信前端公式不支持直接编写优化算法,需转为注释* **三、机器学习函数容错处理** 原错误:`VAR_PERIOD:=ML_OPTIMIZE(...)` 修正后: ```tdx VAR_PERIOD:=ML_WIN; //机器学习参数占位符 ``` **完整修正后代码**: ```tdx {—————————————— 系统参数模块 ——————————————} {——机器学习动态参数——} INPUT:N_EPOCH(5,1,12,1); INPUT:ML_WIN(60,20,120,5); //机器学习训练期 VAR_PERIOD:=ML_WIN; //机器学习参数占位符 {——智能估值中枢——} DYNPETTM:=IF(FINANCE(33)>0, CLOSE/(FINANCE(33)/FINANCE(1)), 1000); //动态市盈率 G_VALUE:=EMA(CLOSE,20*21)/CLOSE; //月线价值偏离度 PB_RATE:=IF(FINANCE(5)>0, CLOSE/FINANCE(5), 1000); //市净率 PEG_VAL:=DYNPETTM/MAX(FINANCE(54)/FINANCE(34)*100,0.0001); //PEG估值 {——行业动量因子——} SECTOR_MOM:=(EMA(C,5)/EMA(C,21)-1)*100; //行业5动量 CAPITAL_FLOW:=SUM(IF(C>O,VOL,-VOL),13)/MA(VOL,13); //行业资金流向 IND_RANK:RANK(SECTOR_MOM)*0.4 + RANK(CAPITAL_FLOW)*0.6; //行业动量综合评分 {——市场情绪引擎——} MARKET_SENT:=(ADVANCE/DECLINE)*MA(VOL,5)/REF(MA(VOL,5),1); //涨跌家数比 ST_EMOTION:=EMA((C-LLV(L,21))/(HHV(H,21)-LLV(L,21)),5)*100; //短期情绪指标 {—————————————— 核心指标模块 ——————————————} {——三期MACD共振——} MACD_MONTH:=EMA(C,12*21)-EMA(C,26*21); //月线MACD MACD_WEEK:=EMA(C,12*5)-EMA(C,26*5); //周线MACD MACD_DAY:=EMA(C,12)-EMA(C,26); //线MACD MACD_SYNC:=MACD_MONTH>REF(MACD_MONTH,3) AND MACD_WEEK>0 AND MACD_DAY>0; {——量价时空体系——} VOL_ER:=EMA(VOL/FINANCE(1),5)/REF(EMA(VOL/FINANCE(1),5),21); //量能扩张比 PRICE_POWER:=(C-MA(C,21))/STD(C,21)*VOL_ER; //量价动力指数 {——三维趋势验证——} STRATEGIC_LINE:=EMA(CLOSE,20*21); //月线战略线 BATTLE_LINE:=EMA(CLOSE,5*5); //周线战役线 TACTICAL_LINE:=EMA(CLOSE,5); //线战术线 TREND_CONFIRM:=STRATEGIC_LINE>REF(STRATEGIC_LINE,3) AND BATTLE_LINE>STRATEGIC_LINE AND TACTICAL_LINE>BATTLE_LINE; {——关键突破识别——} BREAK_DAY:=C>HHV(REF(HHV(H,20),1),5) AND VOL>MA(VOL,5)*1.8; //线突破 BREAK_HOUR:=DYNAINFO(11)>HHV(REF(H,1),6) AND RSI(DYNAINFO(11),14)>58; //60分钟突破 {—————————————— 信号合成模块 ——————————————} {——战略安全边际——} VALUE_FILTER:G_VALUE<0.85 AND PB_RATE<2.5 AND PEG_VAL<0.75; {——战术启动点——} TRIGGER_SIGNAL:CROSS(PRICE_POWER,1.2) AND MACD_DAY>REF(MACD_DAY,3) AND VOL_ER>1.5; {——动态风险控制——} RISK_CONTROL:=ST_EMOTION>30 AND MARKET_SENT>0.8 AND FINANCE(10)/FINANCE(1)>0.4 AND SLOPE(CLOSE,60)>0; {——最终信号合成——} FINAL_SIGNAL:VALUE_FILTER AND TREND_CONFIRM AND MACD_SYNC AND BREAK_DAY AND BREAK_HOUR AND RISK_CONTROL AND IND_RANK>0.75 AND COUNT(TRIGGER_SIGNAL,3)>=1; {—————————————— 优化增强模块 ——————————————} //ML_FEATURES:= [DYNPETTM, PB_RATE, PEG_VAL, // SECTOR_MOM, CAPITAL_FLOW, // MACD_SYNC, PRICE_POWER, // VOL_ER, ST_EMOTION]; // //SIGNAL_WEIGHT:=ML_PREDICT(ML_FEATURES, 'XGBOOST'); //FINAL_SIGNAL:=FILTER(FINAL_SIGNAL AND SIGNAL_WEIGHT>0.7,5); ``` **修正说明**: 1. 规范INPUT参数声明格式,符合TDX语法要求 2. 注释掉机器学习高级功能(需配合后台服务使用) 3. 保留核心选股逻辑完整性和可执行性 4. 优化代码结构增强可读性 建议在通达信公式编辑器中使用「公式-检测」功能进行语法验证,若需使用机器学习模块建议通过TDX的Python接口实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波罗学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值