LoginSignup
6
6

More than 5 years have passed since last update.

オリジナルポートフォリオの作成

Last updated at Posted at 2015-02-12

オリジナルポートフォリオの作成

メモはkobito.app

使う技術
*プログラム言語ruby
*webサービス構築sinatra
*データベース管理sqlite3
*データベースをrubyのオブジェクト化activerecord

まずsinatraから攻める
前回インストール済み

Markdown: これができればwebサービスは作れる-sinatra

構造
k-portfolio
┣main.rb
┣import.sql
┣stock.db
┗views
_┣layout.erb
_
┗index.erb

┗┣は「けいせん」で変換

layout.erb
<!DOCTYPE html>
<html lang="ja">
<head>
    <mata charset="utf-8">
    <title>k-portfolio</title>
</head>
<body>
    <%= yield %>
</body>
</html>

stock.dbの作成、import.sqlの読み込み

import.sql
drop table if exists posts;
create table posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
Mac-no-MacBook-Pro:k-portfolio Mac$ sqlite3 stock.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .read import.sql

sqlite> .shema
Error: unknown command or invalid arguments:  "shema". Enter ".help" for help
sqlite> .shcema
Error: unknown command or invalid arguments:  "shcema". Enter ".help" for help
sqlite> .schema
CREATE TABLE posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
sqlite> 

main.rbにsinatra,active_record読み込み
stock.dbと関連付け,Postクラスの作成

main.rb
require "sinatra"
require "sinatra/reloader"
require 'active_record'

ActiveRecord::Base.establish_connection(
    "adapter" => "sqlite3",
    "database" => "./stock.db"
)

class Post < ActiveRecord::Base
end

get "/" do 
    @title = "index"
    @content = "this is index"
    @posts = Post.order("id").all

    erb :index
end

post "/new" do 
    Post.create({:body => params[:body]})
    redirect '/'    
    erb :index
end
index.erb
<h1><%= @title %></h1>
<%= @content %>
    <h2>Add new</h2>
    <form method="post" action="/new">
        <input type= "text" name="body"><input type= "submit" value="post!">
    </form>
    <br>

    <table border="1">
        <tr>
            <td>id</td><td>comment</td><td>created_at</td>
        </tr>
            <% @posts.each do |post| %>
        <tr>
            <td><%= post.id %></td><td><%= post.body %></td><td><%= post.created_at %></td>
        </tr>
            <% end %>
    </table>    

スクリーンショット 2015-02-14 02.24.16.png

これでフォームに入力した文字はcomment欄に表示され、その日時も記録される。出力はテーブル表。

ここからどうするか

株ポートフォリオに必要な変数名の用意

-コード
-市場
-名称
-損益
-当時購入価格
-現在取引値
-単元株数
-前日比
-出来高

シンプルなものを作るために変数名を絞る

やりたいこと

簡単に言えばYahooポートフォリオを自作する

1.気になる銘柄を選定後、その銘柄をtextファイルに保存。
textファイルから読み出し以下のことをする。

a.コード(code)
textファイルに保存してあるので、そこからインポートしDBのcodeに追加
b.名称(name)
codeから名称を検索しDBのnameに追加
c.当時購入価格(price)(終値*最低単元株数)
codeから終値、最低単元株数を検索し、計算。計算結果をDBのpriceに追加

2.または気になる銘柄を選定後そのままDB(stock_日付.db)に追加する。

シンプルに考えて

1.引け後銘柄選定
2.日付ごとにcodeだけ保存(.db OR .text)
3.終値*最低単元株数を計算し購入価格を算出
4.上書き保存
┗とりあえずここまでやってみる
5.最新の株価と照らし合わせ日付ごとの損益を出す

引け後銘柄選定

自作chart.rbより選択
今はhtmlファイルとして保存(XXXX-XX-XX.text)

<% if focus != nil
    File.open("./stockfile/#{today}.html","a") do |file|
        file.puts focus
    end
end %>

これをdbファイルに保存したい(XXXX-XX-XX.db)がよくわからないのでtextファイルとして保存しdbファイルから読み込むようにする

<% if focus != nil
    File.open("./stockfile/#{today}.text","a") do |file|
        file.puts focus
    end
end %>

2.日付ごとにcodeだけ保存(.db OR .text)

dbファイルからtextファイルを読み込む

まずk-portfolio下に新規dbを作成。stock.db

:string     #=> 文字列
:text       #=> string読みも長い文字列
:integer    #=> 整数
:float      #=> 少数点を含む数
:decimal    #=> floatよみも精度の高い少数点を含む数
:datetime   #=> 日時
:timestamp  #=> より細かい日時
:time       #=> 日付
:date       #=> 日付 
:binary   #=> バイナリデータ
:boolean    #=> Boolean型(true or false)

参考http://morizyun.github.io/blog/active-record-rails-beginner-tutorial/

外部データからデータを取り込む - ドットインストール#17

SQL文

import.sql
drop table if exists posts;
create table posts( 
    codes integer
);
Mac>sqlite3 stock.db
sqlite> .read import.sql

sqlite> .import ./2015-01-23.text posts
sqlite> select * from posts
   ...> ;
1883
1944
2002
2193
4114
4272
6517
9008
9021
9375
9739

stock.dbにコードが記録された

3.終値*最低単元株数を計算し購入価格を算出

-stock.dbからコードを1つずつ抽出
-それをyahoofinanceで検索し、正規表現でparse
時間がかかる、サーバーに負担がかかる

-銘柄,名称のDBを作っておきそこから反映
DB構築の最初だけ時間がかかる、新しい会社の反映、更新が面倒

終値データ取得方針
-yahoofinanceから

最低単元株数データ取得方針
o-yahoofinenceから
x-100,1000から選択できるようにする

結局yahoofinenceから取らなければいけないから
名称、終値、最低単元株数は同じようにスクレイピングする
スクレイピングしたのをtext→db保存になる

でもrubyから直接dbに保存することはできないのか

「db 保存 ruby」「ruby 保存 sqlite3」で検索してみた

# 仮データを入れてみる
Stat.create(
            :update_id => '1234556',
            :name => 'zanmai',
            :text => '肉が食べたい'
            )

引用http://d.hatena.ne.jp/shokai/20080308/1205002736

なるほどchart1.rbからaciverecordをつかって

の出力先にPost.createをすればいい
ってことはchart1.rbをsinatraで作り変えなければいけない。
いつかはしたほうがいいと思っていたが...

それをまずやって、保存先をstock.dbにする!
そうすればtextファイルを経由しなくていい!
次に続く

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6