基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成15年 春期 基本情報技術者 午後 問11
問11   COBOL

 次の COBOL プログラムの説明及びプログラムを読んで,設問に答えよ。

 過去の株価情報を使い,次に説明する規則に従って株式の売買を シミュレートするプログラムである。 ある銘柄の株式の日々の株価を格納したファイルを読み込み, この規則による売買の記録を出力ファイルに書き出し, 最後に一連の売買の結果である損益を表示する。

〔プログラムの説明〕

(1) 株式の売買規則は次のとおりである。

@ 25 日移動平均線と 75 日移動平均線を使う。 ここで,n 日移動平均線とは,時間軸を移動しながら過去 n 取引日間の株価の平均値を 求めた折れ線グラフである。 取引日 t の株価をPt とすると, 取引日tにおける n 日移動平均 MAt(n) は,次の式で求める。

A 移動平均の算出には,株価の終値(その日の最後に売買された値段)を使う。

B 25 日移動平均線が 75 日移動平均線の下から上に交差したら,翌取引日に株式を買う。 すなわち,s < t のとき,いったん MAs(25) < MAs(75)になってから, 初めて MAt(25) > MAt(75) に変わったら,取引日t+1 に株式を買う。

C 25 日移動平均線が 75 日移動平均線の上から下に交差したら,翌取引日に株式を売る。 すなわち,s < t のとき,いったん MAs(25) > MAs(75) になってから, 初めて MAt(25) < MAt(75) に変わったら, 取引日 t+1 に株式を売る。 ただし,既に買った株式がなければ,売ることはできない。

D 株式の売買は,取引日 t の高値(売買された最も高い値段)と 安値(売買された最も低い値段)の平均値で売買できるものとする。

E 売買に関するその他の費用は,一切発生しないものとする。

F 株式の売買は,1回あたり1株とする。

(2) 入力ファイル( INFILE )は,ある銘柄の株式について, 75 日分以上の取引日の株価データが時系列に格納された順ファイルである。 レコード様式は,次のとおりである。

日付
8 けた
始値
9 けた
終値
9 けた
高値
9 けた
安値
9 けた

(3) 出力ファイル(OUTFILE)は,入力ファイルの株価データに, (1)の売買規則を適用したときの売買の記録を格納する順ファイルである。 レコード様式は,次のとおりである。

日付
8 けた
フラグ
1 けた
売買価格
10 けた

@ 出力ファイル(OUTFILE)に出力するレコードには, 売買することを決定した日(取引日 t )の日付,フラグ及び売買価格を格納する。

A フラグには,“売り”のとき“S”,“買い”のとき“B”を格納する。

B 売買価格には,小数点以下1けたで値を格納する。

(4) 一連の売買による損益は,小数点以下1けたの符号付き数値で表示する。

〔プログラム〕

DATA DIVISION.
FILE SECTION.
FD  INFILE.
01  I-MARKET-PRICE-REC.
  05  I-YYYYMMDD-MARKET    PIC X(8).
  05  I-OPENING-PRICE      PIC 9(9).
  05  I-CLOSING-PRICE      PIC 9(9).
  05  I-HIGHEST-PRICE      PIC 9(9).
  05  I-LOWEST-PRICE       PIC 9(9).
FD  OUTFILE.
01  O-EXCHANGE-REC.
  05  O-YYYYMMDD-EXCHANGE  PIC X(8).
  05  O-ACTION             PIC X.
  05  O-PRICE              PIC 9(9)V9.
WORKING-STORAGE SECTION.
01  SERIES-SIZE       PIC 9(4) VALUE 100.
01  RANGE-SHORT       PIC 9(4) VALUE 25.
01  RANGE-LONG        PIC 9(4) VALUE 75.
01  W-MARKET-PRICE-REC.
  05  W-YYYYMMDD-MARKET    PIC X(8).
  05  W-OPENING-PRICE      PIC 9(9).
  05  W-CLOSING-PRICE      PIC 9(9).
  05  W-HIGHEST-PRICE      PIC 9(9).
  05  W-LOWEST-PRICE       PIC 9(9).
01  MARKET-PRICE-SERIES.
  05  TBL-MARKET-PRICE-REC OCCURS 100.
    10  TBL-YYYYMMDD-MARKET     PIC X(8).
    10  TBL-OPENING-PRICE       PIC 9(9).
    10  TBL-CLOSING-PRICE       PIC 9(9).
    10  TBL-HIGHEST-PRICE       PIC 9(9).
    10  TBL-LOWEST-PRICE        PIC 9(9).
01  SERIES-TOP        PIC 9(4).
01  TAIL-LONG         PIC 9(4).
01  TAIL-SHORT        PIC 9(4).
01  SUM-SHORT         PIC 9(12).
01  SUM-LONG          PIC 9(12).
01  MA-SHORT          PIC 9(9)V9.
01  MA-LONG           PIC 9(9)V9.
01  MA-COMPARE-CURRENT   PIC X.
  88  LONG-LT-SHORT-CUR     VALUE "S".
  88  SHORT-LT-LONG-CUR     VALUE "L".
  88  SHORT-EQ-LONG-CUR     VALUE "E".
01  MA-COMPARE-PREVIOUS  PIC X.
  88  LONG-LT-SHORT-PRE     VALUE "S".
  88  SHORT-LT-LONG-PRE     VALUE "L".
  88  SHORT-EQ-LONG-PRE     VALUE "E".
01  INFILE-EOF-FLG       PIC X.
  88  INFILE-EOF            VALUE "Y".
  88  INFILE-NOT-EOF        VALUE "N".
01  TRADING-PRICE     PIC 9(9)V9.
01  REVENUE           PIC S9(9)V9.
01  REVENUE-ED        PIC +++++++++9.9.
01  INDX              PIC 9(9).
01  TRADING-ACTION    PIC S9.
  88  FLG-NO-TRADE      VALUE  0.
  88  FLG-SELL          VALUE  1.
  88  FLG-BUY           VALUE -1.
01  STOCK-HOLDING     PIC X.
  88  HAS-STOCK         VALUE "Y".
  88  HAS-NO-STOCK      VALUE "N".
PROCEDURE DIVISION.
MAIN-PARAGRAPH.
    OPEN INPUT INFILE  OUTPUT OUTFILE.
    PERFORM INIT-MOVING-AVERAGE.
    IF MA-SHORT = MA-LONG THEN
       SET SHORT-EQ-LONG-CUR TO TRUE
    END-IF.
    PERFORM SET-CURRENT-MA-COMPARISON.
    MOVE ZERO TO REVENUE.
    SET HAS-NO-STOCK TO TRUE.
    SET FLG-NO-TRADE TO TRUE.
    SET INFILE-NOT-EOF TO TRUE.
    PERFORM UNTIL INFILE-EOF
       IF FLG-BUY OR FLG-SELL THEN
          PERFORM TRADE-STOCK-AND-MAKE-RECORD
       END-IF
       READ INFILE INTO W-MARKET-PRICE-REC
          AT END
             SET INFILE-EOF TO TRUE
          NOT AT END
             PERFORM CALC-NEXT-MOVING-AVERAGE
             PERFORM DECIDE-TRADING
       END-READ
    END-PERFORM.
    MOVE REVENUE TO REVENUE-ED.
    DISPLAY "Total Revenue: " REVENUE-ED.
    CLOSE INFILE OUTFILE.
    STOP RUN.
INIT-MOVING-AVERAGE.
    PERFORM VARYING SERIES-TOP FROM 1 BY 1 
            UNTIL RANGE-LONG < SERIES-TOP
       READ INFILE INTO TBL-MARKET-PRICE-REC(SERIES-TOP)
    END-PERFORM.
    COMPUTE TAIL-SHORT = SERIES-TOP - RANGE-SHORT.
    COMPUTE TAIL-LONG  = SERIES-TOP - RANGE-LONG.
    SUBTRACT 1 FROM SERIES-TOP.
    MOVE ZERO TO SUM-SHORT.
    PERFORM VARYING INDX 
       ADD TBL-CLOSING-PRICE(INDX) TO SUM-SHORT
    END-PERFORM.
    MOVE SUM-SHORT TO SUM-LONG.
    PERFORM VARYING INDX 
       ADD TBL-CLOSING-PRICE(INDX) TO SUM-LONG
    END-PERFORM.
    COMPUTE MA-SHORT ROUNDED = SUM-SHORT / RANGE-SHORT.
    COMPUTE MA-LONG  ROUNDED = SUM-LONG  / RANGE-LONG.
SET-CURRENT-MA-COMPARISON.
    EVALUATE TRUE
       WHEN MA-SHORT = MA-LONG
          CONTINUE
       WHEN MA-SHORT < MA-LONG
          SET SHORT-LT-LONG-CUR TO TRUE
       WHEN MA-LONG < MA-SHORT
          SET LONG-LT-SHORT-CUR TO TRUE
    END-EVALUATE.
TRADE-STOCK-AND-MAKE-RECORD.
    EVALUATE TRUE
       WHEN FLG-BUY
          MOVE "B" TO O-ACTION
          SET HAS-STOCK TO TRUE
       WHEN FLG-SELL AND  
          MOVE "S" TO O-ACTION
          SET HAS-NO-STOCK TO TRUE
    END-EVALUATE.
    IF O-ACTION = "B" OR O-ACTION = "S"
    THEN
       COMPUTE TRADING-PRICE ROUNDED 
          = (  TBL-HIGHEST-PRICE(SERIES-TOP)
             + TBL-LOWEST-PRICE(SERIES-TOP) ) / 2
       COMPUTE REVENUE = REVENUE + TRADING-PRICE * 
       MOVE TBL-YYYYMMDD-MARKET(SERIES-TOP) TO
                                O-YYYYMMDD-EXCHANGE
       MOVE TRADING-PRICE TO O-PRICE
       WRITE O-EXCHANGE-REC
     END-IF.
CALC-NEXT-MOVING-AVERAGE.
    ADD W-CLOSING-PRICE TO SUM-SHORT SUM-LONG.
    SUBTRACT TBL-CLOSING-PRICE(TAIL-SHORT) FROM SUM-SHORT.
    SUBTRACT TBL-CLOSING-PRICE(TAIL-LONG)  FROM SUM-LONG.
    COMPUTE MA-SHORT ROUNDED = SUM-SHORT / RANGE-SHORT.
    COMPUTE MA-LONG  ROUNDED = SUM-LONG  / RANGE-LONG.
    ADD 1 TO SERIES-TOP TAIL-SHORT TAIL-LONG.
    EVALUATE TRUE
       WHEN SERIES-SIZE < SERIES-TOP
          MOVE 1 TO SERIES-TOP
       WHEN SERIES-SIZE < TAIL-SHORT
          MOVE 1 TO TAIL-SHORT
       WHEN SERIES-SIZE < TAIL-LONG
          MOVE 1 TO TAIL-LONG
    END-EVALUATE.
    MOVE W-MARKET-PRICE-REC TO TBL-MARKET-PRICE-REC(SERIES-TOP).
DECIDE-TRADING.
    MOVE MA-COMPARE-CURRENT TO MA-COMPARE-PREVIOUS.
    PERFORM SET-CURRENT-MA-COMPARISON.
    SET FLG-NO-TRADE TO TRUE.
    EVALUATE TRUE
       WHEN  AND LONG-LT-SHORT-CUR
          SET FLG-BUY  TO TRUE
       WHEN LONG-LT-SHORT-PRE AND SHORT-LT-LONG-CUR
          SET FLG-SELL TO TRUE
    END-EVALUATE.

基本情報技術者試験


設問  プログラム中の に入れる正しい答えを, 解答群の中から選べ。

a,b に関する解答群

ア FROM 1 BY 1 UNTIL SERIES-SIZE < INDX

イ FROM SERIES-TOP - 1 BY -1 UNTIL INDX < TAIL-SHORT

ウ FROM SERIES-TOP BY -1 UNTIL INDX <= TAIL-SHORT

エ FROM TAIL-LONG BY 1 UNTIL TAIL-SHORT <= INDX

オ FROM TAIL-SHORT BY 1 UNTIL SERIES-TOP < INDX

c 〜 e に関する解答群

ア FLG-BUY         イ FLG-SELL

ウ HAS-STOCK        エ LONG-LT-SHORT-CUR

オ MA-COMPARE-CURRENT    カ SHORT-LT-LONG-PRE

キ TRADING-ACTION

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]