【株式自動売買】3本の移動平均線を使った株式売買判断プログラムを書いた話。

目次。

 

はじめに。

新型コロナウイルスの影響で2月、3月と株価が大暴落したけれども、実は4月から株価はぐんぐん上がっている。ひょっとするとチャンスかも。ただし、株式売買は自己責任で。

 

株式自動売買プログラム開発関連の文章は、以下のカテゴリーにまとめているので、興味のある方はどうぞ。

blog.sun-ek2.com

 

前回は、移動平均線を2本から3本に増やしてみた。

blog.sun-ek2.com

 

前回書いたプログラムは、過去の株価データを解析するものであった。今回書いたプログラムは、株式市場で実際に株式が売買されている時間帯にリアルタイムで株価を取ってきて、それを元に株式の売買タイミングを出力するプログラム。

 

株式売買の自動注文するプログラムは、もうすでに書いたが、しばらくの間は、プログラムの出力結果に従って、手動で売買しようと思う。

blog.sun-ek2.com

 

 

 

 

ソースコード(プログラムコード)。

前回の結果を参考して、340銘柄を対象に35個の移動平均線トリオを使ったプログラムを書いた。340銘柄、35個の移動平均線トリオを記録したcandidates_DMALs_3_2.txtを元に関数make_default_files()で、初期ファイルを作る。

 

関数trader2()は、実際に株式売買判断を下すコード。関数buying_list()は、買いシグナルが出ている銘柄を一覧で表示するコード。最後の関数selling_list()は、売りシグナルが出ている銘柄のうち、僕が実際に保有している銘柄だけを一覧にして表示するコード。

 

パソコンで見た方が見やすいかも。

import XXXXX #昔の記事を参照のこと。
import numpy as np
import datetime
import os
import glob
import time

SessionID, cookie_jar = XXXXX.getSessionID()

def make_default_files():
    candidates_DMALs_3_2 = None
    with open('trader_2\\candidates_DMALs_3_2.txt', encoding="utf-8_sig") as f:
        candidates_DMALs_3_2 = [s.replace('\n','').split(',') for s in f.readlines()]

    tmp = []
    tmp2 = []

    for e0 in candidates_DMALs_3_2[0]:
        tmp_1 = []
        tmp2_1 = []

        for e1 in candidates_DMALs_3_2[1]:
            tmp_1.append([e1.split('-')]+[['-', ':', 0], ['-', ':', 0]])
        tmp.append([e0, tmp_1])

        for e1 in candidates_DMALs_3_2[2]:
            tmp2_1.append([e1.split('-')]+['-', ':', 0])
        tmp2.append([e0, tmp2_1])

    now = datetime.datetime.now()
    now_date = now.strftime('%Y%m%d')
    np.save('trader_2\\candidates_DMALs_3-'+str(now_date)+'-0000', np.array(tmp))
    np.save('trader_2\\candidates_DMALs_2-'+str(now_date)+'-0000', np.array(tmp2))


now = datetime.datetime.now()
now_date = now.strftime('%Y%m%d')
now_time = now.strftime('%H:%M')
candidates_DMALs_2_3 = glob.glob('trader_2\\*.npy')

candidates_DMALs_2 = np.load(candidates_DMALs_2_3[0])
candidates_DMALs_3 = np.load(candidates_DMALs_2_3[1])
until_index = candidates_DMALs_2_3[0].split('-')[-1].split('.')[0]
until_date = candidates_DMALs_2_3[0].split('-')[-2]

def trader2():
    continue_flag = True
    for index_i, index in enumerate(candidates_DMALs_2[:,0]):
        print(index_i)

        if until_index != '0000' and index != until_index and continue_flag == True:
            continue
        if index == until_index:
            continue_flag = False
            continue

        StockPriceData = XXXXX.getTempStockPriceData(
            XXXXX.getStockPriceData(
                SessionID, cookie_jar, int(index),
                str((now-datetime.timedelta(days=50)).date()).replace('-','')))
        repeat_num = 0
        for i in range(100):
            if StockPriceData.index[-1-i] == until_date:
                break
            repeat_num += 1

        if StockPriceData.index[-3] == until_date and until_index == '0000':
            repeat_num = 0

        for i in range(len(candidates_DMALs_2[index_i][1])):
            buy_sell_signals = XXXXX.find_intersections(
                XXXXX.compare_nDayMovingAverageLines(
                    XXXXX.calc_nDayMovingAverageLine(
                        StockPriceData, int(candidates_DMALs_2[index_i][1][i][0][0])),
                        XXXXX.calc_nDayMovingAverageLine(StockPriceData,
                        int(candidates_DMALs_2[index_i][1][i][0][1]))))

            for k in range(repeat_num+1):
                if -repeat_num+k == 0:
                    buy_sell_signal = buy_sell_signals.iloc[-2:,:][0]
                else:
                    buy_sell_signal = buy_sell_signals.iloc[-2-repeat_num+k:-repeat_num+k,:][0]

                if (buy_sell_signal[-1] == 1 or (buy_sell_signal[-2] == 1 and buy_sell_signal[-1] == 0)) and candidates_DMALs_2[index_i][1][i][1] == '-' and StockPriceData['close'][-1] > 0:
                    candidates_DMALs_2[index_i][1][i][1] = now.strftime('%Y-%m-%d')
                    candidates_DMALs_2[index_i][1][i][2] = now.strftime('%H:%M')
                    candidates_DMALs_2[index_i][1][i][3] = StockPriceData['close'][-1]

                buy_sell_signal_flag = (buy_sell_signal[-1] == -1 or (buy_sell_signal[-2] == -1 and buy_sell_signal[-1] == 0)) and candidates_DMALs_2[index_i][1][i][1] != '-' and StockPriceData['close'][-1] > 0
                noise_proof_flag = candidates_DMALs_2[index_i][1][i][3] > 0 and abs(StockPriceData['close'][-1]-candidates_DMALs_2[index_i][1][i][3])/candidates_DMALs_2[index_i][1][i][3] > 0.03
                loss_cut_flag = candidates_DMALs_2[index_i][1][i][3] > 0 and (StockPriceData['close'][-1]-candidates_DMALs_2[index_i][1][i][3])/candidates_DMALs_2[index_i][1][i][3] < -0.1 and StockPriceData['close'][-1] > 0

                if (buy_sell_signal_flag and noise_proof_flag) or loss_cut_flag:
                    candidates_DMALs_2[index_i][1][i][1] = '-'
                    candidates_DMALs_2[index_i][1][i][2] = ':'
                    candidates_DMALs_2[index_i][1][i][3] = 0

                for index3_i, index3 in enumerate(candidates_DMALs_3[index_i][1]):
                    if index3[0][0] == '-':
                        continue

                    flag = 0
                    if index3[0][0] == candidates_DMALs_2[index_i][1][i][0][0] and index3[0][2] == candidates_DMALs_2[index_i][1][i][0][1]:
                        flag = 1
                    if index3[0][1] == candidates_DMALs_2[index_i][1][i][0][0] and index3[0][2] == candidates_DMALs_2[index_i][1][i][0][1]:
                        flag = 2
                    if flag == 0:
                        continue

                    if flag != 0:
                        if candidates_DMALs_2[index_i][1][i][3] != 0 and candidates_DMALs_3[index_i][1][index3_i][flag][2] == 0:
                            candidates_DMALs_3[index_i][1][index3_i][flag][0] = candidates_DMALs_2[index_i][1][i][1]
                            candidates_DMALs_3[index_i][1][index3_i][flag][1] = candidates_DMALs_2[index_i][1][i][2]
                            candidates_DMALs_3[index_i][1][index3_i][flag][2] = candidates_DMALs_2[index_i][1][i][3]
                            continue

                    if candidates_DMALs_3[index_i][1][index3_i][1][2] != 0 and candidates_DMALs_3[index_i][1][index3_i][2][2] != 0:
                        short_middle_long = str(index3[0][0]) + '--' + str(index3[0][1]) + '--' + str(index3[0][2])
                        date = '-'
                        time = ':'
                        price = 0

                        if candidates_DMALs_3[index_i][1][index3_i][1][0] > candidates_DMALs_3[index_i][1][index3_i][2][0]:
                            date = candidates_DMALs_3[index_i][1][index3_i][1][0]
                            time = candidates_DMALs_3[index_i][1][index3_i][1][1]
                            price = candidates_DMALs_3[index_i][1][index3_i][1][2]
                        elif candidates_DMALs_3[index_i][1][index3_i][1][0] < candidates_DMALs_3[index_i][1][index3_i][2][0]:
                            date = candidates_DMALs_3[index_i][1][index3_i][2][0]
                            time = candidates_DMALs_3[index_i][1][index3_i][2][1]
                            price = candidates_DMALs_3[index_i][1][index3_i][2][2]
                        else:
                            larger_flag = 2
                            if candidates_DMALs_3[index_i][1][index3_i][1][2] > candidates_DMALs_3[index_i][1][index3_i][1][2]:
                                larger_flag = 1
                            date = candidates_DMALs_3[index_i][1][index3_i][larger_flag][0]
                            time = candidates_DMALs_3[index_i][1][index3_i][larger_flag][1]
                            price = candidates_DMALs_3[index_i][1][index3_i][larger_flag][2]

                        if candidates_DMALs_2[index_i][1][i][3] == 0:
                            log = str(index) + ',' + str(short_middle_long) + ',' + str(date) + ',' + str(time) + ',' + str(price) + ','
                            log += str(now.strftime('%Y-%m-%d')) + ',' + str(now.strftime('%H:%M')) + ',' + str(StockPriceData['close'][-1]) + ',' + str(float(StockPriceData['close'][-1])-float(price))

                            fout = open('trader_2//tradeLog.csv', 'at')
                            fout.write(log+'\n')
                            fout.close()

                            candidates_DMALs_3[index_i][1][index3_i][flag][0] = '-'
                            candidates_DMALs_3[index_i][1][index3_i][flag][1] = ':'
                            candidates_DMALs_3[index_i][1][index3_i][flag][2] = 0

        os.rename(candidates_DMALs_2_3[0], 'trader_2\\candidates_DMALs_2-'+str(until_date)+'-'+str(index)+'.npy')
        os.rename(candidates_DMALs_2_3[1], 'trader_2\\candidates_DMALs_3-'+str(until_date)+'-'+str(index)+'.npy')
        candidates_DMALs_2_3[0] = 'trader_2\\candidates_DMALs_2-'+str(until_date)+'-'+str(index)+'.npy'
        candidates_DMALs_2_3[1] = 'trader_2\\candidates_DMALs_3-'+str(until_date)+'-'+str(index)+'.npy'
        np.save(candidates_DMALs_2_3[0], candidates_DMALs_2)
        np.save(candidates_DMALs_2_3[1], candidates_DMALs_3)

        if index_i == len(candidates_DMALs_2[:,0])-1:
            os.rename(candidates_DMALs_2_3[0], 'trader_2\\candidates_DMALs_2-'+StockPriceData.index[-1]+'-0000.npy')
            os.rename(candidates_DMALs_2_3[1], 'trader_2\\candidates_DMALs_3-'+StockPriceData.index[-1]+'-0000.npy')


def buying_list():
    candidates_DMALs_2_3 = glob.glob('trader_2\\*.npy')
    candidates_DMALs_3 = np.load(candidates_DMALs_2_3[1])
    until_date = candidates_DMALs_2_3[0].split('-')[-2]

    for i in range(len(candidates_DMALs_3)):
        price = 0
        DMALs_3s = [0]

        for ii in range(len(candidates_DMALs_3[i][1])):
            if candidates_DMALs_3[i][1][ii][1][0].replace('-', '') == until_date or candidates_DMALs_3[i][1][ii][2][0].replace('-', '') == until_date:
                if candidates_DMALs_3[i][1][ii][1][0] != '-' and candidates_DMALs_3[i][1][ii][2][0] != '-':
                    price = candidates_DMALs_3[i][1][ii][1][2]
                    if candidates_DMALs_3[i][1][ii][1][0] > candidates_DMALs_3[i][1][ii][2][0]:
                        price = candidates_DMALs_3[i][1][ii][2][2]
                    DMALs_3s[0] += 1
                    DMALs_3s.append(candidates_DMALs_3[i][1][ii][0])

        small_and_large_flag = [False, False]
        for DMALs_3 in DMALs_3s[1:]:
            if int(DMALs_3[0]) < 10:
                small_and_large_flag[0] = True
            if int(DMALs_3[0]) > 10:
                small_and_large_flag[1] = True

        if DMALs_3s[0] > 0 and small_and_large_flag[0] and small_and_large_flag[1]:
            print('買い注文。 ' + str(until_date))
            print('銘柄コード:' + str(candidates_DMALs_3[i][0]))
            print('短期-中期-長期移動平行線:' + str(DMALs_3s))
            print('株価:' + str(price))
            print('')


def selling_list()
    logs = None
    with open('trader_2//tradeLog.csv', encoding="utf-8_sig") as f:
        logs = [s.replace('\n','').split(',') for s in f.readlines()]

    StockHoldings = list(XXXXX.getStockHoldings(SessionID, cookie_jar)['code'])
    tmp = '0'
    DMALs_3s = [0]
    for i in range(len(logs)):
        if not(logs[i][0] in StockHoldings):
            continue
        if logs[i][5].replace('-', '') != until_date:
            continue
        if logs[i][0] != tmp or i == len(logs)-1:
            if i == len(logs)-1:
                DMALs_3s[0] += 1
                DMALs_3s.append(logs[i][1].split('--'))
            if tmp != '0':
                print('売り注文。 ' + str(logs[i][5].replace('-', '')))
                print('銘柄コード:' + str(tmp))
                print('短期-中期-長期移動平行線:' + str(DMALs_3s))
                print('株価:' + str(logs[i][7]))
                print('利益:' + str(logs[i][8]))
                print('')
            tmp = logs[i][0]
            DMALs_3s = [0]
        DMALs_3s[0] += 1
        DMALs_3s.append(logs[i][1].split('--'))

 

ブログランキング・にほんブログ村へ
にほんブログ村