Daniel 2 лет назад
Родитель
Сommit
d232a00818
6 измененных файлов с 199 добавлено и 56 удалено
  1. 12 9
      bk_test.py
  2. 57 29
      his_money_flow.py
  3. 67 0
      macd_test.py
  4. 35 0
      qmt_get_market_data.py
  5. 21 14
      real_time_order_MA_HLFX_1025.py
  6. 7 4
      real_time_update_qbh_hlfx_1025.py

+ 12 - 9
bk_test.py

@@ -52,24 +52,25 @@ auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
 
 
 
-def calculateEMA(period, closeArray, emaArray=[]):
+def calculateEMA(period, closeArray, emaArray):
     """计算指数移动平均"""
     length = len(closeArray)
     nanCounter = np.count_nonzero(np.isnan(closeArray))
-    if not emaArray:
-        emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
-        firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+    if emaArray:
+        # emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+        # firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+        firstema = emaArray[-1]
         emaArray.append(firstema)
-        for i in range(nanCounter + period, length):
+        for i in range(nanCounter, length):
             ema = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
             emaArray.append(ema)
     return np.array(emaArray)
 
 
-def calculateMACD(closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
-    ema12 = calculateEMA(shortPeriod, closeArray, [])
+def calculateMACD(emaArray, closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, emaArray)
     print(ema12)
-    ema26 = calculateEMA(longPeriod, closeArray, [])
+    ema26 = calculateEMA(longPeriod, closeArray, emaArray)
     print(ema26)
     diff = ema12 - ema26
 
@@ -79,10 +80,12 @@ def calculateMACD(closeArray, shortPeriod=12, longPeriod=26, signalPeriod=9):
 
 stock = '000010.XSHE'
 fre = '1d'
+emaArray = []
 engine_stock = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
 df = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine_stock)
 df_close = df['close']
-df2 = calculateMACD(df_close)
+emaArray.append = EMA(stock, check_date='2010-01-04', timeperiod=fre)[stock]
+df2 = calculateMACD(emaArray, df_close)
 print(df2)
 print(len(df), len(df2[0]))
 df3 = pd.concat([df, pd.Series(df2[0]).rename('macd'), pd.Series(df2[1]).rename('diff'), pd.Series(df2[2]).rename('dea')], axis=1)

+ 57 - 29
his_money_flow.py

@@ -1,53 +1,81 @@
 from jqdatasdk import *
 from datetime import datetime as dt
 import pandas as pd
-import pymysql
 from sqlalchemy import create_engine
+import numpy as np
+from jqdatasdk.technical_analysis import *
 
-auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+def calculateEMA(period, closeArray, ema, emaArray=[]):
+    """计算指数移动平均"""
+    length = len(closeArray)
+    nanCounter = np.count_nonzero(np.isnan(closeArray))
+    if not emaArray:
+        if ema and (ema !=0):
+            firstema = ema
+            emaArray.append(firstema)
+        else:
+            print('走这里了')
+            emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+            firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+            emaArray.append(firstema)
+        for i in range(nanCounter+period, length):
+            ema_a = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
+            emaArray.append(ema_a)
+    return np.array(emaArray)
+
+
+def calculateMACD(closeArray, ema, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, ema, [])
+    ema26 = calculateEMA(longPeriod, closeArray, ema, [])
+    diff = ema12 - ema26
+    dea = calculateEMA(signalPeriod, diff, 0, [])
+    macd = 2 * (diff - dea)
+    return macd, diff, dea
+
+# auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+auth('18521506014', 'Abc123!@#')
 stocks = list(get_all_securities(['stock'], date=dt.today().strftime('%Y-%m-%d')).index)
 engine = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
 engine_data = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks_data?charset=utf8')
-# stocks_List = ','.join(set(stocks))
-
-# db_stocks_list = pymysql.connect(host='localhost',
-#                           user='root',
-#                           port=3307,
-#                           password='r6kEwqWU9!v3',
-#                           database='hlfx_pool')
-# cursor_stock_list = db_stocks_list.cursor()
-# sql = "INSERT INTO stocks_list (date,securities) VALUES('%s','%s')" % (dt.today().strftime('%Y-%m-%d'),  stocks_List)
-# cursor_stock_list.execute(sql)
-# db_stocks_list.commit()
-# db_stocks_list.close()
 
 fre = '1d'
 print('ready to write to mysql %s' % fre)
-for stock in stocks[2500:]:
+for stock in stocks[2500:2501]:
     print(stock, fre)
-    starttime ='2010-01-04'
+    starttime ='2022-01-01'
     # endtime = pd.read_sql_table('stk%s_%s' % (stock, fre), con=engine).iloc[-1, 1]
-    df_stock = get_price(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
+    df_stock2 = get_price(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
                          frequency=fre, fields=['open', 'close', 'high', 'low', 'volume', 'money'],
                          skip_paused=False,
                          fq='pre', count=None, panel=False)
-    df_stock.index.name = 'date'
-
-    # print(df_stock)
-    # print(starttime,endtime)
 
+    df_stock = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine)
+    # df_stock.index.name = 'date'
     df_money = get_money_flow(stock, start_date=starttime, end_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'),
                               fields=None, count=None)
     df_money = df_money.drop(columns=['sec_code'])
-    # df_money.to_csv('/Users/daniel/Downloads/000002.csv')
-    # print(df_money)
-
     df_stock = pd.merge(df_stock, df_money, how='outer', left_index=False , on='date')
-    df_stock.to_csv('/Users/daniel/Downloads/Result.csv')
+    # df_stock.to_csv('/Users/daniel/Downloads/Result.csv')
     df_stock = df_stock.dropna(axis=0)
-    df_stock.reset_index(inplace=True)
-    df_stock.rename(columns={'index': 'date'}, inplace=True)
-    df_stock.to_sql('stk%s_%s' % (stock, fre), con=engine_data, index=True, if_exists='append')
+    df_stock2=df_stock2.dropna(axis=0)
+    df_stock2.reset_index(inplace=True)
+    df_stock2.rename(columns={'index': 'date'}, inplace=True)
+    print(df_stock2)
+    df_close = df_stock2['close']
+
+    if starttime != df_stock2.loc[0, 'date'].strftime('%Y-%m-%d'):
+        ema = 0
+    else:
+        ema = EMA(stock, check_date=starttime, timeperiod=30)[stock]
+    df_macd = calculateMACD(df_close, ema)
+
+    df_stock = pd.concat([df_stock2, pd.Series(df_macd[0]).rename('macd'), pd.Series(df_macd[1]).rename('diff'), pd.Series(df_macd[2]).rename('dea')], axis=1)
+
+    x_macd_dif, x_macd_dea, x_macd_macd = MACD(stock, check_date=dt.today().strftime('%Y-%m-%d %H:%M:%S'), SHORT=12, LONG=26, MID=9,
+                                               unit=fre)
+    print(x_macd_macd, x_macd_dif, x_macd_dea)
+    print(df_stock)
+    # df_stock.to_sql('stk%s_%s' % (stock, fre), con=engine_data, index=True, if_exists='append')
     # with engine.connect() as con:
     #     con.execute("ALTER TABLE `stk%s_%s` ADD PRIMARY KEY (`date`);" % (stock, fre))
-    print(df_stock)
+    # print(df_stock)

+ 67 - 0
macd_test.py

@@ -0,0 +1,67 @@
+from jqdatasdk import *
+from sqlalchemy import create_engine
+from jqdatasdk.technical_analysis import *
+
+
+auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+
+import numpy as np
+import pandas as pd
+
+
+def calculateEMA(period, closeArray, ema, emaArray=[]):
+    """计算指数移动平均"""
+    length = len(closeArray)
+    nanCounter = np.count_nonzero(np.isnan(closeArray))
+    print('def ema', ema)
+    if not emaArray:
+        if not ema and ema:
+            firstema = ema
+        else:
+            firstema = np.mean(closeArray[nanCounter:nanCounter + period - 1])
+        # emaArray.extend(np.tile([np.nan], (nanCounter + period - 1)))
+        print('fe', firstema)
+        emaArray.append(firstema)
+
+        for i in range(nanCounter, length):
+            ema_a = (2 * closeArray[i] + (period - 1) * emaArray[-1]) / (period + 1)
+            emaArray.append(ema_a)
+    return np.array(emaArray[1:])
+
+
+def calculateMACD(closeArray,ema, shortPeriod=12, longPeriod=26, signalPeriod=9):
+    ema12 = calculateEMA(shortPeriod, closeArray, ema, [])
+    print(ema12)
+    ema26 = calculateEMA(longPeriod, closeArray, ema, [])
+    print(ema26)
+    diff = ema12 - ema26
+
+    dea = calculateEMA(signalPeriod, diff, 0, [])
+    print(diff,len(diff))
+    print('dea=', dea, type(dea))
+    macd = 2 * (diff - dea)
+    return macd, diff, dea
+
+
+stock = '300114.XSHE'
+fre = '1d'
+check_date = '2010-01-04'
+emaArray = []
+engine_stock = create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8')
+df = pd.read_sql_query('select date,open,close,high,low,volume,money from `stk%s_%s`' % (stock, fre), engine_stock)
+df_close = df['close']
+ema = EMA(stock, check_date=f'2009-12-31', timeperiod=30)[stock]
+print('ddd', ema)
+df4 = calculateMACD(df_close, ema)
+# df2 = calculateMACD(emaArray, df_close)
+# print('df2=', df2)
+# print(len(df), len(df2[0]))
+# df3 = pd.concat([df, pd.Series(df2[0]).rename('macd'), pd.Series(df2[1]).rename('diff'), pd.Series(df2[2]).rename('dea')], axis=1)
+
+print('df=', df)
+df4 = pd.concat([df, pd.Series(df4[0]).rename('macd'), pd.Series(df4[1]).rename('diff'), pd.Series(df4[2]).rename('dea')], axis=1)
+print('df=', df4)
+print(df4.loc[df.date== '2010-09-10',:])
+
+x_macd_dif, x_macd_dea, x_macd_macd = MACD(stock, check_date='2010-09-13 00:00:00', SHORT=12, LONG=26, MID=9, unit=fre)
+print(x_macd_macd, x_macd_dif, x_macd_dea)

+ 35 - 0
qmt_get_market_data.py

@@ -0,0 +1,35 @@
+# coding=utf-8
+from xtquant import xtdata
+from datetime import datetime as dt
+import pandas as pd
+from sqlalchemy import create_engine
+
+path = 'c:\\qmt\\userdata_mini'
+
+
+if __name__ == '__main__':
+    fre = '1d'
+    stocks = xtdata.get_stock_list_in_sector('沪深A股')
+    print(stocks, '\n')
+    stocks.sort()
+
+
+
+    # df_data = xtdata.get_local_data(field_list=[], stock_code=stocks, start_time='', end_time='',
+    #                                 period='1d',  count=-1)
+    # print(df_data)
+    for s in stocks[0:4]:
+        print(s)
+        cq = xtdata.get_divid_factors(s, start_time='19910101', end_time='20130115')
+        print(cq)
+        df_data = xtdata.get_local_data(field_list=[], stock_code=[s], start_time='', end_time='',
+                                        period='1d', count=-1, dividend_type='back')
+        df = pd.concat([df_data[i].T for i in ['time', 'open', 'high', 'low', 'close', 'volume', 'amount']], axis=1)
+        df.columns = ['time', 'open', 'high', 'low', 'close', 'volume', 'amount']
+        df['time'] = df['time'].apply(lambda x: dt.fromtimestamp(x / 1000.0))
+        # print(df)
+        df['time'] = pd.to_datetime(df['time'], unit='ms')
+        df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%d')
+        df.reset_index(drop=True, inplace=True)
+        # df['time'] = df['time'] + timedelta(hours=8)
+        print(df)

+ 21 - 14
real_time_order_MA_HLFX_1025.py

@@ -13,22 +13,20 @@ from xtquant import xtdata
 
 
 auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
-
+# auth('18521506014', 'Abc123!@#')
 #启动交易系统
 path = 'D:\\安信证券QMT实盘_交易终端\\userdata_mini'
 # session_id为会话编号,策略使用方对于不同的Python策略需要使用不同的会话编号
 session_id = 20221123
-#后续的所有示例将使用该实例对象
-xt_trader = XtQuantTrader(path, session_id)
-xt_trader.start()
-connect_result = xt_trader.connect()
-if connect_result == 0:
-    print('QMTmini 已连接')
-else:
-    print('连接失败')
 
-account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
-positions = xt_trader.query_stock_positions(account)
+# connect_result = xt_trader.connect()
+# if connect_result == 0:
+#     print('QMTmini 已连接')
+# else:
+#     print('连接失败')
+
+# account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
+# positions = xt_trader.query_stock_positions(account)
 
 
 
@@ -107,16 +105,24 @@ def Sell_Trader(stock, account, positions, volume):
 
 
 while True:
-
+    # print('进入循环')
     now_date = dt.now()
     date_morning_begin = now_date.replace(hour=9, minute=25, second=0)
     date_morning_end = now_date.replace(hour=11, minute=31, second=0)
     date_afternooe_begin = now_date.replace(hour=13, minute=0, second=0)
     date_afternooe_end = now_date.replace(hour=15, minute=0, second=0)
-    # if True:
-    if date_morning_begin < now_date < date_morning_end or date_afternooe_begin < now_date < date_afternooe_end:
+    if True:
+    # if date_morning_begin < now_date < date_morning_end or date_afternooe_begin < now_date < date_afternooe_end:
         # time.sleep(1800)
+        # 后续的所有示例将使用该实例对象
+        xt_trader = XtQuantTrader(path, session_id)
+        xt_trader.start()
+        connect_result = xt_trader.connect()
         try:
+            if connect_result == 0:
+                print('QMTmini 已连接')
+            else:
+                print('连接失败')
             account = StockAccount('920000207040', 'SECURITY')  # xt_trader为XtQuant API实例对象
             positions = xt_trader.query_stock_positions(account)
             print(positions)
@@ -220,6 +226,7 @@ while True:
                 price = get_bars(keep_stocks, count=1, unit=fre, fields=['close'])
 
                 XtTrader(new_keep_stock)
+        xt_trader.run_forever()
         time.sleep(1800)
     elif now_date > date_afternooe_end:
         pass

+ 7 - 4
real_time_update_qbh_hlfx_1025.py

@@ -7,6 +7,7 @@ from datetime import datetime as dt
 from jqdatasdk.technical_analysis import *
 
 auth('18616891214', 'Ea?*7f68nD.dafcW34d!')
+# auth('18521506014', 'Abc123!@#')
 stocks = list(get_all_securities(['stock'], date=dt.today().strftime('%Y-%m-%d')).index)
 # stocks = stocks[0:200]
 
@@ -265,8 +266,8 @@ while True:
     date_afternooe_begin = now_date.replace(hour=13, minute=0, second=0)
     date_afternooe_end = now_date.replace(hour=15, minute=0, second=0)
     # print(now_date,date_morning_begin,date_morning_end,date_afternooe_begin,date_afternooe_end)
-    if date_morning_begin < now_date < date_afternooe_end:
-    # if True:
+    # if date_morning_begin < now_date < date_afternooe_end:
+    if True:
         for fre in ['1d']:
             start = dt.now()
             print(fre)
@@ -309,10 +310,12 @@ while True:
             results_short = []
             print('数据库读取', len(results))
 
-            df = get_bars(stocks, count=20, unit=fre,
+            df = get_bars(stocks, count=5, unit=fre,
                           fields=['date', 'open', 'close', 'high', 'low', 'volume', 'money'], include_now=True, df=True)
+            print(df, type(df))
+            print(df.loc['603566.XSHG'])
             print(dt.now(), 'get_bars 成功')
-
+            exit()
             for i in range(0, len(stocks), step):
                 engine_stock.append(create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/stocks?charset=utf8'))
                 engine_hlfx.append(create_engine('mysql+pymysql://root:r6kEwqWU9!v3@localhost:3307/hlfx?charset=utf8'))